1 #include "monitor/monitor.h" 2 3 #include <stdarg.h> 4 #include "hw/hw.h" 5 6 struct Monitor { 7 CharDriverState *chr; 8 int mux_out; 9 // int reset_seen; 10 int flags; 11 // int suspend_cnt; 12 uint8_t outbuf[1024]; 13 int outbuf_index; 14 // ReadLineState *rs; 15 // CPUOldState *mon_cpu; 16 // BlockDriverCompletionFunc *password_completion_cb; 17 // void *password_opaque; 18 QLIST_ENTRY(Monitor) entry; 19 //int has_quit; 20 #ifdef CONFIG_ANDROID 21 void* fake_opaque; 22 MonitorFakeFunc fake_func; 23 int64_t fake_count; 24 25 #endif 26 }; 27 28 // Minimalistic / fake implementation of the QEMU Monitor. 29 30 Monitor* cur_mon; 31 32 /* Return non-zero iff we have a current monitor, and it is in QMP mode. */ 33 int monitor_cur_is_qmp(void) 34 { 35 return 0; 36 } 37 38 Monitor* 39 monitor_fake_new(void* opaque, MonitorFakeFunc cb) 40 { 41 Monitor* mon; 42 43 assert(cb != NULL); 44 mon = g_malloc0(sizeof(*mon)); 45 mon->fake_opaque = opaque; 46 mon->fake_func = cb; 47 mon->fake_count = 0; 48 49 return mon; 50 } 51 52 int 53 monitor_fake_get_bytes(Monitor* mon) 54 { 55 assert(mon->fake_func != NULL); 56 return mon->fake_count; 57 } 58 59 void 60 monitor_fake_free(Monitor* mon) 61 { 62 assert(mon->fake_func != NULL); 63 free(mon); 64 } 65 66 /* This replaces the definition in monitor.c which is in a 67 * #ifndef CONFIG_ANDROID .. #endif block. 68 */ 69 void monitor_flush(Monitor *mon) 70 { 71 if (!mon) 72 return; 73 74 if (mon->fake_func != NULL) { 75 mon->fake_func(mon->fake_opaque, (void*)mon->outbuf, mon->outbuf_index); 76 mon->outbuf_index = 0; 77 mon->fake_count += mon->outbuf_index; 78 } else if (!mon->mux_out) { 79 qemu_chr_write(mon->chr, mon->outbuf, mon->outbuf_index); 80 mon->outbuf_index = 0; 81 } 82 } 83 84 /* flush at every end of line or if the buffer is full */ 85 static void monitor_puts(Monitor *mon, const char *str) 86 { 87 char c; 88 89 if (!mon) 90 return; 91 92 for(;;) { 93 c = *str++; 94 if (c == '\0') 95 break; 96 if (c == '\n') 97 mon->outbuf[mon->outbuf_index++] = '\r'; 98 mon->outbuf[mon->outbuf_index++] = c; 99 if (mon->outbuf_index >= (sizeof(mon->outbuf) - 1) 100 || c == '\n') 101 monitor_flush(mon); 102 } 103 } 104 105 void monitor_vprintf(Monitor* mon, const char* fmt, va_list args) { 106 char buf[4096]; 107 vsnprintf(buf, sizeof(buf), fmt, args); 108 monitor_puts(mon, buf); 109 } 110 111 void monitor_printf(Monitor *mon, const char *fmt, ...) 112 { 113 va_list ap; 114 va_start(ap, fmt); 115 monitor_vprintf(mon, fmt, ap); 116 va_end(ap); 117 } 118 119 void monitor_print_filename(Monitor *mon, const char *filename) 120 { 121 int i; 122 123 for (i = 0; filename[i]; i++) { 124 switch (filename[i]) { 125 case ' ': 126 case '"': 127 case '\\': 128 monitor_printf(mon, "\\%c", filename[i]); 129 break; 130 case '\t': 131 monitor_printf(mon, "\\t"); 132 break; 133 case '\r': 134 monitor_printf(mon, "\\r"); 135 break; 136 case '\n': 137 monitor_printf(mon, "\\n"); 138 break; 139 default: 140 monitor_printf(mon, "%c", filename[i]); 141 break; 142 } 143 } 144 } 145 146 void monitor_protocol_event(MonitorEvent event, QObject *data) 147 { 148 /* XXX: TODO */ 149 } 150 151 void monitor_set_error(Monitor *mon, QError *qerror) 152 { 153 QDECREF(qerror); 154 } 155 156 void monitor_init(CharDriverState* cs, int flags) { 157 // Nothing. 158 } 159 160 /* boot_set handler */ 161 static QEMUBootSetHandler *qemu_boot_set_handler = NULL; 162 static void *boot_opaque; 163 164 void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque) 165 { 166 qemu_boot_set_handler = func; 167 boot_opaque = opaque; 168 } 169