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 /* returns 1 iff we're running in the emulator */ 24 extern int qemu_check(void); 25 26 /* a structure used to hold enough state to connect to a given 27 * QEMU communication channel, either through a qemud socket or 28 * a serial port. 29 * 30 * initialize the structure by zero-ing it out 31 */ 32 typedef struct { 33 char is_inited; 34 char is_available; 35 char is_qemud; 36 char is_qemud_old; 37 char is_tty; 38 int fd; 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 */ 51 extern 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 */ 63 extern int qemu_command_format( char* buffer, 64 int buffer_size, 65 const char* format, 66 ... ); 67 68 /* directly sends a command through the 'hw-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 */ 73 extern int qemu_control_command( const char* fmt, ... ); 74 75 /* sends a question to the hw-control channel, then receive an answer in 76 * a user-allocated buffer. returns the length of the answer, or -1 77 * in case of error. 78 * 79 * 'question' *must* have been formatted through qemu_command_format 80 */ 81 extern int qemu_control_query( const char* question, int questionlen, 82 char* answer, int answersize ); 83 84 /* use QEMU_FALLBACK(call) to call a QEMU-specific callback */ 85 /* use QEMU_FALLBACK_VOID(call) if the function returns void */ 86 # define QEMU_FALLBACK(x) \ 87 do { \ 88 if (qemu_check()) \ 89 return qemu_ ## x ; \ 90 } while (0) 91 # define QEMU_FALLBACK_VOID(x) \ 92 do { \ 93 if (qemu_check()) { \ 94 qemu_ ## x ; \ 95 return; \ 96 } \ 97 } while (0) 98 99 #ifdef __cplusplus 100 } 101 #endif 102 103 #endif /* _libs_hardware_qemu_h */ 104