blob: 5fcbfa79662fbd555174885cf0142a887a858585 [file] [log] [blame]
The Android Open Source Projectcc490162009-03-03 19:32:14 -08001/*
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
20extern "C" {
21#endif
22
23#ifdef QEMU_HARDWARE
24
25/* returns 1 iff we're running in the emulator */
26extern 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 */
34typedef struct {
35 char is_inited;
36 char is_available;
37 char is_qemud;
38 char is_tty;
39 char device[32];
40} QemuChannel;
41
42/* try to open a qemu communication channel.
43 * returns a file descriptor on success, or -1 in case of
44 * error.
45 *
46 * 'channel' must be a QemuChannel structure that is empty
47 * on the first call. You can call this function several
48 * time to re-open the channel using the same 'channel'
49 * object to speed things a bit.
50 */
51extern int qemu_channel_open( QemuChannel* channel,
52 const char* name,
53 int mode );
54
55/* create a command made of a 4-hexchar prefix followed
56 * by the content. the prefix contains the content's length
57 * in hexadecimal coding.
58 *
59 * 'buffer' must be at last 6 bytes
60 * returns -1 in case of overflow, or the command's total length
61 * otherwise (i.e. content length + 4)
62 */
63extern int qemu_command_format( char* buffer,
64 int buffer_size,
65 const char* format,
66 ... );
67
68/* directly sends a command through the 'control' channel.
69 * this will open the channel, send the formatted command, then
70 * close the channel automatically.
71 * returns 0 on success, or -1 on error.
72 */
73extern int qemu_control_command( const char* fmt, ... );
74
75/* sends a question to the control channel, then receive an answer in
76 * a user-allocated buffer. returns the lenght of the answer, or -1
77 * in case of error.
78 *
79 * 'question' *must* have been formatted through qemu_command_format
80 */
81extern int qemu_control_query( const char* question, int questionlen,
82 char* answer, int answersize );
83
84#endif /* QEMU_HARDWARE */
85
86/* use QEMU_FALLBACK(call) to call a QEMU-specific callback */
87/* use QEMU_FALLBACK_VOID(call) if the function returns void */
88#ifdef QEMU_HARDWARE
89# define QEMU_FALLBACK(x) \
90 do { \
91 if (qemu_check()) \
92 return qemu_ ## x ; \
93 } while (0)
94# define QEMU_FALLBACK_VOID(x) \
95 do { \
96 if (qemu_check()) { \
97 qemu_ ## x ; \
98 return; \
99 } \
100 } while (0)
101#else
102# define QEMU_FALLBACK(x) ((void)0)
103# define QEMU_FALLBACK_VOID(x) ((void)0)
104#endif
105
106#ifdef __cplusplus
107}
108#endif
109
110#endif /* _libs_hardware_qemu_h */