| The Android Open Source Project | 51704be | 2008-12-17 18:05:50 -0800 | [diff] [blame] | 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_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 | */ | 
|  | 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 '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 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 | */ | 
|  | 81 | extern 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 */ |