• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #ifndef _libs_hardware_qemu_h
17 #define _libs_hardware_qemu_h
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 #ifdef QEMU_HARDWARE
24 
25 /* returns 1 iff we're running in the emulator */
26 extern int  qemu_check(void);
27 
28 /* a structure used to hold enough state to connect to a given
29  * QEMU communication channel, either through a qemud socket or
30  * a serial port.
31  *
32  * initialize the structure by zero-ing it out
33  */
34 typedef struct {
35     char   is_inited;
36     char   is_available;
37     char   is_qemud;
38     char   is_qemud_old;
39     char   is_tty;
40     int    fd;
41     char   device[32];
42 } QemuChannel;
43 
44 /* try to open a qemu communication channel.
45  * returns a file descriptor on success, or -1 in case of
46  * error.
47  *
48  * 'channel' must be a QemuChannel structure that is empty
49  * on the first call. You can call this function several
50  * time to re-open the channel using the same 'channel'
51  * object to speed things a bit.
52  */
53 extern int  qemu_channel_open( QemuChannel*  channel,
54                                const char*   name,
55                                int           mode );
56 
57 /* create a command made of a 4-hexchar prefix followed
58  * by the content. the prefix contains the content's length
59  * in hexadecimal coding.
60  *
61  * 'buffer' must be at last 6 bytes
62  * returns -1 in case of overflow, or the command's total length
63  * otherwise (i.e. content length + 4)
64  */
65 extern int  qemu_command_format( char*        buffer,
66                                  int          buffer_size,
67                                  const char*  format,
68                                  ... );
69 
70 /* directly sends a command through the 'hw-control' channel.
71  * this will open the channel, send the formatted command, then
72  * close the channel automatically.
73  * returns 0 on success, or -1 on error.
74  */
75 extern int  qemu_control_command( const char*  fmt, ... );
76 
77 /* sends a question to the hw-control channel, then receive an answer in
78  * a user-allocated buffer. returns the length of the answer, or -1
79  * in case of error.
80  *
81  * 'question' *must* have been formatted through qemu_command_format
82  */
83 extern int  qemu_control_query( const char*  question, int  questionlen,
84                                 char*        answer,   int  answersize );
85 
86 #endif /* QEMU_HARDWARE */
87 
88 /* use QEMU_FALLBACK(call) to call a QEMU-specific callback  */
89 /* use QEMU_FALLBACK_VOID(call) if the function returns void */
90 #ifdef QEMU_HARDWARE
91 #  define  QEMU_FALLBACK(x)  \
92     do { \
93         if (qemu_check()) \
94             return qemu_ ## x ; \
95     } while (0)
96 #  define  QEMU_FALLBACK_VOID(x)  \
97     do { \
98         if (qemu_check()) { \
99             qemu_ ## x ; \
100             return; \
101         } \
102     } while (0)
103 #else
104 #  define  QEMU_FALLBACK(x)       ((void)0)
105 #  define  QEMU_FALLBACK_VOID(x)  ((void)0)
106 #endif
107 
108 #ifdef __cplusplus
109 }
110 #endif
111 
112 #endif /* _libs_hardware_qemu_h */
113