]> Git Repo - qemu.git/blob - monitor.c
cpu: Move numa_node field to CPUState
[qemu.git] / monitor.c
1 /*
2  * QEMU monitor
3  *
4  * Copyright (c) 2003-2004 Fabrice Bellard
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 #include <dirent.h>
25 #include "hw/hw.h"
26 #include "hw/qdev.h"
27 #include "hw/usb.h"
28 #include "hw/pcmcia.h"
29 #include "hw/pc.h"
30 #include "hw/pci/pci.h"
31 #include "hw/watchdog.h"
32 #include "hw/loader.h"
33 #include "exec/gdbstub.h"
34 #include "net/net.h"
35 #include "net/slirp.h"
36 #include "char/char.h"
37 #include "ui/qemu-spice.h"
38 #include "sysemu/sysemu.h"
39 #include "monitor/monitor.h"
40 #include "monitor/readline.h"
41 #include "ui/console.h"
42 #include "sysemu/blockdev.h"
43 #include "audio/audio.h"
44 #include "disas/disas.h"
45 #include "sysemu/balloon.h"
46 #include "qemu/timer.h"
47 #include "migration/migration.h"
48 #include "sysemu/kvm.h"
49 #include "qemu/acl.h"
50 #include "qapi/qmp/qint.h"
51 #include "qapi/qmp/qfloat.h"
52 #include "qapi/qmp/qlist.h"
53 #include "qapi/qmp/qbool.h"
54 #include "qapi/qmp/qstring.h"
55 #include "qapi/qmp/qjson.h"
56 #include "qapi/qmp/json-streamer.h"
57 #include "qapi/qmp/json-parser.h"
58 #include "qemu/osdep.h"
59 #include "cpu.h"
60 #include "trace.h"
61 #include "trace/control.h"
62 #ifdef CONFIG_TRACE_SIMPLE
63 #include "trace/simple.h"
64 #endif
65 #include "ui/qemu-spice.h"
66 #include "exec/memory.h"
67 #include "qmp-commands.h"
68 #include "hmp.h"
69 #include "qemu/thread.h"
70
71 /* for pic/irq_info */
72 #if defined(TARGET_SPARC)
73 #include "hw/sun4m.h"
74 #endif
75 #include "hw/lm32_pic.h"
76
77 //#define DEBUG
78 //#define DEBUG_COMPLETION
79
80 /*
81  * Supported types:
82  *
83  * 'F'          filename
84  * 'B'          block device name
85  * 's'          string (accept optional quote)
86  * 'O'          option string of the form NAME=VALUE,...
87  *              parsed according to QemuOptsList given by its name
88  *              Example: 'device:O' uses qemu_device_opts.
89  *              Restriction: only lists with empty desc are supported
90  *              TODO lift the restriction
91  * 'i'          32 bit integer
92  * 'l'          target long (32 or 64 bit)
93  * 'M'          Non-negative target long (32 or 64 bit), in user mode the
94  *              value is multiplied by 2^20 (think Mebibyte)
95  * 'o'          octets (aka bytes)
96  *              user mode accepts an optional T, t, G, g, M, m, K, k
97  *              suffix, which multiplies the value by 2^40 for
98  *              suffixes T and t, 2^30 for suffixes G and g, 2^20 for
99  *              M and m, 2^10 for K and k
100  * 'T'          double
101  *              user mode accepts an optional ms, us, ns suffix,
102  *              which divides the value by 1e3, 1e6, 1e9, respectively
103  * '/'          optional gdb-like print format (like "/10x")
104  *
105  * '?'          optional type (for all types, except '/')
106  * '.'          other form of optional type (for 'i' and 'l')
107  * 'b'          boolean
108  *              user mode accepts "on" or "off"
109  * '-'          optional parameter (eg. '-f')
110  *
111  */
112
113 typedef struct MonitorCompletionData MonitorCompletionData;
114 struct MonitorCompletionData {
115     Monitor *mon;
116     void (*user_print)(Monitor *mon, const QObject *data);
117 };
118
119 typedef struct mon_cmd_t {
120     const char *name;
121     const char *args_type;
122     const char *params;
123     const char *help;
124     void (*user_print)(Monitor *mon, const QObject *data);
125     union {
126         void (*info)(Monitor *mon);
127         void (*cmd)(Monitor *mon, const QDict *qdict);
128         int  (*cmd_new)(Monitor *mon, const QDict *params, QObject **ret_data);
129         int  (*cmd_async)(Monitor *mon, const QDict *params,
130                           MonitorCompletion *cb, void *opaque);
131     } mhandler;
132     int flags;
133 } mon_cmd_t;
134
135 /* file descriptors passed via SCM_RIGHTS */
136 typedef struct mon_fd_t mon_fd_t;
137 struct mon_fd_t {
138     char *name;
139     int fd;
140     QLIST_ENTRY(mon_fd_t) next;
141 };
142
143 /* file descriptor associated with a file descriptor set */
144 typedef struct MonFdsetFd MonFdsetFd;
145 struct MonFdsetFd {
146     int fd;
147     bool removed;
148     char *opaque;
149     QLIST_ENTRY(MonFdsetFd) next;
150 };
151
152 /* file descriptor set containing fds passed via SCM_RIGHTS */
153 typedef struct MonFdset MonFdset;
154 struct MonFdset {
155     int64_t id;
156     QLIST_HEAD(, MonFdsetFd) fds;
157     QLIST_HEAD(, MonFdsetFd) dup_fds;
158     QLIST_ENTRY(MonFdset) next;
159 };
160
161 typedef struct MonitorControl {
162     QObject *id;
163     JSONMessageParser parser;
164     int command_mode;
165 } MonitorControl;
166
167 /*
168  * To prevent flooding clients, events can be throttled. The
169  * throttling is calculated globally, rather than per-Monitor
170  * instance.
171  */
172 typedef struct MonitorEventState {
173     MonitorEvent event; /* Event being tracked */
174     int64_t rate;       /* Period over which to throttle. 0 to disable */
175     int64_t last;       /* Time at which event was last emitted */
176     QEMUTimer *timer;   /* Timer for handling delayed events */
177     QObject *data;      /* Event pending delayed dispatch */
178 } MonitorEventState;
179
180 struct Monitor {
181     CharDriverState *chr;
182     int mux_out;
183     int reset_seen;
184     int flags;
185     int suspend_cnt;
186     uint8_t outbuf[1024];
187     int outbuf_index;
188     ReadLineState *rs;
189     MonitorControl *mc;
190     CPUArchState *mon_cpu;
191     BlockDriverCompletionFunc *password_completion_cb;
192     void *password_opaque;
193     QError *error;
194     QLIST_HEAD(,mon_fd_t) fds;
195     QLIST_ENTRY(Monitor) entry;
196 };
197
198 /* QMP checker flags */
199 #define QMP_ACCEPT_UNKNOWNS 1
200
201 static QLIST_HEAD(mon_list, Monitor) mon_list;
202 static QLIST_HEAD(mon_fdsets, MonFdset) mon_fdsets;
203 static int mon_refcount;
204
205 static mon_cmd_t mon_cmds[];
206 static mon_cmd_t info_cmds[];
207
208 static const mon_cmd_t qmp_cmds[];
209
210 Monitor *cur_mon;
211 Monitor *default_mon;
212
213 static void monitor_command_cb(Monitor *mon, const char *cmdline,
214                                void *opaque);
215
216 static inline int qmp_cmd_mode(const Monitor *mon)
217 {
218     return (mon->mc ? mon->mc->command_mode : 0);
219 }
220
221 /* Return true if in control mode, false otherwise */
222 static inline int monitor_ctrl_mode(const Monitor *mon)
223 {
224     return (mon->flags & MONITOR_USE_CONTROL);
225 }
226
227 /* Return non-zero iff we have a current monitor, and it is in QMP mode.  */
228 int monitor_cur_is_qmp(void)
229 {
230     return cur_mon && monitor_ctrl_mode(cur_mon);
231 }
232
233 void monitor_read_command(Monitor *mon, int show_prompt)
234 {
235     if (!mon->rs)
236         return;
237
238     readline_start(mon->rs, "(qemu) ", 0, monitor_command_cb, NULL);
239     if (show_prompt)
240         readline_show_prompt(mon->rs);
241 }
242
243 int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
244                           void *opaque)
245 {
246     if (monitor_ctrl_mode(mon)) {
247         qerror_report(QERR_MISSING_PARAMETER, "password");
248         return -EINVAL;
249     } else if (mon->rs) {
250         readline_start(mon->rs, "Password: ", 1, readline_func, opaque);
251         /* prompt is printed on return from the command handler */
252         return 0;
253     } else {
254         monitor_printf(mon, "terminal does not support password prompting\n");
255         return -ENOTTY;
256     }
257 }
258
259 void monitor_flush(Monitor *mon)
260 {
261     if (mon && mon->outbuf_index != 0 && !mon->mux_out) {
262         qemu_chr_fe_write(mon->chr, mon->outbuf, mon->outbuf_index);
263         mon->outbuf_index = 0;
264     }
265 }
266
267 /* flush at every end of line or if the buffer is full */
268 static void monitor_puts(Monitor *mon, const char *str)
269 {
270     char c;
271
272     for(;;) {
273         assert(mon->outbuf_index < sizeof(mon->outbuf) - 1);
274         c = *str++;
275         if (c == '\0')
276             break;
277         if (c == '\n')
278             mon->outbuf[mon->outbuf_index++] = '\r';
279         mon->outbuf[mon->outbuf_index++] = c;
280         if (mon->outbuf_index >= (sizeof(mon->outbuf) - 1)
281             || c == '\n')
282             monitor_flush(mon);
283     }
284 }
285
286 void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
287 {
288     char buf[4096];
289
290     if (!mon)
291         return;
292
293     if (monitor_ctrl_mode(mon)) {
294         return;
295     }
296
297     vsnprintf(buf, sizeof(buf), fmt, ap);
298     monitor_puts(mon, buf);
299 }
300
301 void monitor_printf(Monitor *mon, const char *fmt, ...)
302 {
303     va_list ap;
304     va_start(ap, fmt);
305     monitor_vprintf(mon, fmt, ap);
306     va_end(ap);
307 }
308
309 void monitor_print_filename(Monitor *mon, const char *filename)
310 {
311     int i;
312
313     for (i = 0; filename[i]; i++) {
314         switch (filename[i]) {
315         case ' ':
316         case '"':
317         case '\\':
318             monitor_printf(mon, "\\%c", filename[i]);
319             break;
320         case '\t':
321             monitor_printf(mon, "\\t");
322             break;
323         case '\r':
324             monitor_printf(mon, "\\r");
325             break;
326         case '\n':
327             monitor_printf(mon, "\\n");
328             break;
329         default:
330             monitor_printf(mon, "%c", filename[i]);
331             break;
332         }
333     }
334 }
335
336 static int GCC_FMT_ATTR(2, 3) monitor_fprintf(FILE *stream,
337                                               const char *fmt, ...)
338 {
339     va_list ap;
340     va_start(ap, fmt);
341     monitor_vprintf((Monitor *)stream, fmt, ap);
342     va_end(ap);
343     return 0;
344 }
345
346 static void monitor_user_noop(Monitor *mon, const QObject *data) { }
347
348 static inline int handler_is_qobject(const mon_cmd_t *cmd)
349 {
350     return cmd->user_print != NULL;
351 }
352
353 static inline bool handler_is_async(const mon_cmd_t *cmd)
354 {
355     return cmd->flags & MONITOR_CMD_ASYNC;
356 }
357
358 static inline int monitor_has_error(const Monitor *mon)
359 {
360     return mon->error != NULL;
361 }
362
363 static void monitor_json_emitter(Monitor *mon, const QObject *data)
364 {
365     QString *json;
366
367     json = mon->flags & MONITOR_USE_PRETTY ? qobject_to_json_pretty(data) :
368                                              qobject_to_json(data);
369     assert(json != NULL);
370
371     qstring_append_chr(json, '\n');
372     monitor_puts(mon, qstring_get_str(json));
373
374     QDECREF(json);
375 }
376
377 static QDict *build_qmp_error_dict(const QError *err)
378 {
379     QObject *obj;
380
381     obj = qobject_from_jsonf("{ 'error': { 'class': %s, 'desc': %p } }",
382                              ErrorClass_lookup[err->err_class],
383                              qerror_human(err));
384
385     return qobject_to_qdict(obj);
386 }
387
388 static void monitor_protocol_emitter(Monitor *mon, QObject *data)
389 {
390     QDict *qmp;
391
392     trace_monitor_protocol_emitter(mon);
393
394     if (!monitor_has_error(mon)) {
395         /* success response */
396         qmp = qdict_new();
397         if (data) {
398             qobject_incref(data);
399             qdict_put_obj(qmp, "return", data);
400         } else {
401             /* return an empty QDict by default */
402             qdict_put(qmp, "return", qdict_new());
403         }
404     } else {
405         /* error response */
406         qmp = build_qmp_error_dict(mon->error);
407         QDECREF(mon->error);
408         mon->error = NULL;
409     }
410
411     if (mon->mc->id) {
412         qdict_put_obj(qmp, "id", mon->mc->id);
413         mon->mc->id = NULL;
414     }
415
416     monitor_json_emitter(mon, QOBJECT(qmp));
417     QDECREF(qmp);
418 }
419
420 static void timestamp_put(QDict *qdict)
421 {
422     int err;
423     QObject *obj;
424     qemu_timeval tv;
425
426     err = qemu_gettimeofday(&tv);
427     if (err < 0)
428         return;
429
430     obj = qobject_from_jsonf("{ 'seconds': %" PRId64 ", "
431                                 "'microseconds': %" PRId64 " }",
432                                 (int64_t) tv.tv_sec, (int64_t) tv.tv_usec);
433     qdict_put_obj(qdict, "timestamp", obj);
434 }
435
436
437 static const char *monitor_event_names[] = {
438     [QEVENT_SHUTDOWN] = "SHUTDOWN",
439     [QEVENT_RESET] = "RESET",
440     [QEVENT_POWERDOWN] = "POWERDOWN",
441     [QEVENT_STOP] = "STOP",
442     [QEVENT_RESUME] = "RESUME",
443     [QEVENT_VNC_CONNECTED] = "VNC_CONNECTED",
444     [QEVENT_VNC_INITIALIZED] = "VNC_INITIALIZED",
445     [QEVENT_VNC_DISCONNECTED] = "VNC_DISCONNECTED",
446     [QEVENT_BLOCK_IO_ERROR] = "BLOCK_IO_ERROR",
447     [QEVENT_RTC_CHANGE] = "RTC_CHANGE",
448     [QEVENT_WATCHDOG] = "WATCHDOG",
449     [QEVENT_SPICE_CONNECTED] = "SPICE_CONNECTED",
450     [QEVENT_SPICE_INITIALIZED] = "SPICE_INITIALIZED",
451     [QEVENT_SPICE_DISCONNECTED] = "SPICE_DISCONNECTED",
452     [QEVENT_BLOCK_JOB_COMPLETED] = "BLOCK_JOB_COMPLETED",
453     [QEVENT_BLOCK_JOB_CANCELLED] = "BLOCK_JOB_CANCELLED",
454     [QEVENT_BLOCK_JOB_ERROR] = "BLOCK_JOB_ERROR",
455     [QEVENT_BLOCK_JOB_READY] = "BLOCK_JOB_READY",
456     [QEVENT_DEVICE_TRAY_MOVED] = "DEVICE_TRAY_MOVED",
457     [QEVENT_SUSPEND] = "SUSPEND",
458     [QEVENT_SUSPEND_DISK] = "SUSPEND_DISK",
459     [QEVENT_WAKEUP] = "WAKEUP",
460     [QEVENT_BALLOON_CHANGE] = "BALLOON_CHANGE",
461     [QEVENT_SPICE_MIGRATE_COMPLETED] = "SPICE_MIGRATE_COMPLETED",
462 };
463 QEMU_BUILD_BUG_ON(ARRAY_SIZE(monitor_event_names) != QEVENT_MAX)
464
465 MonitorEventState monitor_event_state[QEVENT_MAX];
466 QemuMutex monitor_event_state_lock;
467
468 /*
469  * Emits the event to every monitor instance
470  */
471 static void
472 monitor_protocol_event_emit(MonitorEvent event,
473                             QObject *data)
474 {
475     Monitor *mon;
476
477     trace_monitor_protocol_event_emit(event, data);
478     QLIST_FOREACH(mon, &mon_list, entry) {
479         if (monitor_ctrl_mode(mon) && qmp_cmd_mode(mon)) {
480             monitor_json_emitter(mon, data);
481         }
482     }
483 }
484
485
486 /*
487  * Queue a new event for emission to Monitor instances,
488  * applying any rate limiting if required.
489  */
490 static void
491 monitor_protocol_event_queue(MonitorEvent event,
492                              QObject *data)
493 {
494     MonitorEventState *evstate;
495     int64_t now = qemu_get_clock_ns(rt_clock);
496     assert(event < QEVENT_MAX);
497
498     qemu_mutex_lock(&monitor_event_state_lock);
499     evstate = &(monitor_event_state[event]);
500     trace_monitor_protocol_event_queue(event,
501                                        data,
502                                        evstate->rate,
503                                        evstate->last,
504                                        now);
505
506     /* Rate limit of 0 indicates no throttling */
507     if (!evstate->rate) {
508         monitor_protocol_event_emit(event, data);
509         evstate->last = now;
510     } else {
511         int64_t delta = now - evstate->last;
512         if (evstate->data ||
513             delta < evstate->rate) {
514             /* If there's an existing event pending, replace
515              * it with the new event, otherwise schedule a
516              * timer for delayed emission
517              */
518             if (evstate->data) {
519                 qobject_decref(evstate->data);
520             } else {
521                 int64_t then = evstate->last + evstate->rate;
522                 qemu_mod_timer_ns(evstate->timer, then);
523             }
524             evstate->data = data;
525             qobject_incref(evstate->data);
526         } else {
527             monitor_protocol_event_emit(event, data);
528             evstate->last = now;
529         }
530     }
531     qemu_mutex_unlock(&monitor_event_state_lock);
532 }
533
534
535 /*
536  * The callback invoked by QemuTimer when a delayed
537  * event is ready to be emitted
538  */
539 static void monitor_protocol_event_handler(void *opaque)
540 {
541     MonitorEventState *evstate = opaque;
542     int64_t now = qemu_get_clock_ns(rt_clock);
543
544     qemu_mutex_lock(&monitor_event_state_lock);
545
546     trace_monitor_protocol_event_handler(evstate->event,
547                                          evstate->data,
548                                          evstate->last,
549                                          now);
550     if (evstate->data) {
551         monitor_protocol_event_emit(evstate->event, evstate->data);
552         qobject_decref(evstate->data);
553         evstate->data = NULL;
554     }
555     evstate->last = now;
556     qemu_mutex_unlock(&monitor_event_state_lock);
557 }
558
559
560 /*
561  * @event: the event ID to be limited
562  * @rate: the rate limit in milliseconds
563  *
564  * Sets a rate limit on a particular event, so no
565  * more than 1 event will be emitted within @rate
566  * milliseconds
567  */
568 static void
569 monitor_protocol_event_throttle(MonitorEvent event,
570                                 int64_t rate)
571 {
572     MonitorEventState *evstate;
573     assert(event < QEVENT_MAX);
574
575     evstate = &(monitor_event_state[event]);
576
577     trace_monitor_protocol_event_throttle(event, rate);
578     evstate->event = event;
579     evstate->rate = rate * SCALE_MS;
580     evstate->timer = qemu_new_timer(rt_clock,
581                                     SCALE_MS,
582                                     monitor_protocol_event_handler,
583                                     evstate);
584     evstate->last = 0;
585     evstate->data = NULL;
586 }
587
588
589 /* Global, one-time initializer to configure the rate limiting
590  * and initialize state */
591 static void monitor_protocol_event_init(void)
592 {
593     qemu_mutex_init(&monitor_event_state_lock);
594     /* Limit RTC & BALLOON events to 1 per second */
595     monitor_protocol_event_throttle(QEVENT_RTC_CHANGE, 1000);
596     monitor_protocol_event_throttle(QEVENT_BALLOON_CHANGE, 1000);
597     monitor_protocol_event_throttle(QEVENT_WATCHDOG, 1000);
598 }
599
600 /**
601  * monitor_protocol_event(): Generate a Monitor event
602  *
603  * Event-specific data can be emitted through the (optional) 'data' parameter.
604  */
605 void monitor_protocol_event(MonitorEvent event, QObject *data)
606 {
607     QDict *qmp;
608     const char *event_name;
609
610     assert(event < QEVENT_MAX);
611
612     event_name = monitor_event_names[event];
613     assert(event_name != NULL);
614
615     qmp = qdict_new();
616     timestamp_put(qmp);
617     qdict_put(qmp, "event", qstring_from_str(event_name));
618     if (data) {
619         qobject_incref(data);
620         qdict_put_obj(qmp, "data", data);
621     }
622
623     trace_monitor_protocol_event(event, event_name, qmp);
624     monitor_protocol_event_queue(event, QOBJECT(qmp));
625     QDECREF(qmp);
626 }
627
628 static int do_qmp_capabilities(Monitor *mon, const QDict *params,
629                                QObject **ret_data)
630 {
631     /* Will setup QMP capabilities in the future */
632     if (monitor_ctrl_mode(mon)) {
633         mon->mc->command_mode = 1;
634     }
635
636     return 0;
637 }
638
639 static void handle_user_command(Monitor *mon, const char *cmdline);
640
641 char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index,
642                                 int64_t cpu_index, Error **errp)
643 {
644     char *output = NULL;
645     Monitor *old_mon, hmp;
646     CharDriverState mchar;
647
648     memset(&hmp, 0, sizeof(hmp));
649     qemu_chr_init_mem(&mchar);
650     hmp.chr = &mchar;
651
652     old_mon = cur_mon;
653     cur_mon = &hmp;
654
655     if (has_cpu_index) {
656         int ret = monitor_set_cpu(cpu_index);
657         if (ret < 0) {
658             cur_mon = old_mon;
659             error_set(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index",
660                       "a CPU number");
661             goto out;
662         }
663     }
664
665     handle_user_command(&hmp, command_line);
666     cur_mon = old_mon;
667
668     if (qemu_chr_mem_osize(hmp.chr) > 0) {
669         QString *str = qemu_chr_mem_to_qs(hmp.chr);
670         output = g_strdup(qstring_get_str(str));
671         QDECREF(str);
672     } else {
673         output = g_strdup("");
674     }
675
676 out:
677     qemu_chr_close_mem(hmp.chr);
678     return output;
679 }
680
681 static int compare_cmd(const char *name, const char *list)
682 {
683     const char *p, *pstart;
684     int len;
685     len = strlen(name);
686     p = list;
687     for(;;) {
688         pstart = p;
689         p = strchr(p, '|');
690         if (!p)
691             p = pstart + strlen(pstart);
692         if ((p - pstart) == len && !memcmp(pstart, name, len))
693             return 1;
694         if (*p == '\0')
695             break;
696         p++;
697     }
698     return 0;
699 }
700
701 static void help_cmd_dump(Monitor *mon, const mon_cmd_t *cmds,
702                           const char *prefix, const char *name)
703 {
704     const mon_cmd_t *cmd;
705
706     for(cmd = cmds; cmd->name != NULL; cmd++) {
707         if (!name || !strcmp(name, cmd->name))
708             monitor_printf(mon, "%s%s %s -- %s\n", prefix, cmd->name,
709                            cmd->params, cmd->help);
710     }
711 }
712
713 static void help_cmd(Monitor *mon, const char *name)
714 {
715     if (name && !strcmp(name, "info")) {
716         help_cmd_dump(mon, info_cmds, "info ", NULL);
717     } else {
718         help_cmd_dump(mon, mon_cmds, "", name);
719         if (name && !strcmp(name, "log")) {
720             const CPULogItem *item;
721             monitor_printf(mon, "Log items (comma separated):\n");
722             monitor_printf(mon, "%-10s %s\n", "none", "remove all logs");
723             for(item = cpu_log_items; item->mask != 0; item++) {
724                 monitor_printf(mon, "%-10s %s\n", item->name, item->help);
725             }
726         }
727     }
728 }
729
730 static void do_help_cmd(Monitor *mon, const QDict *qdict)
731 {
732     help_cmd(mon, qdict_get_try_str(qdict, "name"));
733 }
734
735 static void do_trace_event_set_state(Monitor *mon, const QDict *qdict)
736 {
737     const char *tp_name = qdict_get_str(qdict, "name");
738     bool new_state = qdict_get_bool(qdict, "option");
739     int ret = trace_event_set_state(tp_name, new_state);
740
741     if (!ret) {
742         monitor_printf(mon, "unknown event name \"%s\"\n", tp_name);
743     }
744 }
745
746 #ifdef CONFIG_TRACE_SIMPLE
747 static void do_trace_file(Monitor *mon, const QDict *qdict)
748 {
749     const char *op = qdict_get_try_str(qdict, "op");
750     const char *arg = qdict_get_try_str(qdict, "arg");
751
752     if (!op) {
753         st_print_trace_file_status((FILE *)mon, &monitor_fprintf);
754     } else if (!strcmp(op, "on")) {
755         st_set_trace_file_enabled(true);
756     } else if (!strcmp(op, "off")) {
757         st_set_trace_file_enabled(false);
758     } else if (!strcmp(op, "flush")) {
759         st_flush_trace_buffer();
760     } else if (!strcmp(op, "set")) {
761         if (arg) {
762             st_set_trace_file(arg);
763         }
764     } else {
765         monitor_printf(mon, "unexpected argument \"%s\"\n", op);
766         help_cmd(mon, "trace-file");
767     }
768 }
769 #endif
770
771 static void user_monitor_complete(void *opaque, QObject *ret_data)
772 {
773     MonitorCompletionData *data = (MonitorCompletionData *)opaque; 
774
775     if (ret_data) {
776         data->user_print(data->mon, ret_data);
777     }
778     monitor_resume(data->mon);
779     g_free(data);
780 }
781
782 static void qmp_monitor_complete(void *opaque, QObject *ret_data)
783 {
784     monitor_protocol_emitter(opaque, ret_data);
785 }
786
787 static int qmp_async_cmd_handler(Monitor *mon, const mon_cmd_t *cmd,
788                                  const QDict *params)
789 {
790     return cmd->mhandler.cmd_async(mon, params, qmp_monitor_complete, mon);
791 }
792
793 static void user_async_cmd_handler(Monitor *mon, const mon_cmd_t *cmd,
794                                    const QDict *params)
795 {
796     int ret;
797
798     MonitorCompletionData *cb_data = g_malloc(sizeof(*cb_data));
799     cb_data->mon = mon;
800     cb_data->user_print = cmd->user_print;
801     monitor_suspend(mon);
802     ret = cmd->mhandler.cmd_async(mon, params,
803                                   user_monitor_complete, cb_data);
804     if (ret < 0) {
805         monitor_resume(mon);
806         g_free(cb_data);
807     }
808 }
809
810 static void do_info(Monitor *mon, const QDict *qdict)
811 {
812     const mon_cmd_t *cmd;
813     const char *item = qdict_get_try_str(qdict, "item");
814
815     if (!item) {
816         goto help;
817     }
818
819     for (cmd = info_cmds; cmd->name != NULL; cmd++) {
820         if (compare_cmd(item, cmd->name))
821             break;
822     }
823
824     if (cmd->name == NULL) {
825         goto help;
826     }
827
828     cmd->mhandler.info(mon);
829     return;
830
831 help:
832     help_cmd(mon, "info");
833 }
834
835 CommandInfoList *qmp_query_commands(Error **errp)
836 {
837     CommandInfoList *info, *cmd_list = NULL;
838     const mon_cmd_t *cmd;
839
840     for (cmd = qmp_cmds; cmd->name != NULL; cmd++) {
841         info = g_malloc0(sizeof(*info));
842         info->value = g_malloc0(sizeof(*info->value));
843         info->value->name = g_strdup(cmd->name);
844
845         info->next = cmd_list;
846         cmd_list = info;
847     }
848
849     return cmd_list;
850 }
851
852 EventInfoList *qmp_query_events(Error **errp)
853 {
854     EventInfoList *info, *ev_list = NULL;
855     MonitorEvent e;
856
857     for (e = 0 ; e < QEVENT_MAX ; e++) {
858         const char *event_name = monitor_event_names[e];
859         assert(event_name != NULL);
860         info = g_malloc0(sizeof(*info));
861         info->value = g_malloc0(sizeof(*info->value));
862         info->value->name = g_strdup(event_name);
863
864         info->next = ev_list;
865         ev_list = info;
866     }
867
868     return ev_list;
869 }
870
871 /* set the current CPU defined by the user */
872 int monitor_set_cpu(int cpu_index)
873 {
874     CPUArchState *env;
875
876     for(env = first_cpu; env != NULL; env = env->next_cpu) {
877         if (env->cpu_index == cpu_index) {
878             cur_mon->mon_cpu = env;
879             return 0;
880         }
881     }
882     return -1;
883 }
884
885 static CPUArchState *mon_get_cpu(void)
886 {
887     if (!cur_mon->mon_cpu) {
888         monitor_set_cpu(0);
889     }
890     cpu_synchronize_state(cur_mon->mon_cpu);
891     return cur_mon->mon_cpu;
892 }
893
894 int monitor_get_cpu_index(void)
895 {
896     return mon_get_cpu()->cpu_index;
897 }
898
899 static void do_info_registers(Monitor *mon)
900 {
901     CPUArchState *env;
902     env = mon_get_cpu();
903     cpu_dump_state(env, (FILE *)mon, monitor_fprintf, CPU_DUMP_FPU);
904 }
905
906 static void do_info_jit(Monitor *mon)
907 {
908     dump_exec_info((FILE *)mon, monitor_fprintf);
909 }
910
911 static void do_info_history(Monitor *mon)
912 {
913     int i;
914     const char *str;
915
916     if (!mon->rs)
917         return;
918     i = 0;
919     for(;;) {
920         str = readline_get_history(mon->rs, i);
921         if (!str)
922             break;
923         monitor_printf(mon, "%d: '%s'\n", i, str);
924         i++;
925     }
926 }
927
928 #if defined(TARGET_PPC)
929 /* XXX: not implemented in other targets */
930 static void do_info_cpu_stats(Monitor *mon)
931 {
932     CPUArchState *env;
933
934     env = mon_get_cpu();
935     cpu_dump_statistics(env, (FILE *)mon, &monitor_fprintf, 0);
936 }
937 #endif
938
939 static void do_trace_print_events(Monitor *mon)
940 {
941     trace_print_events((FILE *)mon, &monitor_fprintf);
942 }
943
944 static int client_migrate_info(Monitor *mon, const QDict *qdict,
945                                MonitorCompletion cb, void *opaque)
946 {
947     const char *protocol = qdict_get_str(qdict, "protocol");
948     const char *hostname = qdict_get_str(qdict, "hostname");
949     const char *subject  = qdict_get_try_str(qdict, "cert-subject");
950     int port             = qdict_get_try_int(qdict, "port", -1);
951     int tls_port         = qdict_get_try_int(qdict, "tls-port", -1);
952     int ret;
953
954     if (strcmp(protocol, "spice") == 0) {
955         if (!using_spice) {
956             qerror_report(QERR_DEVICE_NOT_ACTIVE, "spice");
957             return -1;
958         }
959
960         if (port == -1 && tls_port == -1) {
961             qerror_report(QERR_MISSING_PARAMETER, "port/tls-port");
962             return -1;
963         }
964
965         ret = qemu_spice_migrate_info(hostname, port, tls_port, subject,
966                                       cb, opaque);
967         if (ret != 0) {
968             qerror_report(QERR_UNDEFINED_ERROR);
969             return -1;
970         }
971         return 0;
972     }
973
974     qerror_report(QERR_INVALID_PARAMETER, "protocol");
975     return -1;
976 }
977
978 static void do_logfile(Monitor *mon, const QDict *qdict)
979 {
980     cpu_set_log_filename(qdict_get_str(qdict, "filename"));
981 }
982
983 static void do_log(Monitor *mon, const QDict *qdict)
984 {
985     int mask;
986     const char *items = qdict_get_str(qdict, "items");
987
988     if (!strcmp(items, "none")) {
989         mask = 0;
990     } else {
991         mask = cpu_str_to_log_mask(items);
992         if (!mask) {
993             help_cmd(mon, "log");
994             return;
995         }
996     }
997     cpu_set_log(mask);
998 }
999
1000 static void do_singlestep(Monitor *mon, const QDict *qdict)
1001 {
1002     const char *option = qdict_get_try_str(qdict, "option");
1003     if (!option || !strcmp(option, "on")) {
1004         singlestep = 1;
1005     } else if (!strcmp(option, "off")) {
1006         singlestep = 0;
1007     } else {
1008         monitor_printf(mon, "unexpected option %s\n", option);
1009     }
1010 }
1011
1012 static void do_gdbserver(Monitor *mon, const QDict *qdict)
1013 {
1014     const char *device = qdict_get_try_str(qdict, "device");
1015     if (!device)
1016         device = "tcp::" DEFAULT_GDBSTUB_PORT;
1017     if (gdbserver_start(device) < 0) {
1018         monitor_printf(mon, "Could not open gdbserver on device '%s'\n",
1019                        device);
1020     } else if (strcmp(device, "none") == 0) {
1021         monitor_printf(mon, "Disabled gdbserver\n");
1022     } else {
1023         monitor_printf(mon, "Waiting for gdb connection on device '%s'\n",
1024                        device);
1025     }
1026 }
1027
1028 static void do_watchdog_action(Monitor *mon, const QDict *qdict)
1029 {
1030     const char *action = qdict_get_str(qdict, "action");
1031     if (select_watchdog_action(action) == -1) {
1032         monitor_printf(mon, "Unknown watchdog action '%s'\n", action);
1033     }
1034 }
1035
1036 static void monitor_printc(Monitor *mon, int c)
1037 {
1038     monitor_printf(mon, "'");
1039     switch(c) {
1040     case '\'':
1041         monitor_printf(mon, "\\'");
1042         break;
1043     case '\\':
1044         monitor_printf(mon, "\\\\");
1045         break;
1046     case '\n':
1047         monitor_printf(mon, "\\n");
1048         break;
1049     case '\r':
1050         monitor_printf(mon, "\\r");
1051         break;
1052     default:
1053         if (c >= 32 && c <= 126) {
1054             monitor_printf(mon, "%c", c);
1055         } else {
1056             monitor_printf(mon, "\\x%02x", c);
1057         }
1058         break;
1059     }
1060     monitor_printf(mon, "'");
1061 }
1062
1063 static void memory_dump(Monitor *mon, int count, int format, int wsize,
1064                         hwaddr addr, int is_physical)
1065 {
1066     CPUArchState *env;
1067     int l, line_size, i, max_digits, len;
1068     uint8_t buf[16];
1069     uint64_t v;
1070
1071     if (format == 'i') {
1072         int flags;
1073         flags = 0;
1074         env = mon_get_cpu();
1075 #ifdef TARGET_I386
1076         if (wsize == 2) {
1077             flags = 1;
1078         } else if (wsize == 4) {
1079             flags = 0;
1080         } else {
1081             /* as default we use the current CS size */
1082             flags = 0;
1083             if (env) {
1084 #ifdef TARGET_X86_64
1085                 if ((env->efer & MSR_EFER_LMA) &&
1086                     (env->segs[R_CS].flags & DESC_L_MASK))
1087                     flags = 2;
1088                 else
1089 #endif
1090                 if (!(env->segs[R_CS].flags & DESC_B_MASK))
1091                     flags = 1;
1092             }
1093         }
1094 #endif
1095         monitor_disas(mon, env, addr, count, is_physical, flags);
1096         return;
1097     }
1098
1099     len = wsize * count;
1100     if (wsize == 1)
1101         line_size = 8;
1102     else
1103         line_size = 16;
1104     max_digits = 0;
1105
1106     switch(format) {
1107     case 'o':
1108         max_digits = (wsize * 8 + 2) / 3;
1109         break;
1110     default:
1111     case 'x':
1112         max_digits = (wsize * 8) / 4;
1113         break;
1114     case 'u':
1115     case 'd':
1116         max_digits = (wsize * 8 * 10 + 32) / 33;
1117         break;
1118     case 'c':
1119         wsize = 1;
1120         break;
1121     }
1122
1123     while (len > 0) {
1124         if (is_physical)
1125             monitor_printf(mon, TARGET_FMT_plx ":", addr);
1126         else
1127             monitor_printf(mon, TARGET_FMT_lx ":", (target_ulong)addr);
1128         l = len;
1129         if (l > line_size)
1130             l = line_size;
1131         if (is_physical) {
1132             cpu_physical_memory_read(addr, buf, l);
1133         } else {
1134             env = mon_get_cpu();
1135             if (cpu_memory_rw_debug(env, addr, buf, l, 0) < 0) {
1136                 monitor_printf(mon, " Cannot access memory\n");
1137                 break;
1138             }
1139         }
1140         i = 0;
1141         while (i < l) {
1142             switch(wsize) {
1143             default:
1144             case 1:
1145                 v = ldub_raw(buf + i);
1146                 break;
1147             case 2:
1148                 v = lduw_raw(buf + i);
1149                 break;
1150             case 4:
1151                 v = (uint32_t)ldl_raw(buf + i);
1152                 break;
1153             case 8:
1154                 v = ldq_raw(buf + i);
1155                 break;
1156             }
1157             monitor_printf(mon, " ");
1158             switch(format) {
1159             case 'o':
1160                 monitor_printf(mon, "%#*" PRIo64, max_digits, v);
1161                 break;
1162             case 'x':
1163                 monitor_printf(mon, "0x%0*" PRIx64, max_digits, v);
1164                 break;
1165             case 'u':
1166                 monitor_printf(mon, "%*" PRIu64, max_digits, v);
1167                 break;
1168             case 'd':
1169                 monitor_printf(mon, "%*" PRId64, max_digits, v);
1170                 break;
1171             case 'c':
1172                 monitor_printc(mon, v);
1173                 break;
1174             }
1175             i += wsize;
1176         }
1177         monitor_printf(mon, "\n");
1178         addr += l;
1179         len -= l;
1180     }
1181 }
1182
1183 static void do_memory_dump(Monitor *mon, const QDict *qdict)
1184 {
1185     int count = qdict_get_int(qdict, "count");
1186     int format = qdict_get_int(qdict, "format");
1187     int size = qdict_get_int(qdict, "size");
1188     target_long addr = qdict_get_int(qdict, "addr");
1189
1190     memory_dump(mon, count, format, size, addr, 0);
1191 }
1192
1193 static void do_physical_memory_dump(Monitor *mon, const QDict *qdict)
1194 {
1195     int count = qdict_get_int(qdict, "count");
1196     int format = qdict_get_int(qdict, "format");
1197     int size = qdict_get_int(qdict, "size");
1198     hwaddr addr = qdict_get_int(qdict, "addr");
1199
1200     memory_dump(mon, count, format, size, addr, 1);
1201 }
1202
1203 static void do_print(Monitor *mon, const QDict *qdict)
1204 {
1205     int format = qdict_get_int(qdict, "format");
1206     hwaddr val = qdict_get_int(qdict, "val");
1207
1208     switch(format) {
1209     case 'o':
1210         monitor_printf(mon, "%#" HWADDR_PRIo, val);
1211         break;
1212     case 'x':
1213         monitor_printf(mon, "%#" HWADDR_PRIx, val);
1214         break;
1215     case 'u':
1216         monitor_printf(mon, "%" HWADDR_PRIu, val);
1217         break;
1218     default:
1219     case 'd':
1220         monitor_printf(mon, "%" HWADDR_PRId, val);
1221         break;
1222     case 'c':
1223         monitor_printc(mon, val);
1224         break;
1225     }
1226     monitor_printf(mon, "\n");
1227 }
1228
1229 static void do_sum(Monitor *mon, const QDict *qdict)
1230 {
1231     uint32_t addr;
1232     uint16_t sum;
1233     uint32_t start = qdict_get_int(qdict, "start");
1234     uint32_t size = qdict_get_int(qdict, "size");
1235
1236     sum = 0;
1237     for(addr = start; addr < (start + size); addr++) {
1238         uint8_t val = ldub_phys(addr);
1239         /* BSD sum algorithm ('sum' Unix command) */
1240         sum = (sum >> 1) | (sum << 15);
1241         sum += val;
1242     }
1243     monitor_printf(mon, "%05d\n", sum);
1244 }
1245
1246 static int mouse_button_state;
1247
1248 static void do_mouse_move(Monitor *mon, const QDict *qdict)
1249 {
1250     int dx, dy, dz;
1251     const char *dx_str = qdict_get_str(qdict, "dx_str");
1252     const char *dy_str = qdict_get_str(qdict, "dy_str");
1253     const char *dz_str = qdict_get_try_str(qdict, "dz_str");
1254     dx = strtol(dx_str, NULL, 0);
1255     dy = strtol(dy_str, NULL, 0);
1256     dz = 0;
1257     if (dz_str)
1258         dz = strtol(dz_str, NULL, 0);
1259     kbd_mouse_event(dx, dy, dz, mouse_button_state);
1260 }
1261
1262 static void do_mouse_button(Monitor *mon, const QDict *qdict)
1263 {
1264     int button_state = qdict_get_int(qdict, "button_state");
1265     mouse_button_state = button_state;
1266     kbd_mouse_event(0, 0, 0, mouse_button_state);
1267 }
1268
1269 static void do_ioport_read(Monitor *mon, const QDict *qdict)
1270 {
1271     int size = qdict_get_int(qdict, "size");
1272     int addr = qdict_get_int(qdict, "addr");
1273     int has_index = qdict_haskey(qdict, "index");
1274     uint32_t val;
1275     int suffix;
1276
1277     if (has_index) {
1278         int index = qdict_get_int(qdict, "index");
1279         cpu_outb(addr & IOPORTS_MASK, index & 0xff);
1280         addr++;
1281     }
1282     addr &= 0xffff;
1283
1284     switch(size) {
1285     default:
1286     case 1:
1287         val = cpu_inb(addr);
1288         suffix = 'b';
1289         break;
1290     case 2:
1291         val = cpu_inw(addr);
1292         suffix = 'w';
1293         break;
1294     case 4:
1295         val = cpu_inl(addr);
1296         suffix = 'l';
1297         break;
1298     }
1299     monitor_printf(mon, "port%c[0x%04x] = %#0*x\n",
1300                    suffix, addr, size * 2, val);
1301 }
1302
1303 static void do_ioport_write(Monitor *mon, const QDict *qdict)
1304 {
1305     int size = qdict_get_int(qdict, "size");
1306     int addr = qdict_get_int(qdict, "addr");
1307     int val = qdict_get_int(qdict, "val");
1308
1309     addr &= IOPORTS_MASK;
1310
1311     switch (size) {
1312     default:
1313     case 1:
1314         cpu_outb(addr, val);
1315         break;
1316     case 2:
1317         cpu_outw(addr, val);
1318         break;
1319     case 4:
1320         cpu_outl(addr, val);
1321         break;
1322     }
1323 }
1324
1325 static void do_boot_set(Monitor *mon, const QDict *qdict)
1326 {
1327     int res;
1328     const char *bootdevice = qdict_get_str(qdict, "bootdevice");
1329
1330     res = qemu_boot_set(bootdevice);
1331     if (res == 0) {
1332         monitor_printf(mon, "boot device list now set to %s\n", bootdevice);
1333     } else if (res > 0) {
1334         monitor_printf(mon, "setting boot device list failed\n");
1335     } else {
1336         monitor_printf(mon, "no function defined to set boot device list for "
1337                        "this architecture\n");
1338     }
1339 }
1340
1341 #if defined(TARGET_I386)
1342 static void print_pte(Monitor *mon, hwaddr addr,
1343                       hwaddr pte,
1344                       hwaddr mask)
1345 {
1346 #ifdef TARGET_X86_64
1347     if (addr & (1ULL << 47)) {
1348         addr |= -1LL << 48;
1349     }
1350 #endif
1351     monitor_printf(mon, TARGET_FMT_plx ": " TARGET_FMT_plx
1352                    " %c%c%c%c%c%c%c%c%c\n",
1353                    addr,
1354                    pte & mask,
1355                    pte & PG_NX_MASK ? 'X' : '-',
1356                    pte & PG_GLOBAL_MASK ? 'G' : '-',
1357                    pte & PG_PSE_MASK ? 'P' : '-',
1358                    pte & PG_DIRTY_MASK ? 'D' : '-',
1359                    pte & PG_ACCESSED_MASK ? 'A' : '-',
1360                    pte & PG_PCD_MASK ? 'C' : '-',
1361                    pte & PG_PWT_MASK ? 'T' : '-',
1362                    pte & PG_USER_MASK ? 'U' : '-',
1363                    pte & PG_RW_MASK ? 'W' : '-');
1364 }
1365
1366 static void tlb_info_32(Monitor *mon, CPUArchState *env)
1367 {
1368     unsigned int l1, l2;
1369     uint32_t pgd, pde, pte;
1370
1371     pgd = env->cr[3] & ~0xfff;
1372     for(l1 = 0; l1 < 1024; l1++) {
1373         cpu_physical_memory_read(pgd + l1 * 4, &pde, 4);
1374         pde = le32_to_cpu(pde);
1375         if (pde & PG_PRESENT_MASK) {
1376             if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
1377                 /* 4M pages */
1378                 print_pte(mon, (l1 << 22), pde, ~((1 << 21) - 1));
1379             } else {
1380                 for(l2 = 0; l2 < 1024; l2++) {
1381                     cpu_physical_memory_read((pde & ~0xfff) + l2 * 4, &pte, 4);
1382                     pte = le32_to_cpu(pte);
1383                     if (pte & PG_PRESENT_MASK) {
1384                         print_pte(mon, (l1 << 22) + (l2 << 12),
1385                                   pte & ~PG_PSE_MASK,
1386                                   ~0xfff);
1387                     }
1388                 }
1389             }
1390         }
1391     }
1392 }
1393
1394 static void tlb_info_pae32(Monitor *mon, CPUArchState *env)
1395 {
1396     unsigned int l1, l2, l3;
1397     uint64_t pdpe, pde, pte;
1398     uint64_t pdp_addr, pd_addr, pt_addr;
1399
1400     pdp_addr = env->cr[3] & ~0x1f;
1401     for (l1 = 0; l1 < 4; l1++) {
1402         cpu_physical_memory_read(pdp_addr + l1 * 8, &pdpe, 8);
1403         pdpe = le64_to_cpu(pdpe);
1404         if (pdpe & PG_PRESENT_MASK) {
1405             pd_addr = pdpe & 0x3fffffffff000ULL;
1406             for (l2 = 0; l2 < 512; l2++) {
1407                 cpu_physical_memory_read(pd_addr + l2 * 8, &pde, 8);
1408                 pde = le64_to_cpu(pde);
1409                 if (pde & PG_PRESENT_MASK) {
1410                     if (pde & PG_PSE_MASK) {
1411                         /* 2M pages with PAE, CR4.PSE is ignored */
1412                         print_pte(mon, (l1 << 30 ) + (l2 << 21), pde,
1413                                   ~((hwaddr)(1 << 20) - 1));
1414                     } else {
1415                         pt_addr = pde & 0x3fffffffff000ULL;
1416                         for (l3 = 0; l3 < 512; l3++) {
1417                             cpu_physical_memory_read(pt_addr + l3 * 8, &pte, 8);
1418                             pte = le64_to_cpu(pte);
1419                             if (pte & PG_PRESENT_MASK) {
1420                                 print_pte(mon, (l1 << 30 ) + (l2 << 21)
1421                                           + (l3 << 12),
1422                                           pte & ~PG_PSE_MASK,
1423                                           ~(hwaddr)0xfff);
1424                             }
1425                         }
1426                     }
1427                 }
1428             }
1429         }
1430     }
1431 }
1432
1433 #ifdef TARGET_X86_64
1434 static void tlb_info_64(Monitor *mon, CPUArchState *env)
1435 {
1436     uint64_t l1, l2, l3, l4;
1437     uint64_t pml4e, pdpe, pde, pte;
1438     uint64_t pml4_addr, pdp_addr, pd_addr, pt_addr;
1439
1440     pml4_addr = env->cr[3] & 0x3fffffffff000ULL;
1441     for (l1 = 0; l1 < 512; l1++) {
1442         cpu_physical_memory_read(pml4_addr + l1 * 8, &pml4e, 8);
1443         pml4e = le64_to_cpu(pml4e);
1444         if (pml4e & PG_PRESENT_MASK) {
1445             pdp_addr = pml4e & 0x3fffffffff000ULL;
1446             for (l2 = 0; l2 < 512; l2++) {
1447                 cpu_physical_memory_read(pdp_addr + l2 * 8, &pdpe, 8);
1448                 pdpe = le64_to_cpu(pdpe);
1449                 if (pdpe & PG_PRESENT_MASK) {
1450                     if (pdpe & PG_PSE_MASK) {
1451                         /* 1G pages, CR4.PSE is ignored */
1452                         print_pte(mon, (l1 << 39) + (l2 << 30), pdpe,
1453                                   0x3ffffc0000000ULL);
1454                     } else {
1455                         pd_addr = pdpe & 0x3fffffffff000ULL;
1456                         for (l3 = 0; l3 < 512; l3++) {
1457                             cpu_physical_memory_read(pd_addr + l3 * 8, &pde, 8);
1458                             pde = le64_to_cpu(pde);
1459                             if (pde & PG_PRESENT_MASK) {
1460                                 if (pde & PG_PSE_MASK) {
1461                                     /* 2M pages, CR4.PSE is ignored */
1462                                     print_pte(mon, (l1 << 39) + (l2 << 30) +
1463                                               (l3 << 21), pde,
1464                                               0x3ffffffe00000ULL);
1465                                 } else {
1466                                     pt_addr = pde & 0x3fffffffff000ULL;
1467                                     for (l4 = 0; l4 < 512; l4++) {
1468                                         cpu_physical_memory_read(pt_addr
1469                                                                  + l4 * 8,
1470                                                                  &pte, 8);
1471                                         pte = le64_to_cpu(pte);
1472                                         if (pte & PG_PRESENT_MASK) {
1473                                             print_pte(mon, (l1 << 39) +
1474                                                       (l2 << 30) +
1475                                                       (l3 << 21) + (l4 << 12),
1476                                                       pte & ~PG_PSE_MASK,
1477                                                       0x3fffffffff000ULL);
1478                                         }
1479                                     }
1480                                 }
1481                             }
1482                         }
1483                     }
1484                 }
1485             }
1486         }
1487     }
1488 }
1489 #endif
1490
1491 static void tlb_info(Monitor *mon)
1492 {
1493     CPUArchState *env;
1494
1495     env = mon_get_cpu();
1496
1497     if (!(env->cr[0] & CR0_PG_MASK)) {
1498         monitor_printf(mon, "PG disabled\n");
1499         return;
1500     }
1501     if (env->cr[4] & CR4_PAE_MASK) {
1502 #ifdef TARGET_X86_64
1503         if (env->hflags & HF_LMA_MASK) {
1504             tlb_info_64(mon, env);
1505         } else
1506 #endif
1507         {
1508             tlb_info_pae32(mon, env);
1509         }
1510     } else {
1511         tlb_info_32(mon, env);
1512     }
1513 }
1514
1515 static void mem_print(Monitor *mon, hwaddr *pstart,
1516                       int *plast_prot,
1517                       hwaddr end, int prot)
1518 {
1519     int prot1;
1520     prot1 = *plast_prot;
1521     if (prot != prot1) {
1522         if (*pstart != -1) {
1523             monitor_printf(mon, TARGET_FMT_plx "-" TARGET_FMT_plx " "
1524                            TARGET_FMT_plx " %c%c%c\n",
1525                            *pstart, end, end - *pstart,
1526                            prot1 & PG_USER_MASK ? 'u' : '-',
1527                            'r',
1528                            prot1 & PG_RW_MASK ? 'w' : '-');
1529         }
1530         if (prot != 0)
1531             *pstart = end;
1532         else
1533             *pstart = -1;
1534         *plast_prot = prot;
1535     }
1536 }
1537
1538 static void mem_info_32(Monitor *mon, CPUArchState *env)
1539 {
1540     unsigned int l1, l2;
1541     int prot, last_prot;
1542     uint32_t pgd, pde, pte;
1543     hwaddr start, end;
1544
1545     pgd = env->cr[3] & ~0xfff;
1546     last_prot = 0;
1547     start = -1;
1548     for(l1 = 0; l1 < 1024; l1++) {
1549         cpu_physical_memory_read(pgd + l1 * 4, &pde, 4);
1550         pde = le32_to_cpu(pde);
1551         end = l1 << 22;
1552         if (pde & PG_PRESENT_MASK) {
1553             if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
1554                 prot = pde & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
1555                 mem_print(mon, &start, &last_prot, end, prot);
1556             } else {
1557                 for(l2 = 0; l2 < 1024; l2++) {
1558                     cpu_physical_memory_read((pde & ~0xfff) + l2 * 4, &pte, 4);
1559                     pte = le32_to_cpu(pte);
1560                     end = (l1 << 22) + (l2 << 12);
1561                     if (pte & PG_PRESENT_MASK) {
1562                         prot = pte & pde &
1563                             (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
1564                     } else {
1565                         prot = 0;
1566                     }
1567                     mem_print(mon, &start, &last_prot, end, prot);
1568                 }
1569             }
1570         } else {
1571             prot = 0;
1572             mem_print(mon, &start, &last_prot, end, prot);
1573         }
1574     }
1575     /* Flush last range */
1576     mem_print(mon, &start, &last_prot, (hwaddr)1 << 32, 0);
1577 }
1578
1579 static void mem_info_pae32(Monitor *mon, CPUArchState *env)
1580 {
1581     unsigned int l1, l2, l3;
1582     int prot, last_prot;
1583     uint64_t pdpe, pde, pte;
1584     uint64_t pdp_addr, pd_addr, pt_addr;
1585     hwaddr start, end;
1586
1587     pdp_addr = env->cr[3] & ~0x1f;
1588     last_prot = 0;
1589     start = -1;
1590     for (l1 = 0; l1 < 4; l1++) {
1591         cpu_physical_memory_read(pdp_addr + l1 * 8, &pdpe, 8);
1592         pdpe = le64_to_cpu(pdpe);
1593         end = l1 << 30;
1594         if (pdpe & PG_PRESENT_MASK) {
1595             pd_addr = pdpe & 0x3fffffffff000ULL;
1596             for (l2 = 0; l2 < 512; l2++) {
1597                 cpu_physical_memory_read(pd_addr + l2 * 8, &pde, 8);
1598                 pde = le64_to_cpu(pde);
1599                 end = (l1 << 30) + (l2 << 21);
1600                 if (pde & PG_PRESENT_MASK) {
1601                     if (pde & PG_PSE_MASK) {
1602                         prot = pde & (PG_USER_MASK | PG_RW_MASK |
1603                                       PG_PRESENT_MASK);
1604                         mem_print(mon, &start, &last_prot, end, prot);
1605                     } else {
1606                         pt_addr = pde & 0x3fffffffff000ULL;
1607                         for (l3 = 0; l3 < 512; l3++) {
1608                             cpu_physical_memory_read(pt_addr + l3 * 8, &pte, 8);
1609                             pte = le64_to_cpu(pte);
1610                             end = (l1 << 30) + (l2 << 21) + (l3 << 12);
1611                             if (pte & PG_PRESENT_MASK) {
1612                                 prot = pte & pde & (PG_USER_MASK | PG_RW_MASK |
1613                                                     PG_PRESENT_MASK);
1614                             } else {
1615                                 prot = 0;
1616                             }
1617                             mem_print(mon, &start, &last_prot, end, prot);
1618                         }
1619                     }
1620                 } else {
1621                     prot = 0;
1622                     mem_print(mon, &start, &last_prot, end, prot);
1623                 }
1624             }
1625         } else {
1626             prot = 0;
1627             mem_print(mon, &start, &last_prot, end, prot);
1628         }
1629     }
1630     /* Flush last range */
1631     mem_print(mon, &start, &last_prot, (hwaddr)1 << 32, 0);
1632 }
1633
1634
1635 #ifdef TARGET_X86_64
1636 static void mem_info_64(Monitor *mon, CPUArchState *env)
1637 {
1638     int prot, last_prot;
1639     uint64_t l1, l2, l3, l4;
1640     uint64_t pml4e, pdpe, pde, pte;
1641     uint64_t pml4_addr, pdp_addr, pd_addr, pt_addr, start, end;
1642
1643     pml4_addr = env->cr[3] & 0x3fffffffff000ULL;
1644     last_prot = 0;
1645     start = -1;
1646     for (l1 = 0; l1 < 512; l1++) {
1647         cpu_physical_memory_read(pml4_addr + l1 * 8, &pml4e, 8);
1648         pml4e = le64_to_cpu(pml4e);
1649         end = l1 << 39;
1650         if (pml4e & PG_PRESENT_MASK) {
1651             pdp_addr = pml4e & 0x3fffffffff000ULL;
1652             for (l2 = 0; l2 < 512; l2++) {
1653                 cpu_physical_memory_read(pdp_addr + l2 * 8, &pdpe, 8);
1654                 pdpe = le64_to_cpu(pdpe);
1655                 end = (l1 << 39) + (l2 << 30);
1656                 if (pdpe & PG_PRESENT_MASK) {
1657                     if (pdpe & PG_PSE_MASK) {
1658                         prot = pdpe & (PG_USER_MASK | PG_RW_MASK |
1659                                        PG_PRESENT_MASK);
1660                         prot &= pml4e;
1661                         mem_print(mon, &start, &last_prot, end, prot);
1662                     } else {
1663                         pd_addr = pdpe & 0x3fffffffff000ULL;
1664                         for (l3 = 0; l3 < 512; l3++) {
1665                             cpu_physical_memory_read(pd_addr + l3 * 8, &pde, 8);
1666                             pde = le64_to_cpu(pde);
1667                             end = (l1 << 39) + (l2 << 30) + (l3 << 21);
1668                             if (pde & PG_PRESENT_MASK) {
1669                                 if (pde & PG_PSE_MASK) {
1670                                     prot = pde & (PG_USER_MASK | PG_RW_MASK |
1671                                                   PG_PRESENT_MASK);
1672                                     prot &= pml4e & pdpe;
1673                                     mem_print(mon, &start, &last_prot, end, prot);
1674                                 } else {
1675                                     pt_addr = pde & 0x3fffffffff000ULL;
1676                                     for (l4 = 0; l4 < 512; l4++) {
1677                                         cpu_physical_memory_read(pt_addr
1678                                                                  + l4 * 8,
1679                                                                  &pte, 8);
1680                                         pte = le64_to_cpu(pte);
1681                                         end = (l1 << 39) + (l2 << 30) +
1682                                             (l3 << 21) + (l4 << 12);
1683                                         if (pte & PG_PRESENT_MASK) {
1684                                             prot = pte & (PG_USER_MASK | PG_RW_MASK |
1685                                                           PG_PRESENT_MASK);
1686                                             prot &= pml4e & pdpe & pde;
1687                                         } else {
1688                                             prot = 0;
1689                                         }
1690                                         mem_print(mon, &start, &last_prot, end, prot);
1691                                     }
1692                                 }
1693                             } else {
1694                                 prot = 0;
1695                                 mem_print(mon, &start, &last_prot, end, prot);
1696                             }
1697                         }
1698                     }
1699                 } else {
1700                     prot = 0;
1701                     mem_print(mon, &start, &last_prot, end, prot);
1702                 }
1703             }
1704         } else {
1705             prot = 0;
1706             mem_print(mon, &start, &last_prot, end, prot);
1707         }
1708     }
1709     /* Flush last range */
1710     mem_print(mon, &start, &last_prot, (hwaddr)1 << 48, 0);
1711 }
1712 #endif
1713
1714 static void mem_info(Monitor *mon)
1715 {
1716     CPUArchState *env;
1717
1718     env = mon_get_cpu();
1719
1720     if (!(env->cr[0] & CR0_PG_MASK)) {
1721         monitor_printf(mon, "PG disabled\n");
1722         return;
1723     }
1724     if (env->cr[4] & CR4_PAE_MASK) {
1725 #ifdef TARGET_X86_64
1726         if (env->hflags & HF_LMA_MASK) {
1727             mem_info_64(mon, env);
1728         } else
1729 #endif
1730         {
1731             mem_info_pae32(mon, env);
1732         }
1733     } else {
1734         mem_info_32(mon, env);
1735     }
1736 }
1737 #endif
1738
1739 #if defined(TARGET_SH4)
1740
1741 static void print_tlb(Monitor *mon, int idx, tlb_t *tlb)
1742 {
1743     monitor_printf(mon, " tlb%i:\t"
1744                    "asid=%hhu vpn=%x\tppn=%x\tsz=%hhu size=%u\t"
1745                    "v=%hhu shared=%hhu cached=%hhu prot=%hhu "
1746                    "dirty=%hhu writethrough=%hhu\n",
1747                    idx,
1748                    tlb->asid, tlb->vpn, tlb->ppn, tlb->sz, tlb->size,
1749                    tlb->v, tlb->sh, tlb->c, tlb->pr,
1750                    tlb->d, tlb->wt);
1751 }
1752
1753 static void tlb_info(Monitor *mon)
1754 {
1755     CPUArchState *env = mon_get_cpu();
1756     int i;
1757
1758     monitor_printf (mon, "ITLB:\n");
1759     for (i = 0 ; i < ITLB_SIZE ; i++)
1760         print_tlb (mon, i, &env->itlb[i]);
1761     monitor_printf (mon, "UTLB:\n");
1762     for (i = 0 ; i < UTLB_SIZE ; i++)
1763         print_tlb (mon, i, &env->utlb[i]);
1764 }
1765
1766 #endif
1767
1768 #if defined(TARGET_SPARC) || defined(TARGET_PPC) || defined(TARGET_XTENSA)
1769 static void tlb_info(Monitor *mon)
1770 {
1771     CPUArchState *env1 = mon_get_cpu();
1772
1773     dump_mmu((FILE*)mon, (fprintf_function)monitor_printf, env1);
1774 }
1775 #endif
1776
1777 static void do_info_mtree(Monitor *mon)
1778 {
1779     mtree_info((fprintf_function)monitor_printf, mon);
1780 }
1781
1782 static void do_info_numa(Monitor *mon)
1783 {
1784     int i;
1785     CPUArchState *env;
1786     CPUState *cpu;
1787
1788     monitor_printf(mon, "%d nodes\n", nb_numa_nodes);
1789     for (i = 0; i < nb_numa_nodes; i++) {
1790         monitor_printf(mon, "node %d cpus:", i);
1791         for (env = first_cpu; env != NULL; env = env->next_cpu) {
1792             cpu = ENV_GET_CPU(env);
1793             if (cpu->numa_node == i) {
1794                 monitor_printf(mon, " %d", env->cpu_index);
1795             }
1796         }
1797         monitor_printf(mon, "\n");
1798         monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i,
1799             node_mem[i] >> 20);
1800     }
1801 }
1802
1803 #ifdef CONFIG_PROFILER
1804
1805 int64_t qemu_time;
1806 int64_t dev_time;
1807
1808 static void do_info_profile(Monitor *mon)
1809 {
1810     int64_t total;
1811     total = qemu_time;
1812     if (total == 0)
1813         total = 1;
1814     monitor_printf(mon, "async time  %" PRId64 " (%0.3f)\n",
1815                    dev_time, dev_time / (double)get_ticks_per_sec());
1816     monitor_printf(mon, "qemu time   %" PRId64 " (%0.3f)\n",
1817                    qemu_time, qemu_time / (double)get_ticks_per_sec());
1818     qemu_time = 0;
1819     dev_time = 0;
1820 }
1821 #else
1822 static void do_info_profile(Monitor *mon)
1823 {
1824     monitor_printf(mon, "Internal profiler not compiled\n");
1825 }
1826 #endif
1827
1828 /* Capture support */
1829 static QLIST_HEAD (capture_list_head, CaptureState) capture_head;
1830
1831 static void do_info_capture(Monitor *mon)
1832 {
1833     int i;
1834     CaptureState *s;
1835
1836     for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1837         monitor_printf(mon, "[%d]: ", i);
1838         s->ops.info (s->opaque);
1839     }
1840 }
1841
1842 #ifdef HAS_AUDIO
1843 static void do_stop_capture(Monitor *mon, const QDict *qdict)
1844 {
1845     int i;
1846     int n = qdict_get_int(qdict, "n");
1847     CaptureState *s;
1848
1849     for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1850         if (i == n) {
1851             s->ops.destroy (s->opaque);
1852             QLIST_REMOVE (s, entries);
1853             g_free (s);
1854             return;
1855         }
1856     }
1857 }
1858
1859 static void do_wav_capture(Monitor *mon, const QDict *qdict)
1860 {
1861     const char *path = qdict_get_str(qdict, "path");
1862     int has_freq = qdict_haskey(qdict, "freq");
1863     int freq = qdict_get_try_int(qdict, "freq", -1);
1864     int has_bits = qdict_haskey(qdict, "bits");
1865     int bits = qdict_get_try_int(qdict, "bits", -1);
1866     int has_channels = qdict_haskey(qdict, "nchannels");
1867     int nchannels = qdict_get_try_int(qdict, "nchannels", -1);
1868     CaptureState *s;
1869
1870     s = g_malloc0 (sizeof (*s));
1871
1872     freq = has_freq ? freq : 44100;
1873     bits = has_bits ? bits : 16;
1874     nchannels = has_channels ? nchannels : 2;
1875
1876     if (wav_start_capture (s, path, freq, bits, nchannels)) {
1877         monitor_printf(mon, "Failed to add wave capture\n");
1878         g_free (s);
1879         return;
1880     }
1881     QLIST_INSERT_HEAD (&capture_head, s, entries);
1882 }
1883 #endif
1884
1885 static qemu_acl *find_acl(Monitor *mon, const char *name)
1886 {
1887     qemu_acl *acl = qemu_acl_find(name);
1888
1889     if (!acl) {
1890         monitor_printf(mon, "acl: unknown list '%s'\n", name);
1891     }
1892     return acl;
1893 }
1894
1895 static void do_acl_show(Monitor *mon, const QDict *qdict)
1896 {
1897     const char *aclname = qdict_get_str(qdict, "aclname");
1898     qemu_acl *acl = find_acl(mon, aclname);
1899     qemu_acl_entry *entry;
1900     int i = 0;
1901
1902     if (acl) {
1903         monitor_printf(mon, "policy: %s\n",
1904                        acl->defaultDeny ? "deny" : "allow");
1905         QTAILQ_FOREACH(entry, &acl->entries, next) {
1906             i++;
1907             monitor_printf(mon, "%d: %s %s\n", i,
1908                            entry->deny ? "deny" : "allow", entry->match);
1909         }
1910     }
1911 }
1912
1913 static void do_acl_reset(Monitor *mon, const QDict *qdict)
1914 {
1915     const char *aclname = qdict_get_str(qdict, "aclname");
1916     qemu_acl *acl = find_acl(mon, aclname);
1917
1918     if (acl) {
1919         qemu_acl_reset(acl);
1920         monitor_printf(mon, "acl: removed all rules\n");
1921     }
1922 }
1923
1924 static void do_acl_policy(Monitor *mon, const QDict *qdict)
1925 {
1926     const char *aclname = qdict_get_str(qdict, "aclname");
1927     const char *policy = qdict_get_str(qdict, "policy");
1928     qemu_acl *acl = find_acl(mon, aclname);
1929
1930     if (acl) {
1931         if (strcmp(policy, "allow") == 0) {
1932             acl->defaultDeny = 0;
1933             monitor_printf(mon, "acl: policy set to 'allow'\n");
1934         } else if (strcmp(policy, "deny") == 0) {
1935             acl->defaultDeny = 1;
1936             monitor_printf(mon, "acl: policy set to 'deny'\n");
1937         } else {
1938             monitor_printf(mon, "acl: unknown policy '%s', "
1939                            "expected 'deny' or 'allow'\n", policy);
1940         }
1941     }
1942 }
1943
1944 static void do_acl_add(Monitor *mon, const QDict *qdict)
1945 {
1946     const char *aclname = qdict_get_str(qdict, "aclname");
1947     const char *match = qdict_get_str(qdict, "match");
1948     const char *policy = qdict_get_str(qdict, "policy");
1949     int has_index = qdict_haskey(qdict, "index");
1950     int index = qdict_get_try_int(qdict, "index", -1);
1951     qemu_acl *acl = find_acl(mon, aclname);
1952     int deny, ret;
1953
1954     if (acl) {
1955         if (strcmp(policy, "allow") == 0) {
1956             deny = 0;
1957         } else if (strcmp(policy, "deny") == 0) {
1958             deny = 1;
1959         } else {
1960             monitor_printf(mon, "acl: unknown policy '%s', "
1961                            "expected 'deny' or 'allow'\n", policy);
1962             return;
1963         }
1964         if (has_index)
1965             ret = qemu_acl_insert(acl, deny, match, index);
1966         else
1967             ret = qemu_acl_append(acl, deny, match);
1968         if (ret < 0)
1969             monitor_printf(mon, "acl: unable to add acl entry\n");
1970         else
1971             monitor_printf(mon, "acl: added rule at position %d\n", ret);
1972     }
1973 }
1974
1975 static void do_acl_remove(Monitor *mon, const QDict *qdict)
1976 {
1977     const char *aclname = qdict_get_str(qdict, "aclname");
1978     const char *match = qdict_get_str(qdict, "match");
1979     qemu_acl *acl = find_acl(mon, aclname);
1980     int ret;
1981
1982     if (acl) {
1983         ret = qemu_acl_remove(acl, match);
1984         if (ret < 0)
1985             monitor_printf(mon, "acl: no matching acl entry\n");
1986         else
1987             monitor_printf(mon, "acl: removed rule at position %d\n", ret);
1988     }
1989 }
1990
1991 #if defined(TARGET_I386)
1992 static void do_inject_mce(Monitor *mon, const QDict *qdict)
1993 {
1994     X86CPU *cpu;
1995     CPUX86State *cenv;
1996     int cpu_index = qdict_get_int(qdict, "cpu_index");
1997     int bank = qdict_get_int(qdict, "bank");
1998     uint64_t status = qdict_get_int(qdict, "status");
1999     uint64_t mcg_status = qdict_get_int(qdict, "mcg_status");
2000     uint64_t addr = qdict_get_int(qdict, "addr");
2001     uint64_t misc = qdict_get_int(qdict, "misc");
2002     int flags = MCE_INJECT_UNCOND_AO;
2003
2004     if (qdict_get_try_bool(qdict, "broadcast", 0)) {
2005         flags |= MCE_INJECT_BROADCAST;
2006     }
2007     for (cenv = first_cpu; cenv != NULL; cenv = cenv->next_cpu) {
2008         cpu = x86_env_get_cpu(cenv);
2009         if (cenv->cpu_index == cpu_index) {
2010             cpu_x86_inject_mce(mon, cpu, bank, status, mcg_status, addr, misc,
2011                                flags);
2012             break;
2013         }
2014     }
2015 }
2016 #endif
2017
2018 void qmp_getfd(const char *fdname, Error **errp)
2019 {
2020     mon_fd_t *monfd;
2021     int fd;
2022
2023     fd = qemu_chr_fe_get_msgfd(cur_mon->chr);
2024     if (fd == -1) {
2025         error_set(errp, QERR_FD_NOT_SUPPLIED);
2026         return;
2027     }
2028
2029     if (qemu_isdigit(fdname[0])) {
2030         error_set(errp, QERR_INVALID_PARAMETER_VALUE, "fdname",
2031                   "a name not starting with a digit");
2032         return;
2033     }
2034
2035     QLIST_FOREACH(monfd, &cur_mon->fds, next) {
2036         if (strcmp(monfd->name, fdname) != 0) {
2037             continue;
2038         }
2039
2040         close(monfd->fd);
2041         monfd->fd = fd;
2042         return;
2043     }
2044
2045     monfd = g_malloc0(sizeof(mon_fd_t));
2046     monfd->name = g_strdup(fdname);
2047     monfd->fd = fd;
2048
2049     QLIST_INSERT_HEAD(&cur_mon->fds, monfd, next);
2050 }
2051
2052 void qmp_closefd(const char *fdname, Error **errp)
2053 {
2054     mon_fd_t *monfd;
2055
2056     QLIST_FOREACH(monfd, &cur_mon->fds, next) {
2057         if (strcmp(monfd->name, fdname) != 0) {
2058             continue;
2059         }
2060
2061         QLIST_REMOVE(monfd, next);
2062         close(monfd->fd);
2063         g_free(monfd->name);
2064         g_free(monfd);
2065         return;
2066     }
2067
2068     error_set(errp, QERR_FD_NOT_FOUND, fdname);
2069 }
2070
2071 static void do_loadvm(Monitor *mon, const QDict *qdict)
2072 {
2073     int saved_vm_running  = runstate_is_running();
2074     const char *name = qdict_get_str(qdict, "name");
2075
2076     vm_stop(RUN_STATE_RESTORE_VM);
2077
2078     if (load_vmstate(name) == 0 && saved_vm_running) {
2079         vm_start();
2080     }
2081 }
2082
2083 int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp)
2084 {
2085     mon_fd_t *monfd;
2086
2087     QLIST_FOREACH(monfd, &mon->fds, next) {
2088         int fd;
2089
2090         if (strcmp(monfd->name, fdname) != 0) {
2091             continue;
2092         }
2093
2094         fd = monfd->fd;
2095
2096         /* caller takes ownership of fd */
2097         QLIST_REMOVE(monfd, next);
2098         g_free(monfd->name);
2099         g_free(monfd);
2100
2101         return fd;
2102     }
2103
2104     error_setg(errp, "File descriptor named '%s' has not been found", fdname);
2105     return -1;
2106 }
2107
2108 static void monitor_fdset_cleanup(MonFdset *mon_fdset)
2109 {
2110     MonFdsetFd *mon_fdset_fd;
2111     MonFdsetFd *mon_fdset_fd_next;
2112
2113     QLIST_FOREACH_SAFE(mon_fdset_fd, &mon_fdset->fds, next, mon_fdset_fd_next) {
2114         if ((mon_fdset_fd->removed ||
2115                 (QLIST_EMPTY(&mon_fdset->dup_fds) && mon_refcount == 0)) &&
2116                 runstate_is_running()) {
2117             close(mon_fdset_fd->fd);
2118             g_free(mon_fdset_fd->opaque);
2119             QLIST_REMOVE(mon_fdset_fd, next);
2120             g_free(mon_fdset_fd);
2121         }
2122     }
2123
2124     if (QLIST_EMPTY(&mon_fdset->fds) && QLIST_EMPTY(&mon_fdset->dup_fds)) {
2125         QLIST_REMOVE(mon_fdset, next);
2126         g_free(mon_fdset);
2127     }
2128 }
2129
2130 static void monitor_fdsets_cleanup(void)
2131 {
2132     MonFdset *mon_fdset;
2133     MonFdset *mon_fdset_next;
2134
2135     QLIST_FOREACH_SAFE(mon_fdset, &mon_fdsets, next, mon_fdset_next) {
2136         monitor_fdset_cleanup(mon_fdset);
2137     }
2138 }
2139
2140 AddfdInfo *qmp_add_fd(bool has_fdset_id, int64_t fdset_id, bool has_opaque,
2141                       const char *opaque, Error **errp)
2142 {
2143     int fd;
2144     Monitor *mon = cur_mon;
2145     AddfdInfo *fdinfo;
2146
2147     fd = qemu_chr_fe_get_msgfd(mon->chr);
2148     if (fd == -1) {
2149         error_set(errp, QERR_FD_NOT_SUPPLIED);
2150         goto error;
2151     }
2152
2153     fdinfo = monitor_fdset_add_fd(fd, has_fdset_id, fdset_id,
2154                                   has_opaque, opaque, errp);
2155     if (fdinfo) {
2156         return fdinfo;
2157     }
2158
2159 error:
2160     if (fd != -1) {
2161         close(fd);
2162     }
2163     return NULL;
2164 }
2165
2166 void qmp_remove_fd(int64_t fdset_id, bool has_fd, int64_t fd, Error **errp)
2167 {
2168     MonFdset *mon_fdset;
2169     MonFdsetFd *mon_fdset_fd;
2170     char fd_str[60];
2171
2172     QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2173         if (mon_fdset->id != fdset_id) {
2174             continue;
2175         }
2176         QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
2177             if (has_fd) {
2178                 if (mon_fdset_fd->fd != fd) {
2179                     continue;
2180                 }
2181                 mon_fdset_fd->removed = true;
2182                 break;
2183             } else {
2184                 mon_fdset_fd->removed = true;
2185             }
2186         }
2187         if (has_fd && !mon_fdset_fd) {
2188             goto error;
2189         }
2190         monitor_fdset_cleanup(mon_fdset);
2191         return;
2192     }
2193
2194 error:
2195     if (has_fd) {
2196         snprintf(fd_str, sizeof(fd_str), "fdset-id:%" PRId64 ", fd:%" PRId64,
2197                  fdset_id, fd);
2198     } else {
2199         snprintf(fd_str, sizeof(fd_str), "fdset-id:%" PRId64, fdset_id);
2200     }
2201     error_set(errp, QERR_FD_NOT_FOUND, fd_str);
2202 }
2203
2204 FdsetInfoList *qmp_query_fdsets(Error **errp)
2205 {
2206     MonFdset *mon_fdset;
2207     MonFdsetFd *mon_fdset_fd;
2208     FdsetInfoList *fdset_list = NULL;
2209
2210     QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2211         FdsetInfoList *fdset_info = g_malloc0(sizeof(*fdset_info));
2212         FdsetFdInfoList *fdsetfd_list = NULL;
2213
2214         fdset_info->value = g_malloc0(sizeof(*fdset_info->value));
2215         fdset_info->value->fdset_id = mon_fdset->id;
2216
2217         QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
2218             FdsetFdInfoList *fdsetfd_info;
2219
2220             fdsetfd_info = g_malloc0(sizeof(*fdsetfd_info));
2221             fdsetfd_info->value = g_malloc0(sizeof(*fdsetfd_info->value));
2222             fdsetfd_info->value->fd = mon_fdset_fd->fd;
2223             if (mon_fdset_fd->opaque) {
2224                 fdsetfd_info->value->has_opaque = true;
2225                 fdsetfd_info->value->opaque = g_strdup(mon_fdset_fd->opaque);
2226             } else {
2227                 fdsetfd_info->value->has_opaque = false;
2228             }
2229
2230             fdsetfd_info->next = fdsetfd_list;
2231             fdsetfd_list = fdsetfd_info;
2232         }
2233
2234         fdset_info->value->fds = fdsetfd_list;
2235
2236         fdset_info->next = fdset_list;
2237         fdset_list = fdset_info;
2238     }
2239
2240     return fdset_list;
2241 }
2242
2243 AddfdInfo *monitor_fdset_add_fd(int fd, bool has_fdset_id, int64_t fdset_id,
2244                                 bool has_opaque, const char *opaque,
2245                                 Error **errp)
2246 {
2247     MonFdset *mon_fdset = NULL;
2248     MonFdsetFd *mon_fdset_fd;
2249     AddfdInfo *fdinfo;
2250
2251     if (has_fdset_id) {
2252         QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2253             /* Break if match found or match impossible due to ordering by ID */
2254             if (fdset_id <= mon_fdset->id) {
2255                 if (fdset_id < mon_fdset->id) {
2256                     mon_fdset = NULL;
2257                 }
2258                 break;
2259             }
2260         }
2261     }
2262
2263     if (mon_fdset == NULL) {
2264         int64_t fdset_id_prev = -1;
2265         MonFdset *mon_fdset_cur = QLIST_FIRST(&mon_fdsets);
2266
2267         if (has_fdset_id) {
2268             if (fdset_id < 0) {
2269                 error_set(errp, QERR_INVALID_PARAMETER_VALUE, "fdset-id",
2270                           "a non-negative value");
2271                 return NULL;
2272             }
2273             /* Use specified fdset ID */
2274             QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2275                 mon_fdset_cur = mon_fdset;
2276                 if (fdset_id < mon_fdset_cur->id) {
2277                     break;
2278                 }
2279             }
2280         } else {
2281             /* Use first available fdset ID */
2282             QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2283                 mon_fdset_cur = mon_fdset;
2284                 if (fdset_id_prev == mon_fdset_cur->id - 1) {
2285                     fdset_id_prev = mon_fdset_cur->id;
2286                     continue;
2287                 }
2288                 break;
2289             }
2290         }
2291
2292         mon_fdset = g_malloc0(sizeof(*mon_fdset));
2293         if (has_fdset_id) {
2294             mon_fdset->id = fdset_id;
2295         } else {
2296             mon_fdset->id = fdset_id_prev + 1;
2297         }
2298
2299         /* The fdset list is ordered by fdset ID */
2300         if (!mon_fdset_cur) {
2301             QLIST_INSERT_HEAD(&mon_fdsets, mon_fdset, next);
2302         } else if (mon_fdset->id < mon_fdset_cur->id) {
2303             QLIST_INSERT_BEFORE(mon_fdset_cur, mon_fdset, next);
2304         } else {
2305             QLIST_INSERT_AFTER(mon_fdset_cur, mon_fdset, next);
2306         }
2307     }
2308
2309     mon_fdset_fd = g_malloc0(sizeof(*mon_fdset_fd));
2310     mon_fdset_fd->fd = fd;
2311     mon_fdset_fd->removed = false;
2312     if (has_opaque) {
2313         mon_fdset_fd->opaque = g_strdup(opaque);
2314     }
2315     QLIST_INSERT_HEAD(&mon_fdset->fds, mon_fdset_fd, next);
2316
2317     fdinfo = g_malloc0(sizeof(*fdinfo));
2318     fdinfo->fdset_id = mon_fdset->id;
2319     fdinfo->fd = mon_fdset_fd->fd;
2320
2321     return fdinfo;
2322 }
2323
2324 int monitor_fdset_get_fd(int64_t fdset_id, int flags)
2325 {
2326 #ifndef _WIN32
2327     MonFdset *mon_fdset;
2328     MonFdsetFd *mon_fdset_fd;
2329     int mon_fd_flags;
2330
2331     QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2332         if (mon_fdset->id != fdset_id) {
2333             continue;
2334         }
2335         QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
2336             mon_fd_flags = fcntl(mon_fdset_fd->fd, F_GETFL);
2337             if (mon_fd_flags == -1) {
2338                 return -1;
2339             }
2340
2341             if ((flags & O_ACCMODE) == (mon_fd_flags & O_ACCMODE)) {
2342                 return mon_fdset_fd->fd;
2343             }
2344         }
2345         errno = EACCES;
2346         return -1;
2347     }
2348 #endif
2349
2350     errno = ENOENT;
2351     return -1;
2352 }
2353
2354 int monitor_fdset_dup_fd_add(int64_t fdset_id, int dup_fd)
2355 {
2356     MonFdset *mon_fdset;
2357     MonFdsetFd *mon_fdset_fd_dup;
2358
2359     QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2360         if (mon_fdset->id != fdset_id) {
2361             continue;
2362         }
2363         QLIST_FOREACH(mon_fdset_fd_dup, &mon_fdset->dup_fds, next) {
2364             if (mon_fdset_fd_dup->fd == dup_fd) {
2365                 return -1;
2366             }
2367         }
2368         mon_fdset_fd_dup = g_malloc0(sizeof(*mon_fdset_fd_dup));
2369         mon_fdset_fd_dup->fd = dup_fd;
2370         QLIST_INSERT_HEAD(&mon_fdset->dup_fds, mon_fdset_fd_dup, next);
2371         return 0;
2372     }
2373     return -1;
2374 }
2375
2376 static int monitor_fdset_dup_fd_find_remove(int dup_fd, bool remove)
2377 {
2378     MonFdset *mon_fdset;
2379     MonFdsetFd *mon_fdset_fd_dup;
2380
2381     QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2382         QLIST_FOREACH(mon_fdset_fd_dup, &mon_fdset->dup_fds, next) {
2383             if (mon_fdset_fd_dup->fd == dup_fd) {
2384                 if (remove) {
2385                     QLIST_REMOVE(mon_fdset_fd_dup, next);
2386                     if (QLIST_EMPTY(&mon_fdset->dup_fds)) {
2387                         monitor_fdset_cleanup(mon_fdset);
2388                     }
2389                 }
2390                 return mon_fdset->id;
2391             }
2392         }
2393     }
2394     return -1;
2395 }
2396
2397 int monitor_fdset_dup_fd_find(int dup_fd)
2398 {
2399     return monitor_fdset_dup_fd_find_remove(dup_fd, false);
2400 }
2401
2402 int monitor_fdset_dup_fd_remove(int dup_fd)
2403 {
2404     return monitor_fdset_dup_fd_find_remove(dup_fd, true);
2405 }
2406
2407 int monitor_handle_fd_param(Monitor *mon, const char *fdname)
2408 {
2409     int fd;
2410     Error *local_err = NULL;
2411
2412     if (!qemu_isdigit(fdname[0]) && mon) {
2413
2414         fd = monitor_get_fd(mon, fdname, &local_err);
2415         if (fd == -1) {
2416             qerror_report_err(local_err);
2417             error_free(local_err);
2418             return -1;
2419         }
2420     } else {
2421         fd = qemu_parse_fd(fdname);
2422     }
2423
2424     return fd;
2425 }
2426
2427 /* mon_cmds and info_cmds would be sorted at runtime */
2428 static mon_cmd_t mon_cmds[] = {
2429 #include "hmp-commands.h"
2430     { NULL, NULL, },
2431 };
2432
2433 /* Please update hmp-commands.hx when adding or changing commands */
2434 static mon_cmd_t info_cmds[] = {
2435     {
2436         .name       = "version",
2437         .args_type  = "",
2438         .params     = "",
2439         .help       = "show the version of QEMU",
2440         .mhandler.info = hmp_info_version,
2441     },
2442     {
2443         .name       = "network",
2444         .args_type  = "",
2445         .params     = "",
2446         .help       = "show the network state",
2447         .mhandler.info = do_info_network,
2448     },
2449     {
2450         .name       = "chardev",
2451         .args_type  = "",
2452         .params     = "",
2453         .help       = "show the character devices",
2454         .mhandler.info = hmp_info_chardev,
2455     },
2456     {
2457         .name       = "block",
2458         .args_type  = "",
2459         .params     = "",
2460         .help       = "show the block devices",
2461         .mhandler.info = hmp_info_block,
2462     },
2463     {
2464         .name       = "blockstats",
2465         .args_type  = "",
2466         .params     = "",
2467         .help       = "show block device statistics",
2468         .mhandler.info = hmp_info_blockstats,
2469     },
2470     {
2471         .name       = "block-jobs",
2472         .args_type  = "",
2473         .params     = "",
2474         .help       = "show progress of ongoing block device operations",
2475         .mhandler.info = hmp_info_block_jobs,
2476     },
2477     {
2478         .name       = "registers",
2479         .args_type  = "",
2480         .params     = "",
2481         .help       = "show the cpu registers",
2482         .mhandler.info = do_info_registers,
2483     },
2484     {
2485         .name       = "cpus",
2486         .args_type  = "",
2487         .params     = "",
2488         .help       = "show infos for each CPU",
2489         .mhandler.info = hmp_info_cpus,
2490     },
2491     {
2492         .name       = "history",
2493         .args_type  = "",
2494         .params     = "",
2495         .help       = "show the command line history",
2496         .mhandler.info = do_info_history,
2497     },
2498 #if defined(TARGET_I386) || defined(TARGET_PPC) || defined(TARGET_MIPS) || \
2499     defined(TARGET_LM32) || (defined(TARGET_SPARC) && !defined(TARGET_SPARC64))
2500     {
2501         .name       = "irq",
2502         .args_type  = "",
2503         .params     = "",
2504         .help       = "show the interrupts statistics (if available)",
2505 #ifdef TARGET_SPARC
2506         .mhandler.info = sun4m_irq_info,
2507 #elif defined(TARGET_LM32)
2508         .mhandler.info = lm32_irq_info,
2509 #else
2510         .mhandler.info = irq_info,
2511 #endif
2512     },
2513     {
2514         .name       = "pic",
2515         .args_type  = "",
2516         .params     = "",
2517         .help       = "show i8259 (PIC) state",
2518 #ifdef TARGET_SPARC
2519         .mhandler.info = sun4m_pic_info,
2520 #elif defined(TARGET_LM32)
2521         .mhandler.info = lm32_do_pic_info,
2522 #else
2523         .mhandler.info = pic_info,
2524 #endif
2525     },
2526 #endif
2527     {
2528         .name       = "pci",
2529         .args_type  = "",
2530         .params     = "",
2531         .help       = "show PCI info",
2532         .mhandler.info = hmp_info_pci,
2533     },
2534 #if defined(TARGET_I386) || defined(TARGET_SH4) || defined(TARGET_SPARC) || \
2535     defined(TARGET_PPC) || defined(TARGET_XTENSA)
2536     {
2537         .name       = "tlb",
2538         .args_type  = "",
2539         .params     = "",
2540         .help       = "show virtual to physical memory mappings",
2541         .mhandler.info = tlb_info,
2542     },
2543 #endif
2544 #if defined(TARGET_I386)
2545     {
2546         .name       = "mem",
2547         .args_type  = "",
2548         .params     = "",
2549         .help       = "show the active virtual memory mappings",
2550         .mhandler.info = mem_info,
2551     },
2552 #endif
2553     {
2554         .name       = "mtree",
2555         .args_type  = "",
2556         .params     = "",
2557         .help       = "show memory tree",
2558         .mhandler.info = do_info_mtree,
2559     },
2560     {
2561         .name       = "jit",
2562         .args_type  = "",
2563         .params     = "",
2564         .help       = "show dynamic compiler info",
2565         .mhandler.info = do_info_jit,
2566     },
2567     {
2568         .name       = "kvm",
2569         .args_type  = "",
2570         .params     = "",
2571         .help       = "show KVM information",
2572         .mhandler.info = hmp_info_kvm,
2573     },
2574     {
2575         .name       = "numa",
2576         .args_type  = "",
2577         .params     = "",
2578         .help       = "show NUMA information",
2579         .mhandler.info = do_info_numa,
2580     },
2581     {
2582         .name       = "usb",
2583         .args_type  = "",
2584         .params     = "",
2585         .help       = "show guest USB devices",
2586         .mhandler.info = usb_info,
2587     },
2588     {
2589         .name       = "usbhost",
2590         .args_type  = "",
2591         .params     = "",
2592         .help       = "show host USB devices",
2593         .mhandler.info = usb_host_info,
2594     },
2595     {
2596         .name       = "profile",
2597         .args_type  = "",
2598         .params     = "",
2599         .help       = "show profiling information",
2600         .mhandler.info = do_info_profile,
2601     },
2602     {
2603         .name       = "capture",
2604         .args_type  = "",
2605         .params     = "",
2606         .help       = "show capture information",
2607         .mhandler.info = do_info_capture,
2608     },
2609     {
2610         .name       = "snapshots",
2611         .args_type  = "",
2612         .params     = "",
2613         .help       = "show the currently saved VM snapshots",
2614         .mhandler.info = do_info_snapshots,
2615     },
2616     {
2617         .name       = "status",
2618         .args_type  = "",
2619         .params     = "",
2620         .help       = "show the current VM status (running|paused)",
2621         .mhandler.info = hmp_info_status,
2622     },
2623     {
2624         .name       = "pcmcia",
2625         .args_type  = "",
2626         .params     = "",
2627         .help       = "show guest PCMCIA status",
2628         .mhandler.info = pcmcia_info,
2629     },
2630     {
2631         .name       = "mice",
2632         .args_type  = "",
2633         .params     = "",
2634         .help       = "show which guest mouse is receiving events",
2635         .mhandler.info = hmp_info_mice,
2636     },
2637     {
2638         .name       = "vnc",
2639         .args_type  = "",
2640         .params     = "",
2641         .help       = "show the vnc server status",
2642         .mhandler.info = hmp_info_vnc,
2643     },
2644 #if defined(CONFIG_SPICE)
2645     {
2646         .name       = "spice",
2647         .args_type  = "",
2648         .params     = "",
2649         .help       = "show the spice server status",
2650         .mhandler.info = hmp_info_spice,
2651     },
2652 #endif
2653     {
2654         .name       = "name",
2655         .args_type  = "",
2656         .params     = "",
2657         .help       = "show the current VM name",
2658         .mhandler.info = hmp_info_name,
2659     },
2660     {
2661         .name       = "uuid",
2662         .args_type  = "",
2663         .params     = "",
2664         .help       = "show the current VM UUID",
2665         .mhandler.info = hmp_info_uuid,
2666     },
2667 #if defined(TARGET_PPC)
2668     {
2669         .name       = "cpustats",
2670         .args_type  = "",
2671         .params     = "",
2672         .help       = "show CPU statistics",
2673         .mhandler.info = do_info_cpu_stats,
2674     },
2675 #endif
2676 #if defined(CONFIG_SLIRP)
2677     {
2678         .name       = "usernet",
2679         .args_type  = "",
2680         .params     = "",
2681         .help       = "show user network stack connection states",
2682         .mhandler.info = do_info_usernet,
2683     },
2684 #endif
2685     {
2686         .name       = "migrate",
2687         .args_type  = "",
2688         .params     = "",
2689         .help       = "show migration status",
2690         .mhandler.info = hmp_info_migrate,
2691     },
2692     {
2693         .name       = "migrate_capabilities",
2694         .args_type  = "",
2695         .params     = "",
2696         .help       = "show current migration capabilities",
2697         .mhandler.info = hmp_info_migrate_capabilities,
2698     },
2699     {
2700         .name       = "migrate_cache_size",
2701         .args_type  = "",
2702         .params     = "",
2703         .help       = "show current migration xbzrle cache size",
2704         .mhandler.info = hmp_info_migrate_cache_size,
2705     },
2706     {
2707         .name       = "balloon",
2708         .args_type  = "",
2709         .params     = "",
2710         .help       = "show balloon information",
2711         .mhandler.info = hmp_info_balloon,
2712     },
2713     {
2714         .name       = "qtree",
2715         .args_type  = "",
2716         .params     = "",
2717         .help       = "show device tree",
2718         .mhandler.info = do_info_qtree,
2719     },
2720     {
2721         .name       = "qdm",
2722         .args_type  = "",
2723         .params     = "",
2724         .help       = "show qdev device model list",
2725         .mhandler.info = do_info_qdm,
2726     },
2727     {
2728         .name       = "roms",
2729         .args_type  = "",
2730         .params     = "",
2731         .help       = "show roms",
2732         .mhandler.info = do_info_roms,
2733     },
2734     {
2735         .name       = "trace-events",
2736         .args_type  = "",
2737         .params     = "",
2738         .help       = "show available trace-events & their state",
2739         .mhandler.info = do_trace_print_events,
2740     },
2741     {
2742         .name       = NULL,
2743     },
2744 };
2745
2746 static const mon_cmd_t qmp_cmds[] = {
2747 #include "qmp-commands-old.h"
2748     { /* NULL */ },
2749 };
2750
2751 /*******************************************************************/
2752
2753 static const char *pch;
2754 static jmp_buf expr_env;
2755
2756 #define MD_TLONG 0
2757 #define MD_I32   1
2758
2759 typedef struct MonitorDef {
2760     const char *name;
2761     int offset;
2762     target_long (*get_value)(const struct MonitorDef *md, int val);
2763     int type;
2764 } MonitorDef;
2765
2766 #if defined(TARGET_I386)
2767 static target_long monitor_get_pc (const struct MonitorDef *md, int val)
2768 {
2769     CPUArchState *env = mon_get_cpu();
2770     return env->eip + env->segs[R_CS].base;
2771 }
2772 #endif
2773
2774 #if defined(TARGET_PPC)
2775 static target_long monitor_get_ccr (const struct MonitorDef *md, int val)
2776 {
2777     CPUArchState *env = mon_get_cpu();
2778     unsigned int u;
2779     int i;
2780
2781     u = 0;
2782     for (i = 0; i < 8; i++)
2783         u |= env->crf[i] << (32 - (4 * i));
2784
2785     return u;
2786 }
2787
2788 static target_long monitor_get_msr (const struct MonitorDef *md, int val)
2789 {
2790     CPUArchState *env = mon_get_cpu();
2791     return env->msr;
2792 }
2793
2794 static target_long monitor_get_xer (const struct MonitorDef *md, int val)
2795 {
2796     CPUArchState *env = mon_get_cpu();
2797     return env->xer;
2798 }
2799
2800 static target_long monitor_get_decr (const struct MonitorDef *md, int val)
2801 {
2802     CPUArchState *env = mon_get_cpu();
2803     return cpu_ppc_load_decr(env);
2804 }
2805
2806 static target_long monitor_get_tbu (const struct MonitorDef *md, int val)
2807 {
2808     CPUArchState *env = mon_get_cpu();
2809     return cpu_ppc_load_tbu(env);
2810 }
2811
2812 static target_long monitor_get_tbl (const struct MonitorDef *md, int val)
2813 {
2814     CPUArchState *env = mon_get_cpu();
2815     return cpu_ppc_load_tbl(env);
2816 }
2817 #endif
2818
2819 #if defined(TARGET_SPARC)
2820 #ifndef TARGET_SPARC64
2821 static target_long monitor_get_psr (const struct MonitorDef *md, int val)
2822 {
2823     CPUArchState *env = mon_get_cpu();
2824
2825     return cpu_get_psr(env);
2826 }
2827 #endif
2828
2829 static target_long monitor_get_reg(const struct MonitorDef *md, int val)
2830 {
2831     CPUArchState *env = mon_get_cpu();
2832     return env->regwptr[val];
2833 }
2834 #endif
2835
2836 static const MonitorDef monitor_defs[] = {
2837 #ifdef TARGET_I386
2838
2839 #define SEG(name, seg) \
2840     { name, offsetof(CPUX86State, segs[seg].selector), NULL, MD_I32 },\
2841     { name ".base", offsetof(CPUX86State, segs[seg].base) },\
2842     { name ".limit", offsetof(CPUX86State, segs[seg].limit), NULL, MD_I32 },
2843
2844     { "eax", offsetof(CPUX86State, regs[0]) },
2845     { "ecx", offsetof(CPUX86State, regs[1]) },
2846     { "edx", offsetof(CPUX86State, regs[2]) },
2847     { "ebx", offsetof(CPUX86State, regs[3]) },
2848     { "esp|sp", offsetof(CPUX86State, regs[4]) },
2849     { "ebp|fp", offsetof(CPUX86State, regs[5]) },
2850     { "esi", offsetof(CPUX86State, regs[6]) },
2851     { "edi", offsetof(CPUX86State, regs[7]) },
2852 #ifdef TARGET_X86_64
2853     { "r8", offsetof(CPUX86State, regs[8]) },
2854     { "r9", offsetof(CPUX86State, regs[9]) },
2855     { "r10", offsetof(CPUX86State, regs[10]) },
2856     { "r11", offsetof(CPUX86State, regs[11]) },
2857     { "r12", offsetof(CPUX86State, regs[12]) },
2858     { "r13", offsetof(CPUX86State, regs[13]) },
2859     { "r14", offsetof(CPUX86State, regs[14]) },
2860     { "r15", offsetof(CPUX86State, regs[15]) },
2861 #endif
2862     { "eflags", offsetof(CPUX86State, eflags) },
2863     { "eip", offsetof(CPUX86State, eip) },
2864     SEG("cs", R_CS)
2865     SEG("ds", R_DS)
2866     SEG("es", R_ES)
2867     SEG("ss", R_SS)
2868     SEG("fs", R_FS)
2869     SEG("gs", R_GS)
2870     { "pc", 0, monitor_get_pc, },
2871 #elif defined(TARGET_PPC)
2872     /* General purpose registers */
2873     { "r0", offsetof(CPUPPCState, gpr[0]) },
2874     { "r1", offsetof(CPUPPCState, gpr[1]) },
2875     { "r2", offsetof(CPUPPCState, gpr[2]) },
2876     { "r3", offsetof(CPUPPCState, gpr[3]) },
2877     { "r4", offsetof(CPUPPCState, gpr[4]) },
2878     { "r5", offsetof(CPUPPCState, gpr[5]) },
2879     { "r6", offsetof(CPUPPCState, gpr[6]) },
2880     { "r7", offsetof(CPUPPCState, gpr[7]) },
2881     { "r8", offsetof(CPUPPCState, gpr[8]) },
2882     { "r9", offsetof(CPUPPCState, gpr[9]) },
2883     { "r10", offsetof(CPUPPCState, gpr[10]) },
2884     { "r11", offsetof(CPUPPCState, gpr[11]) },
2885     { "r12", offsetof(CPUPPCState, gpr[12]) },
2886     { "r13", offsetof(CPUPPCState, gpr[13]) },
2887     { "r14", offsetof(CPUPPCState, gpr[14]) },
2888     { "r15", offsetof(CPUPPCState, gpr[15]) },
2889     { "r16", offsetof(CPUPPCState, gpr[16]) },
2890     { "r17", offsetof(CPUPPCState, gpr[17]) },
2891     { "r18", offsetof(CPUPPCState, gpr[18]) },
2892     { "r19", offsetof(CPUPPCState, gpr[19]) },
2893     { "r20", offsetof(CPUPPCState, gpr[20]) },
2894     { "r21", offsetof(CPUPPCState, gpr[21]) },
2895     { "r22", offsetof(CPUPPCState, gpr[22]) },
2896     { "r23", offsetof(CPUPPCState, gpr[23]) },
2897     { "r24", offsetof(CPUPPCState, gpr[24]) },
2898     { "r25", offsetof(CPUPPCState, gpr[25]) },
2899     { "r26", offsetof(CPUPPCState, gpr[26]) },
2900     { "r27", offsetof(CPUPPCState, gpr[27]) },
2901     { "r28", offsetof(CPUPPCState, gpr[28]) },
2902     { "r29", offsetof(CPUPPCState, gpr[29]) },
2903     { "r30", offsetof(CPUPPCState, gpr[30]) },
2904     { "r31", offsetof(CPUPPCState, gpr[31]) },
2905     /* Floating point registers */
2906     { "f0", offsetof(CPUPPCState, fpr[0]) },
2907     { "f1", offsetof(CPUPPCState, fpr[1]) },
2908     { "f2", offsetof(CPUPPCState, fpr[2]) },
2909     { "f3", offsetof(CPUPPCState, fpr[3]) },
2910     { "f4", offsetof(CPUPPCState, fpr[4]) },
2911     { "f5", offsetof(CPUPPCState, fpr[5]) },
2912     { "f6", offsetof(CPUPPCState, fpr[6]) },
2913     { "f7", offsetof(CPUPPCState, fpr[7]) },
2914     { "f8", offsetof(CPUPPCState, fpr[8]) },
2915     { "f9", offsetof(CPUPPCState, fpr[9]) },
2916     { "f10", offsetof(CPUPPCState, fpr[10]) },
2917     { "f11", offsetof(CPUPPCState, fpr[11]) },
2918     { "f12", offsetof(CPUPPCState, fpr[12]) },
2919     { "f13", offsetof(CPUPPCState, fpr[13]) },
2920     { "f14", offsetof(CPUPPCState, fpr[14]) },
2921     { "f15", offsetof(CPUPPCState, fpr[15]) },
2922     { "f16", offsetof(CPUPPCState, fpr[16]) },
2923     { "f17", offsetof(CPUPPCState, fpr[17]) },
2924     { "f18", offsetof(CPUPPCState, fpr[18]) },
2925     { "f19", offsetof(CPUPPCState, fpr[19]) },
2926     { "f20", offsetof(CPUPPCState, fpr[20]) },
2927     { "f21", offsetof(CPUPPCState, fpr[21]) },
2928     { "f22", offsetof(CPUPPCState, fpr[22]) },
2929     { "f23", offsetof(CPUPPCState, fpr[23]) },
2930     { "f24", offsetof(CPUPPCState, fpr[24]) },
2931     { "f25", offsetof(CPUPPCState, fpr[25]) },
2932     { "f26", offsetof(CPUPPCState, fpr[26]) },
2933     { "f27", offsetof(CPUPPCState, fpr[27]) },
2934     { "f28", offsetof(CPUPPCState, fpr[28]) },
2935     { "f29", offsetof(CPUPPCState, fpr[29]) },
2936     { "f30", offsetof(CPUPPCState, fpr[30]) },
2937     { "f31", offsetof(CPUPPCState, fpr[31]) },
2938     { "fpscr", offsetof(CPUPPCState, fpscr) },
2939     /* Next instruction pointer */
2940     { "nip|pc", offsetof(CPUPPCState, nip) },
2941     { "lr", offsetof(CPUPPCState, lr) },
2942     { "ctr", offsetof(CPUPPCState, ctr) },
2943     { "decr", 0, &monitor_get_decr, },
2944     { "ccr", 0, &monitor_get_ccr, },
2945     /* Machine state register */
2946     { "msr", 0, &monitor_get_msr, },
2947     { "xer", 0, &monitor_get_xer, },
2948     { "tbu", 0, &monitor_get_tbu, },
2949     { "tbl", 0, &monitor_get_tbl, },
2950 #if defined(TARGET_PPC64)
2951     /* Address space register */
2952     { "asr", offsetof(CPUPPCState, asr) },
2953 #endif
2954     /* Segment registers */
2955     { "sdr1", offsetof(CPUPPCState, spr[SPR_SDR1]) },
2956     { "sr0", offsetof(CPUPPCState, sr[0]) },
2957     { "sr1", offsetof(CPUPPCState, sr[1]) },
2958     { "sr2", offsetof(CPUPPCState, sr[2]) },
2959     { "sr3", offsetof(CPUPPCState, sr[3]) },
2960     { "sr4", offsetof(CPUPPCState, sr[4]) },
2961     { "sr5", offsetof(CPUPPCState, sr[5]) },
2962     { "sr6", offsetof(CPUPPCState, sr[6]) },
2963     { "sr7", offsetof(CPUPPCState, sr[7]) },
2964     { "sr8", offsetof(CPUPPCState, sr[8]) },
2965     { "sr9", offsetof(CPUPPCState, sr[9]) },
2966     { "sr10", offsetof(CPUPPCState, sr[10]) },
2967     { "sr11", offsetof(CPUPPCState, sr[11]) },
2968     { "sr12", offsetof(CPUPPCState, sr[12]) },
2969     { "sr13", offsetof(CPUPPCState, sr[13]) },
2970     { "sr14", offsetof(CPUPPCState, sr[14]) },
2971     { "sr15", offsetof(CPUPPCState, sr[15]) },
2972     /* Too lazy to put BATs... */
2973     { "pvr", offsetof(CPUPPCState, spr[SPR_PVR]) },
2974
2975     { "srr0", offsetof(CPUPPCState, spr[SPR_SRR0]) },
2976     { "srr1", offsetof(CPUPPCState, spr[SPR_SRR1]) },
2977     { "sprg0", offsetof(CPUPPCState, spr[SPR_SPRG0]) },
2978     { "sprg1", offsetof(CPUPPCState, spr[SPR_SPRG1]) },
2979     { "sprg2", offsetof(CPUPPCState, spr[SPR_SPRG2]) },
2980     { "sprg3", offsetof(CPUPPCState, spr[SPR_SPRG3]) },
2981     { "sprg4", offsetof(CPUPPCState, spr[SPR_SPRG4]) },
2982     { "sprg5", offsetof(CPUPPCState, spr[SPR_SPRG5]) },
2983     { "sprg6", offsetof(CPUPPCState, spr[SPR_SPRG6]) },
2984     { "sprg7", offsetof(CPUPPCState, spr[SPR_SPRG7]) },
2985     { "pid", offsetof(CPUPPCState, spr[SPR_BOOKE_PID]) },
2986     { "csrr0", offsetof(CPUPPCState, spr[SPR_BOOKE_CSRR0]) },
2987     { "csrr1", offsetof(CPUPPCState, spr[SPR_BOOKE_CSRR1]) },
2988     { "esr", offsetof(CPUPPCState, spr[SPR_BOOKE_ESR]) },
2989     { "dear", offsetof(CPUPPCState, spr[SPR_BOOKE_DEAR]) },
2990     { "mcsr", offsetof(CPUPPCState, spr[SPR_BOOKE_MCSR]) },
2991     { "tsr", offsetof(CPUPPCState, spr[SPR_BOOKE_TSR]) },
2992     { "tcr", offsetof(CPUPPCState, spr[SPR_BOOKE_TCR]) },
2993     { "vrsave", offsetof(CPUPPCState, spr[SPR_VRSAVE]) },
2994     { "pir", offsetof(CPUPPCState, spr[SPR_BOOKE_PIR]) },
2995     { "mcsrr0", offsetof(CPUPPCState, spr[SPR_BOOKE_MCSRR0]) },
2996     { "mcsrr1", offsetof(CPUPPCState, spr[SPR_BOOKE_MCSRR1]) },
2997     { "decar", offsetof(CPUPPCState, spr[SPR_BOOKE_DECAR]) },
2998     { "ivpr", offsetof(CPUPPCState, spr[SPR_BOOKE_IVPR]) },
2999     { "epcr", offsetof(CPUPPCState, spr[SPR_BOOKE_EPCR]) },
3000     { "sprg8", offsetof(CPUPPCState, spr[SPR_BOOKE_SPRG8]) },
3001     { "ivor0", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR0]) },
3002     { "ivor1", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR1]) },
3003     { "ivor2", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR2]) },
3004     { "ivor3", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR3]) },
3005     { "ivor4", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR4]) },
3006     { "ivor5", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR5]) },
3007     { "ivor6", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR6]) },
3008     { "ivor7", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR7]) },
3009     { "ivor8", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR8]) },
3010     { "ivor9", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR9]) },
3011     { "ivor10", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR10]) },
3012     { "ivor11", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR11]) },
3013     { "ivor12", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR12]) },
3014     { "ivor13", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR13]) },
3015     { "ivor14", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR14]) },
3016     { "ivor15", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR15]) },
3017     { "ivor32", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR32]) },
3018     { "ivor33", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR33]) },
3019     { "ivor34", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR34]) },
3020     { "ivor35", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR35]) },
3021     { "ivor36", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR36]) },
3022     { "ivor37", offsetof(CPUPPCState, spr[SPR_BOOKE_IVOR37]) },
3023     { "mas0", offsetof(CPUPPCState, spr[SPR_BOOKE_MAS0]) },
3024     { "mas1", offsetof(CPUPPCState, spr[SPR_BOOKE_MAS1]) },
3025     { "mas2", offsetof(CPUPPCState, spr[SPR_BOOKE_MAS2]) },
3026     { "mas3", offsetof(CPUPPCState, spr[SPR_BOOKE_MAS3]) },
3027     { "mas4", offsetof(CPUPPCState, spr[SPR_BOOKE_MAS4]) },
3028     { "mas6", offsetof(CPUPPCState, spr[SPR_BOOKE_MAS6]) },
3029     { "mas7", offsetof(CPUPPCState, spr[SPR_BOOKE_MAS7]) },
3030     { "mmucfg", offsetof(CPUPPCState, spr[SPR_MMUCFG]) },
3031     { "tlb0cfg", offsetof(CPUPPCState, spr[SPR_BOOKE_TLB0CFG]) },
3032     { "tlb1cfg", offsetof(CPUPPCState, spr[SPR_BOOKE_TLB1CFG]) },
3033     { "epr", offsetof(CPUPPCState, spr[SPR_BOOKE_EPR]) },
3034     { "eplc", offsetof(CPUPPCState, spr[SPR_BOOKE_EPLC]) },
3035     { "epsc", offsetof(CPUPPCState, spr[SPR_BOOKE_EPSC]) },
3036     { "svr", offsetof(CPUPPCState, spr[SPR_E500_SVR]) },
3037     { "mcar", offsetof(CPUPPCState, spr[SPR_Exxx_MCAR]) },
3038     { "pid1", offsetof(CPUPPCState, spr[SPR_BOOKE_PID1]) },
3039     { "pid2", offsetof(CPUPPCState, spr[SPR_BOOKE_PID2]) },
3040     { "hid0", offsetof(CPUPPCState, spr[SPR_HID0]) },
3041
3042 #elif defined(TARGET_SPARC)
3043     { "g0", offsetof(CPUSPARCState, gregs[0]) },
3044     { "g1", offsetof(CPUSPARCState, gregs[1]) },
3045     { "g2", offsetof(CPUSPARCState, gregs[2]) },
3046     { "g3", offsetof(CPUSPARCState, gregs[3]) },
3047     { "g4", offsetof(CPUSPARCState, gregs[4]) },
3048     { "g5", offsetof(CPUSPARCState, gregs[5]) },
3049     { "g6", offsetof(CPUSPARCState, gregs[6]) },
3050     { "g7", offsetof(CPUSPARCState, gregs[7]) },
3051     { "o0", 0, monitor_get_reg },
3052     { "o1", 1, monitor_get_reg },
3053     { "o2", 2, monitor_get_reg },
3054     { "o3", 3, monitor_get_reg },
3055     { "o4", 4, monitor_get_reg },
3056     { "o5", 5, monitor_get_reg },
3057     { "o6", 6, monitor_get_reg },
3058     { "o7", 7, monitor_get_reg },
3059     { "l0", 8, monitor_get_reg },
3060     { "l1", 9, monitor_get_reg },
3061     { "l2", 10, monitor_get_reg },
3062     { "l3", 11, monitor_get_reg },
3063     { "l4", 12, monitor_get_reg },
3064     { "l5", 13, monitor_get_reg },
3065     { "l6", 14, monitor_get_reg },
3066     { "l7", 15, monitor_get_reg },
3067     { "i0", 16, monitor_get_reg },
3068     { "i1", 17, monitor_get_reg },
3069     { "i2", 18, monitor_get_reg },
3070     { "i3", 19, monitor_get_reg },
3071     { "i4", 20, monitor_get_reg },
3072     { "i5", 21, monitor_get_reg },
3073     { "i6", 22, monitor_get_reg },
3074     { "i7", 23, monitor_get_reg },
3075     { "pc", offsetof(CPUSPARCState, pc) },
3076     { "npc", offsetof(CPUSPARCState, npc) },
3077     { "y", offsetof(CPUSPARCState, y) },
3078 #ifndef TARGET_SPARC64
3079     { "psr", 0, &monitor_get_psr, },
3080     { "wim", offsetof(CPUSPARCState, wim) },
3081 #endif
3082     { "tbr", offsetof(CPUSPARCState, tbr) },
3083     { "fsr", offsetof(CPUSPARCState, fsr) },
3084     { "f0", offsetof(CPUSPARCState, fpr[0].l.upper) },
3085     { "f1", offsetof(CPUSPARCState, fpr[0].l.lower) },
3086     { "f2", offsetof(CPUSPARCState, fpr[1].l.upper) },
3087     { "f3", offsetof(CPUSPARCState, fpr[1].l.lower) },
3088     { "f4", offsetof(CPUSPARCState, fpr[2].l.upper) },
3089     { "f5", offsetof(CPUSPARCState, fpr[2].l.lower) },
3090     { "f6", offsetof(CPUSPARCState, fpr[3].l.upper) },
3091     { "f7", offsetof(CPUSPARCState, fpr[3].l.lower) },
3092     { "f8", offsetof(CPUSPARCState, fpr[4].l.upper) },
3093     { "f9", offsetof(CPUSPARCState, fpr[4].l.lower) },
3094     { "f10", offsetof(CPUSPARCState, fpr[5].l.upper) },
3095     { "f11", offsetof(CPUSPARCState, fpr[5].l.lower) },
3096     { "f12", offsetof(CPUSPARCState, fpr[6].l.upper) },
3097     { "f13", offsetof(CPUSPARCState, fpr[6].l.lower) },
3098     { "f14", offsetof(CPUSPARCState, fpr[7].l.upper) },
3099     { "f15", offsetof(CPUSPARCState, fpr[7].l.lower) },
3100     { "f16", offsetof(CPUSPARCState, fpr[8].l.upper) },
3101     { "f17", offsetof(CPUSPARCState, fpr[8].l.lower) },
3102     { "f18", offsetof(CPUSPARCState, fpr[9].l.upper) },
3103     { "f19", offsetof(CPUSPARCState, fpr[9].l.lower) },
3104     { "f20", offsetof(CPUSPARCState, fpr[10].l.upper) },
3105     { "f21", offsetof(CPUSPARCState, fpr[10].l.lower) },
3106     { "f22", offsetof(CPUSPARCState, fpr[11].l.upper) },
3107     { "f23", offsetof(CPUSPARCState, fpr[11].l.lower) },
3108     { "f24", offsetof(CPUSPARCState, fpr[12].l.upper) },
3109     { "f25", offsetof(CPUSPARCState, fpr[12].l.lower) },
3110     { "f26", offsetof(CPUSPARCState, fpr[13].l.upper) },
3111     { "f27", offsetof(CPUSPARCState, fpr[13].l.lower) },
3112     { "f28", offsetof(CPUSPARCState, fpr[14].l.upper) },
3113     { "f29", offsetof(CPUSPARCState, fpr[14].l.lower) },
3114     { "f30", offsetof(CPUSPARCState, fpr[15].l.upper) },
3115     { "f31", offsetof(CPUSPARCState, fpr[15].l.lower) },
3116 #ifdef TARGET_SPARC64
3117     { "f32", offsetof(CPUSPARCState, fpr[16]) },
3118     { "f34", offsetof(CPUSPARCState, fpr[17]) },
3119     { "f36", offsetof(CPUSPARCState, fpr[18]) },
3120     { "f38", offsetof(CPUSPARCState, fpr[19]) },
3121     { "f40", offsetof(CPUSPARCState, fpr[20]) },
3122     { "f42", offsetof(CPUSPARCState, fpr[21]) },
3123     { "f44", offsetof(CPUSPARCState, fpr[22]) },
3124     { "f46", offsetof(CPUSPARCState, fpr[23]) },
3125     { "f48", offsetof(CPUSPARCState, fpr[24]) },
3126     { "f50", offsetof(CPUSPARCState, fpr[25]) },
3127     { "f52", offsetof(CPUSPARCState, fpr[26]) },
3128     { "f54", offsetof(CPUSPARCState, fpr[27]) },
3129     { "f56", offsetof(CPUSPARCState, fpr[28]) },
3130     { "f58", offsetof(CPUSPARCState, fpr[29]) },
3131     { "f60", offsetof(CPUSPARCState, fpr[30]) },
3132     { "f62", offsetof(CPUSPARCState, fpr[31]) },
3133     { "asi", offsetof(CPUSPARCState, asi) },
3134     { "pstate", offsetof(CPUSPARCState, pstate) },
3135     { "cansave", offsetof(CPUSPARCState, cansave) },
3136     { "canrestore", offsetof(CPUSPARCState, canrestore) },
3137     { "otherwin", offsetof(CPUSPARCState, otherwin) },
3138     { "wstate", offsetof(CPUSPARCState, wstate) },
3139     { "cleanwin", offsetof(CPUSPARCState, cleanwin) },
3140     { "fprs", offsetof(CPUSPARCState, fprs) },
3141 #endif
3142 #endif
3143     { NULL },
3144 };
3145
3146 static void expr_error(Monitor *mon, const char *msg)
3147 {
3148     monitor_printf(mon, "%s\n", msg);
3149     longjmp(expr_env, 1);
3150 }
3151
3152 /* return 0 if OK, -1 if not found */
3153 static int get_monitor_def(target_long *pval, const char *name)
3154 {
3155     const MonitorDef *md;
3156     void *ptr;
3157
3158     for(md = monitor_defs; md->name != NULL; md++) {
3159         if (compare_cmd(name, md->name)) {
3160             if (md->get_value) {
3161                 *pval = md->get_value(md, md->offset);
3162             } else {
3163                 CPUArchState *env = mon_get_cpu();
3164                 ptr = (uint8_t *)env + md->offset;
3165                 switch(md->type) {
3166                 case MD_I32:
3167                     *pval = *(int32_t *)ptr;
3168                     break;
3169                 case MD_TLONG:
3170                     *pval = *(target_long *)ptr;
3171                     break;
3172                 default:
3173                     *pval = 0;
3174                     break;
3175                 }
3176             }
3177             return 0;
3178         }
3179     }
3180     return -1;
3181 }
3182
3183 static void next(void)
3184 {
3185     if (*pch != '\0') {
3186         pch++;
3187         while (qemu_isspace(*pch))
3188             pch++;
3189     }
3190 }
3191
3192 static int64_t expr_sum(Monitor *mon);
3193
3194 static int64_t expr_unary(Monitor *mon)
3195 {
3196     int64_t n;
3197     char *p;
3198     int ret;
3199
3200     switch(*pch) {
3201     case '+':
3202         next();
3203         n = expr_unary(mon);
3204         break;
3205     case '-':
3206         next();
3207         n = -expr_unary(mon);
3208         break;
3209     case '~':
3210         next();
3211         n = ~expr_unary(mon);
3212         break;
3213     case '(':
3214         next();
3215         n = expr_sum(mon);
3216         if (*pch != ')') {
3217             expr_error(mon, "')' expected");
3218         }
3219         next();
3220         break;
3221     case '\'':
3222         pch++;
3223         if (*pch == '\0')
3224             expr_error(mon, "character constant expected");
3225         n = *pch;
3226         pch++;
3227         if (*pch != '\'')
3228             expr_error(mon, "missing terminating \' character");
3229         next();
3230         break;
3231     case '$':
3232         {
3233             char buf[128], *q;
3234             target_long reg=0;
3235
3236             pch++;
3237             q = buf;
3238             while ((*pch >= 'a' && *pch <= 'z') ||
3239                    (*pch >= 'A' && *pch <= 'Z') ||
3240                    (*pch >= '0' && *pch <= '9') ||
3241                    *pch == '_' || *pch == '.') {
3242                 if ((q - buf) < sizeof(buf) - 1)
3243                     *q++ = *pch;
3244                 pch++;
3245             }
3246             while (qemu_isspace(*pch))
3247                 pch++;
3248             *q = 0;
3249             ret = get_monitor_def(&reg, buf);
3250             if (ret < 0)
3251                 expr_error(mon, "unknown register");
3252             n = reg;
3253         }
3254         break;
3255     case '\0':
3256         expr_error(mon, "unexpected end of expression");
3257         n = 0;
3258         break;
3259     default:
3260         errno = 0;
3261         n = strtoull(pch, &p, 0);
3262         if (errno == ERANGE) {
3263             expr_error(mon, "number too large");
3264         }
3265         if (pch == p) {
3266             expr_error(mon, "invalid char in expression");
3267         }
3268         pch = p;
3269         while (qemu_isspace(*pch))
3270             pch++;
3271         break;
3272     }
3273     return n;
3274 }
3275
3276
3277 static int64_t expr_prod(Monitor *mon)
3278 {
3279     int64_t val, val2;
3280     int op;
3281
3282     val = expr_unary(mon);
3283     for(;;) {
3284         op = *pch;
3285         if (op != '*' && op != '/' && op != '%')
3286             break;
3287         next();
3288         val2 = expr_unary(mon);
3289         switch(op) {
3290         default:
3291         case '*':
3292             val *= val2;
3293             break;
3294         case '/':
3295         case '%':
3296             if (val2 == 0)
3297                 expr_error(mon, "division by zero");
3298             if (op == '/')
3299                 val /= val2;
3300             else
3301                 val %= val2;
3302             break;
3303         }
3304     }
3305     return val;
3306 }
3307
3308 static int64_t expr_logic(Monitor *mon)
3309 {
3310     int64_t val, val2;
3311     int op;
3312
3313     val = expr_prod(mon);
3314     for(;;) {
3315         op = *pch;
3316         if (op != '&' && op != '|' && op != '^')
3317             break;
3318         next();
3319         val2 = expr_prod(mon);
3320         switch(op) {
3321         default:
3322         case '&':
3323             val &= val2;
3324             break;
3325         case '|':
3326             val |= val2;
3327             break;
3328         case '^':
3329             val ^= val2;
3330             break;
3331         }
3332     }
3333     return val;
3334 }
3335
3336 static int64_t expr_sum(Monitor *mon)
3337 {
3338     int64_t val, val2;
3339     int op;
3340
3341     val = expr_logic(mon);
3342     for(;;) {
3343         op = *pch;
3344         if (op != '+' && op != '-')
3345             break;
3346         next();
3347         val2 = expr_logic(mon);
3348         if (op == '+')
3349             val += val2;
3350         else
3351             val -= val2;
3352     }
3353     return val;
3354 }
3355
3356 static int get_expr(Monitor *mon, int64_t *pval, const char **pp)
3357 {
3358     pch = *pp;
3359     if (setjmp(expr_env)) {
3360         *pp = pch;
3361         return -1;
3362     }
3363     while (qemu_isspace(*pch))
3364         pch++;
3365     *pval = expr_sum(mon);
3366     *pp = pch;
3367     return 0;
3368 }
3369
3370 static int get_double(Monitor *mon, double *pval, const char **pp)
3371 {
3372     const char *p = *pp;
3373     char *tailp;
3374     double d;
3375
3376     d = strtod(p, &tailp);
3377     if (tailp == p) {
3378         monitor_printf(mon, "Number expected\n");
3379         return -1;
3380     }
3381     if (d != d || d - d != 0) {
3382         /* NaN or infinity */
3383         monitor_printf(mon, "Bad number\n");
3384         return -1;
3385     }
3386     *pval = d;
3387     *pp = tailp;
3388     return 0;
3389 }
3390
3391 static int get_str(char *buf, int buf_size, const char **pp)
3392 {
3393     const char *p;
3394     char *q;
3395     int c;
3396
3397     q = buf;
3398     p = *pp;
3399     while (qemu_isspace(*p))
3400         p++;
3401     if (*p == '\0') {
3402     fail:
3403         *q = '\0';
3404         *pp = p;
3405         return -1;
3406     }
3407     if (*p == '\"') {
3408         p++;
3409         while (*p != '\0' && *p != '\"') {
3410             if (*p == '\\') {
3411                 p++;
3412                 c = *p++;
3413                 switch(c) {
3414                 case 'n':
3415                     c = '\n';
3416                     break;
3417                 case 'r':
3418                     c = '\r';
3419                     break;
3420                 case '\\':
3421                 case '\'':
3422                 case '\"':
3423                     break;
3424                 default:
3425                     qemu_printf("unsupported escape code: '\\%c'\n", c);
3426                     goto fail;
3427                 }
3428                 if ((q - buf) < buf_size - 1) {
3429                     *q++ = c;
3430                 }
3431             } else {
3432                 if ((q - buf) < buf_size - 1) {
3433                     *q++ = *p;
3434                 }
3435                 p++;
3436             }
3437         }
3438         if (*p != '\"') {
3439             qemu_printf("unterminated string\n");
3440             goto fail;
3441         }
3442         p++;
3443     } else {
3444         while (*p != '\0' && !qemu_isspace(*p)) {
3445             if ((q - buf) < buf_size - 1) {
3446                 *q++ = *p;
3447             }
3448             p++;
3449         }
3450     }
3451     *q = '\0';
3452     *pp = p;
3453     return 0;
3454 }
3455
3456 /*
3457  * Store the command-name in cmdname, and return a pointer to
3458  * the remaining of the command string.
3459  */
3460 static const char *get_command_name(const char *cmdline,
3461                                     char *cmdname, size_t nlen)
3462 {
3463     size_t len;
3464     const char *p, *pstart;
3465
3466     p = cmdline;
3467     while (qemu_isspace(*p))
3468         p++;
3469     if (*p == '\0')
3470         return NULL;
3471     pstart = p;
3472     while (*p != '\0' && *p != '/' && !qemu_isspace(*p))
3473         p++;
3474     len = p - pstart;
3475     if (len > nlen - 1)
3476         len = nlen - 1;
3477     memcpy(cmdname, pstart, len);
3478     cmdname[len] = '\0';
3479     return p;
3480 }
3481
3482 /**
3483  * Read key of 'type' into 'key' and return the current
3484  * 'type' pointer.
3485  */
3486 static char *key_get_info(const char *type, char **key)
3487 {
3488     size_t len;
3489     char *p, *str;
3490
3491     if (*type == ',')
3492         type++;
3493
3494     p = strchr(type, ':');
3495     if (!p) {
3496         *key = NULL;
3497         return NULL;
3498     }
3499     len = p - type;
3500
3501     str = g_malloc(len + 1);
3502     memcpy(str, type, len);
3503     str[len] = '\0';
3504
3505     *key = str;
3506     return ++p;
3507 }
3508
3509 static int default_fmt_format = 'x';
3510 static int default_fmt_size = 4;
3511
3512 #define MAX_ARGS 16
3513
3514 static int is_valid_option(const char *c, const char *typestr)
3515 {
3516     char option[3];
3517   
3518     option[0] = '-';
3519     option[1] = *c;
3520     option[2] = '\0';
3521   
3522     typestr = strstr(typestr, option);
3523     return (typestr != NULL);
3524 }
3525
3526 static const mon_cmd_t *search_dispatch_table(const mon_cmd_t *disp_table,
3527                                               const char *cmdname)
3528 {
3529     const mon_cmd_t *cmd;
3530
3531     for (cmd = disp_table; cmd->name != NULL; cmd++) {
3532         if (compare_cmd(cmdname, cmd->name)) {
3533             return cmd;
3534         }
3535     }
3536
3537     return NULL;
3538 }
3539
3540 static const mon_cmd_t *monitor_find_command(const char *cmdname)
3541 {
3542     return search_dispatch_table(mon_cmds, cmdname);
3543 }
3544
3545 static const mon_cmd_t *qmp_find_cmd(const char *cmdname)
3546 {
3547     return search_dispatch_table(qmp_cmds, cmdname);
3548 }
3549
3550 static const mon_cmd_t *monitor_parse_command(Monitor *mon,
3551                                               const char *cmdline,
3552                                               QDict *qdict)
3553 {
3554     const char *p, *typestr;
3555     int c;
3556     const mon_cmd_t *cmd;
3557     char cmdname[256];
3558     char buf[1024];
3559     char *key;
3560
3561 #ifdef DEBUG
3562     monitor_printf(mon, "command='%s'\n", cmdline);
3563 #endif
3564
3565     /* extract the command name */
3566     p = get_command_name(cmdline, cmdname, sizeof(cmdname));
3567     if (!p)
3568         return NULL;
3569
3570     cmd = monitor_find_command(cmdname);
3571     if (!cmd) {
3572         monitor_printf(mon, "unknown command: '%s'\n", cmdname);
3573         return NULL;
3574     }
3575
3576     /* parse the parameters */
3577     typestr = cmd->args_type;
3578     for(;;) {
3579         typestr = key_get_info(typestr, &key);
3580         if (!typestr)
3581             break;
3582         c = *typestr;
3583         typestr++;
3584         switch(c) {
3585         case 'F':
3586         case 'B':
3587         case 's':
3588             {
3589                 int ret;
3590
3591                 while (qemu_isspace(*p))
3592                     p++;
3593                 if (*typestr == '?') {
3594                     typestr++;
3595                     if (*p == '\0') {
3596                         /* no optional string: NULL argument */
3597                         break;
3598                     }
3599                 }
3600                 ret = get_str(buf, sizeof(buf), &p);
3601                 if (ret < 0) {
3602                     switch(c) {
3603                     case 'F':
3604                         monitor_printf(mon, "%s: filename expected\n",
3605                                        cmdname);
3606                         break;
3607                     case 'B':
3608                         monitor_printf(mon, "%s: block device name expected\n",
3609                                        cmdname);
3610                         break;
3611                     default:
3612                         monitor_printf(mon, "%s: string expected\n", cmdname);
3613                         break;
3614                     }
3615                     goto fail;
3616                 }
3617                 qdict_put(qdict, key, qstring_from_str(buf));
3618             }
3619             break;
3620         case 'O':
3621             {
3622                 QemuOptsList *opts_list;
3623                 QemuOpts *opts;
3624
3625                 opts_list = qemu_find_opts(key);
3626                 if (!opts_list || opts_list->desc->name) {
3627                     goto bad_type;
3628                 }
3629                 while (qemu_isspace(*p)) {
3630                     p++;
3631                 }
3632                 if (!*p)
3633                     break;
3634                 if (get_str(buf, sizeof(buf), &p) < 0) {
3635                     goto fail;
3636                 }
3637                 opts = qemu_opts_parse(opts_list, buf, 1);
3638                 if (!opts) {
3639                     goto fail;
3640                 }
3641                 qemu_opts_to_qdict(opts, qdict);
3642                 qemu_opts_del(opts);
3643             }
3644             break;
3645         case '/':
3646             {
3647                 int count, format, size;
3648
3649                 while (qemu_isspace(*p))
3650                     p++;
3651                 if (*p == '/') {
3652                     /* format found */
3653                     p++;
3654                     count = 1;
3655                     if (qemu_isdigit(*p)) {
3656                         count = 0;
3657                         while (qemu_isdigit(*p)) {
3658                             count = count * 10 + (*p - '0');
3659                             p++;
3660                         }
3661                     }
3662                     size = -1;
3663                     format = -1;
3664                     for(;;) {
3665                         switch(*p) {
3666                         case 'o':
3667                         case 'd':
3668                         case 'u':
3669                         case 'x':
3670                         case 'i':
3671                         case 'c':
3672                             format = *p++;
3673                             break;
3674                         case 'b':
3675                             size = 1;
3676                             p++;
3677                             break;
3678                         case 'h':
3679                             size = 2;
3680                             p++;
3681                             break;
3682                         case 'w':
3683                             size = 4;
3684                             p++;
3685                             break;
3686                         case 'g':
3687                         case 'L':
3688                             size = 8;
3689                             p++;
3690                             break;
3691                         default:
3692                             goto next;
3693                         }
3694                     }
3695                 next:
3696                     if (*p != '\0' && !qemu_isspace(*p)) {
3697                         monitor_printf(mon, "invalid char in format: '%c'\n",
3698                                        *p);
3699                         goto fail;
3700                     }
3701                     if (format < 0)
3702                         format = default_fmt_format;
3703                     if (format != 'i') {
3704                         /* for 'i', not specifying a size gives -1 as size */
3705                         if (size < 0)
3706                             size = default_fmt_size;
3707                         default_fmt_size = size;
3708                     }
3709                     default_fmt_format = format;
3710                 } else {
3711                     count = 1;
3712                     format = default_fmt_format;
3713                     if (format != 'i') {
3714                         size = default_fmt_size;
3715                     } else {
3716                         size = -1;
3717                     }
3718                 }
3719                 qdict_put(qdict, "count", qint_from_int(count));
3720                 qdict_put(qdict, "format", qint_from_int(format));
3721                 qdict_put(qdict, "size", qint_from_int(size));
3722             }
3723             break;
3724         case 'i':
3725         case 'l':
3726         case 'M':
3727             {
3728                 int64_t val;
3729
3730                 while (qemu_isspace(*p))
3731                     p++;
3732                 if (*typestr == '?' || *typestr == '.') {
3733                     if (*typestr == '?') {
3734                         if (*p == '\0') {
3735                             typestr++;
3736                             break;
3737                         }
3738                     } else {
3739                         if (*p == '.') {
3740                             p++;
3741                             while (qemu_isspace(*p))
3742                                 p++;
3743                         } else {
3744                             typestr++;
3745                             break;
3746                         }
3747                     }
3748                     typestr++;
3749                 }
3750                 if (get_expr(mon, &val, &p))
3751                     goto fail;
3752                 /* Check if 'i' is greater than 32-bit */
3753                 if ((c == 'i') && ((val >> 32) & 0xffffffff)) {
3754                     monitor_printf(mon, "\'%s\' has failed: ", cmdname);
3755                     monitor_printf(mon, "integer is for 32-bit values\n");
3756                     goto fail;
3757                 } else if (c == 'M') {
3758                     if (val < 0) {
3759                         monitor_printf(mon, "enter a positive value\n");
3760                         goto fail;
3761                     }
3762                     val <<= 20;
3763                 }
3764                 qdict_put(qdict, key, qint_from_int(val));
3765             }
3766             break;
3767         case 'o':
3768             {
3769                 int64_t val;
3770                 char *end;
3771
3772                 while (qemu_isspace(*p)) {
3773                     p++;
3774                 }
3775                 if (*typestr == '?') {
3776                     typestr++;
3777                     if (*p == '\0') {
3778                         break;
3779                     }
3780                 }
3781                 val = strtosz(p, &end);
3782                 if (val < 0) {
3783                     monitor_printf(mon, "invalid size\n");
3784                     goto fail;
3785                 }
3786                 qdict_put(qdict, key, qint_from_int(val));
3787                 p = end;
3788             }
3789             break;
3790         case 'T':
3791             {
3792                 double val;
3793
3794                 while (qemu_isspace(*p))
3795                     p++;
3796                 if (*typestr == '?') {
3797                     typestr++;
3798                     if (*p == '\0') {
3799                         break;
3800                     }
3801                 }
3802                 if (get_double(mon, &val, &p) < 0) {
3803                     goto fail;
3804                 }
3805                 if (p[0] && p[1] == 's') {
3806                     switch (*p) {
3807                     case 'm':
3808                         val /= 1e3; p += 2; break;
3809                     case 'u':
3810                         val /= 1e6; p += 2; break;
3811                     case 'n':
3812                         val /= 1e9; p += 2; break;
3813                     }
3814                 }
3815                 if (*p && !qemu_isspace(*p)) {
3816                     monitor_printf(mon, "Unknown unit suffix\n");
3817                     goto fail;
3818                 }
3819                 qdict_put(qdict, key, qfloat_from_double(val));
3820             }
3821             break;
3822         case 'b':
3823             {
3824                 const char *beg;
3825                 int val;
3826
3827                 while (qemu_isspace(*p)) {
3828                     p++;
3829                 }
3830                 beg = p;
3831                 while (qemu_isgraph(*p)) {
3832                     p++;
3833                 }
3834                 if (p - beg == 2 && !memcmp(beg, "on", p - beg)) {
3835                     val = 1;
3836                 } else if (p - beg == 3 && !memcmp(beg, "off", p - beg)) {
3837                     val = 0;
3838                 } else {
3839                     monitor_printf(mon, "Expected 'on' or 'off'\n");
3840                     goto fail;
3841                 }
3842                 qdict_put(qdict, key, qbool_from_int(val));
3843             }
3844             break;
3845         case '-':
3846             {
3847                 const char *tmp = p;
3848                 int skip_key = 0;
3849                 /* option */
3850
3851                 c = *typestr++;
3852                 if (c == '\0')
3853                     goto bad_type;
3854                 while (qemu_isspace(*p))
3855                     p++;
3856                 if (*p == '-') {
3857                     p++;
3858                     if(c != *p) {
3859                         if(!is_valid_option(p, typestr)) {
3860                   
3861                             monitor_printf(mon, "%s: unsupported option -%c\n",
3862                                            cmdname, *p);
3863                             goto fail;
3864                         } else {
3865                             skip_key = 1;
3866                         }
3867                     }
3868                     if(skip_key) {
3869                         p = tmp;
3870                     } else {
3871                         /* has option */
3872                         p++;
3873                         qdict_put(qdict, key, qbool_from_int(1));
3874                     }
3875                 }
3876             }
3877             break;
3878         default:
3879         bad_type:
3880             monitor_printf(mon, "%s: unknown type '%c'\n", cmdname, c);
3881             goto fail;
3882         }
3883         g_free(key);
3884         key = NULL;
3885     }
3886     /* check that all arguments were parsed */
3887     while (qemu_isspace(*p))
3888         p++;
3889     if (*p != '\0') {
3890         monitor_printf(mon, "%s: extraneous characters at the end of line\n",
3891                        cmdname);
3892         goto fail;
3893     }
3894
3895     return cmd;
3896
3897 fail:
3898     g_free(key);
3899     return NULL;
3900 }
3901
3902 void monitor_set_error(Monitor *mon, QError *qerror)
3903 {
3904     /* report only the first error */
3905     if (!mon->error) {
3906         mon->error = qerror;
3907     } else {
3908         QDECREF(qerror);
3909     }
3910 }
3911
3912 static void handler_audit(Monitor *mon, const mon_cmd_t *cmd, int ret)
3913 {
3914     if (ret && !monitor_has_error(mon)) {
3915         /*
3916          * If it returns failure, it must have passed on error.
3917          *
3918          * Action: Report an internal error to the client if in QMP.
3919          */
3920         qerror_report(QERR_UNDEFINED_ERROR);
3921     }
3922 }
3923
3924 static void handle_user_command(Monitor *mon, const char *cmdline)
3925 {
3926     QDict *qdict;
3927     const mon_cmd_t *cmd;
3928
3929     qdict = qdict_new();
3930
3931     cmd = monitor_parse_command(mon, cmdline, qdict);
3932     if (!cmd)
3933         goto out;
3934
3935     if (handler_is_async(cmd)) {
3936         user_async_cmd_handler(mon, cmd, qdict);
3937     } else if (handler_is_qobject(cmd)) {
3938         QObject *data = NULL;
3939
3940         /* XXX: ignores the error code */
3941         cmd->mhandler.cmd_new(mon, qdict, &data);
3942         assert(!monitor_has_error(mon));
3943         if (data) {
3944             cmd->user_print(mon, data);
3945             qobject_decref(data);
3946         }
3947     } else {
3948         cmd->mhandler.cmd(mon, qdict);
3949     }
3950
3951 out:
3952     QDECREF(qdict);
3953 }
3954
3955 static void cmd_completion(const char *name, const char *list)
3956 {
3957     const char *p, *pstart;
3958     char cmd[128];
3959     int len;
3960
3961     p = list;
3962     for(;;) {
3963         pstart = p;
3964         p = strchr(p, '|');
3965         if (!p)
3966             p = pstart + strlen(pstart);
3967         len = p - pstart;
3968         if (len > sizeof(cmd) - 2)
3969             len = sizeof(cmd) - 2;
3970         memcpy(cmd, pstart, len);
3971         cmd[len] = '\0';
3972         if (name[0] == '\0' || !strncmp(name, cmd, strlen(name))) {
3973             readline_add_completion(cur_mon->rs, cmd);
3974         }
3975         if (*p == '\0')
3976             break;
3977         p++;
3978     }
3979 }
3980
3981 static void file_completion(const char *input)
3982 {
3983     DIR *ffs;
3984     struct dirent *d;
3985     char path[1024];
3986     char file[1024], file_prefix[1024];
3987     int input_path_len;
3988     const char *p;
3989
3990     p = strrchr(input, '/');
3991     if (!p) {
3992         input_path_len = 0;
3993         pstrcpy(file_prefix, sizeof(file_prefix), input);
3994         pstrcpy(path, sizeof(path), ".");
3995     } else {
3996         input_path_len = p - input + 1;
3997         memcpy(path, input, input_path_len);
3998         if (input_path_len > sizeof(path) - 1)
3999             input_path_len = sizeof(path) - 1;
4000         path[input_path_len] = '\0';
4001         pstrcpy(file_prefix, sizeof(file_prefix), p + 1);
4002     }
4003 #ifdef DEBUG_COMPLETION
4004     monitor_printf(cur_mon, "input='%s' path='%s' prefix='%s'\n",
4005                    input, path, file_prefix);
4006 #endif
4007     ffs = opendir(path);
4008     if (!ffs)
4009         return;
4010     for(;;) {
4011         struct stat sb;
4012         d = readdir(ffs);
4013         if (!d)
4014             break;
4015
4016         if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) {
4017             continue;
4018         }
4019
4020         if (strstart(d->d_name, file_prefix, NULL)) {
4021             memcpy(file, input, input_path_len);
4022             if (input_path_len < sizeof(file))
4023                 pstrcpy(file + input_path_len, sizeof(file) - input_path_len,
4024                         d->d_name);
4025             /* stat the file to find out if it's a directory.
4026              * In that case add a slash to speed up typing long paths
4027              */
4028             if (stat(file, &sb) == 0 && S_ISDIR(sb.st_mode)) {
4029                 pstrcat(file, sizeof(file), "/");
4030             }
4031             readline_add_completion(cur_mon->rs, file);
4032         }
4033     }
4034     closedir(ffs);
4035 }
4036
4037 static void block_completion_it(void *opaque, BlockDriverState *bs)
4038 {
4039     const char *name = bdrv_get_device_name(bs);
4040     const char *input = opaque;
4041
4042     if (input[0] == '\0' ||
4043         !strncmp(name, (char *)input, strlen(input))) {
4044         readline_add_completion(cur_mon->rs, name);
4045     }
4046 }
4047
4048 /* NOTE: this parser is an approximate form of the real command parser */
4049 static void parse_cmdline(const char *cmdline,
4050                          int *pnb_args, char **args)
4051 {
4052     const char *p;
4053     int nb_args, ret;
4054     char buf[1024];
4055
4056     p = cmdline;
4057     nb_args = 0;
4058     for(;;) {
4059         while (qemu_isspace(*p))
4060             p++;
4061         if (*p == '\0')
4062             break;
4063         if (nb_args >= MAX_ARGS)
4064             break;
4065         ret = get_str(buf, sizeof(buf), &p);
4066         args[nb_args] = g_strdup(buf);
4067         nb_args++;
4068         if (ret < 0)
4069             break;
4070     }
4071     *pnb_args = nb_args;
4072 }
4073
4074 static const char *next_arg_type(const char *typestr)
4075 {
4076     const char *p = strchr(typestr, ':');
4077     return (p != NULL ? ++p : typestr);
4078 }
4079
4080 static void monitor_find_completion(const char *cmdline)
4081 {
4082     const char *cmdname;
4083     char *args[MAX_ARGS];
4084     int nb_args, i, len;
4085     const char *ptype, *str;
4086     const mon_cmd_t *cmd;
4087
4088     parse_cmdline(cmdline, &nb_args, args);
4089 #ifdef DEBUG_COMPLETION
4090     for(i = 0; i < nb_args; i++) {
4091         monitor_printf(cur_mon, "arg%d = '%s'\n", i, (char *)args[i]);
4092     }
4093 #endif
4094
4095     /* if the line ends with a space, it means we want to complete the
4096        next arg */
4097     len = strlen(cmdline);
4098     if (len > 0 && qemu_isspace(cmdline[len - 1])) {
4099         if (nb_args >= MAX_ARGS) {
4100             goto cleanup;
4101         }
4102         args[nb_args++] = g_strdup("");
4103     }
4104     if (nb_args <= 1) {
4105         /* command completion */
4106         if (nb_args == 0)
4107             cmdname = "";
4108         else
4109             cmdname = args[0];
4110         readline_set_completion_index(cur_mon->rs, strlen(cmdname));
4111         for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
4112             cmd_completion(cmdname, cmd->name);
4113         }
4114     } else {
4115         /* find the command */
4116         for (cmd = mon_cmds; cmd->name != NULL; cmd++) {
4117             if (compare_cmd(args[0], cmd->name)) {
4118                 break;
4119             }
4120         }
4121         if (!cmd->name) {
4122             goto cleanup;
4123         }
4124
4125         ptype = next_arg_type(cmd->args_type);
4126         for(i = 0; i < nb_args - 2; i++) {
4127             if (*ptype != '\0') {
4128                 ptype = next_arg_type(ptype);
4129                 while (*ptype == '?')
4130                     ptype = next_arg_type(ptype);
4131             }
4132         }
4133         str = args[nb_args - 1];
4134         if (*ptype == '-' && ptype[1] != '\0') {
4135             ptype = next_arg_type(ptype);
4136         }
4137         switch(*ptype) {
4138         case 'F':
4139             /* file completion */
4140             readline_set_completion_index(cur_mon->rs, strlen(str));
4141             file_completion(str);
4142             break;
4143         case 'B':
4144             /* block device name completion */
4145             readline_set_completion_index(cur_mon->rs, strlen(str));
4146             bdrv_iterate(block_completion_it, (void *)str);
4147             break;
4148         case 's':
4149             /* XXX: more generic ? */
4150             if (!strcmp(cmd->name, "info")) {
4151                 readline_set_completion_index(cur_mon->rs, strlen(str));
4152                 for(cmd = info_cmds; cmd->name != NULL; cmd++) {
4153                     cmd_completion(str, cmd->name);
4154                 }
4155             } else if (!strcmp(cmd->name, "sendkey")) {
4156                 char *sep = strrchr(str, '-');
4157                 if (sep)
4158                     str = sep + 1;
4159                 readline_set_completion_index(cur_mon->rs, strlen(str));
4160                 for (i = 0; i < Q_KEY_CODE_MAX; i++) {
4161                     cmd_completion(str, QKeyCode_lookup[i]);
4162                 }
4163             } else if (!strcmp(cmd->name, "help|?")) {
4164                 readline_set_completion_index(cur_mon->rs, strlen(str));
4165                 for (cmd = mon_cmds; cmd->name != NULL; cmd++) {
4166                     cmd_completion(str, cmd->name);
4167                 }
4168             }
4169             break;
4170         default:
4171             break;
4172         }
4173     }
4174
4175 cleanup:
4176     for (i = 0; i < nb_args; i++) {
4177         g_free(args[i]);
4178     }
4179 }
4180
4181 static int monitor_can_read(void *opaque)
4182 {
4183     Monitor *mon = opaque;
4184
4185     return (mon->suspend_cnt == 0) ? 1 : 0;
4186 }
4187
4188 static int invalid_qmp_mode(const Monitor *mon, const char *cmd_name)
4189 {
4190     int is_cap = compare_cmd(cmd_name, "qmp_capabilities");
4191     return (qmp_cmd_mode(mon) ? is_cap : !is_cap);
4192 }
4193
4194 /*
4195  * Argument validation rules:
4196  *
4197  * 1. The argument must exist in cmd_args qdict
4198  * 2. The argument type must be the expected one
4199  *
4200  * Special case: If the argument doesn't exist in cmd_args and
4201  *               the QMP_ACCEPT_UNKNOWNS flag is set, then the
4202  *               checking is skipped for it.
4203  */
4204 static int check_client_args_type(const QDict *client_args,
4205                                   const QDict *cmd_args, int flags)
4206 {
4207     const QDictEntry *ent;
4208
4209     for (ent = qdict_first(client_args); ent;ent = qdict_next(client_args,ent)){
4210         QObject *obj;
4211         QString *arg_type;
4212         const QObject *client_arg = qdict_entry_value(ent);
4213         const char *client_arg_name = qdict_entry_key(ent);
4214
4215         obj = qdict_get(cmd_args, client_arg_name);
4216         if (!obj) {
4217             if (flags & QMP_ACCEPT_UNKNOWNS) {
4218                 /* handler accepts unknowns */
4219                 continue;
4220             }
4221             /* client arg doesn't exist */
4222             qerror_report(QERR_INVALID_PARAMETER, client_arg_name);
4223             return -1;
4224         }
4225
4226         arg_type = qobject_to_qstring(obj);
4227         assert(arg_type != NULL);
4228
4229         /* check if argument's type is correct */
4230         switch (qstring_get_str(arg_type)[0]) {
4231         case 'F':
4232         case 'B':
4233         case 's':
4234             if (qobject_type(client_arg) != QTYPE_QSTRING) {
4235                 qerror_report(QERR_INVALID_PARAMETER_TYPE, client_arg_name,
4236                               "string");
4237                 return -1;
4238             }
4239         break;
4240         case 'i':
4241         case 'l':
4242         case 'M':
4243         case 'o':
4244             if (qobject_type(client_arg) != QTYPE_QINT) {
4245                 qerror_report(QERR_INVALID_PARAMETER_TYPE, client_arg_name,
4246                               "int");
4247                 return -1; 
4248             }
4249             break;
4250         case 'T':
4251             if (qobject_type(client_arg) != QTYPE_QINT &&
4252                 qobject_type(client_arg) != QTYPE_QFLOAT) {
4253                 qerror_report(QERR_INVALID_PARAMETER_TYPE, client_arg_name,
4254                               "number");
4255                return -1; 
4256             }
4257             break;
4258         case 'b':
4259         case '-':
4260             if (qobject_type(client_arg) != QTYPE_QBOOL) {
4261                 qerror_report(QERR_INVALID_PARAMETER_TYPE, client_arg_name,
4262                               "bool");
4263                return -1; 
4264             }
4265             break;
4266         case 'O':
4267             assert(flags & QMP_ACCEPT_UNKNOWNS);
4268             break;
4269         case 'q':
4270             /* Any QObject can be passed.  */
4271             break;
4272         case '/':
4273         case '.':
4274             /*
4275              * These types are not supported by QMP and thus are not
4276              * handled here. Fall through.
4277              */
4278         default:
4279             abort();
4280         }
4281     }
4282
4283     return 0;
4284 }
4285
4286 /*
4287  * - Check if the client has passed all mandatory args
4288  * - Set special flags for argument validation
4289  */
4290 static int check_mandatory_args(const QDict *cmd_args,
4291                                 const QDict *client_args, int *flags)
4292 {
4293     const QDictEntry *ent;
4294
4295     for (ent = qdict_first(cmd_args); ent; ent = qdict_next(cmd_args, ent)) {
4296         const char *cmd_arg_name = qdict_entry_key(ent);
4297         QString *type = qobject_to_qstring(qdict_entry_value(ent));
4298         assert(type != NULL);
4299
4300         if (qstring_get_str(type)[0] == 'O') {
4301             assert((*flags & QMP_ACCEPT_UNKNOWNS) == 0);
4302             *flags |= QMP_ACCEPT_UNKNOWNS;
4303         } else if (qstring_get_str(type)[0] != '-' &&
4304                    qstring_get_str(type)[1] != '?' &&
4305                    !qdict_haskey(client_args, cmd_arg_name)) {
4306             qerror_report(QERR_MISSING_PARAMETER, cmd_arg_name);
4307             return -1;
4308         }
4309     }
4310
4311     return 0;
4312 }
4313
4314 static QDict *qdict_from_args_type(const char *args_type)
4315 {
4316     int i;
4317     QDict *qdict;
4318     QString *key, *type, *cur_qs;
4319
4320     assert(args_type != NULL);
4321
4322     qdict = qdict_new();
4323
4324     if (args_type == NULL || args_type[0] == '\0') {
4325         /* no args, empty qdict */
4326         goto out;
4327     }
4328
4329     key = qstring_new();
4330     type = qstring_new();
4331
4332     cur_qs = key;
4333
4334     for (i = 0;; i++) {
4335         switch (args_type[i]) {
4336             case ',':
4337             case '\0':
4338                 qdict_put(qdict, qstring_get_str(key), type);
4339                 QDECREF(key);
4340                 if (args_type[i] == '\0') {
4341                     goto out;
4342                 }
4343                 type = qstring_new(); /* qdict has ref */
4344                 cur_qs = key = qstring_new();
4345                 break;
4346             case ':':
4347                 cur_qs = type;
4348                 break;
4349             default:
4350                 qstring_append_chr(cur_qs, args_type[i]);
4351                 break;
4352         }
4353     }
4354
4355 out:
4356     return qdict;
4357 }
4358
4359 /*
4360  * Client argument checking rules:
4361  *
4362  * 1. Client must provide all mandatory arguments
4363  * 2. Each argument provided by the client must be expected
4364  * 3. Each argument provided by the client must have the type expected
4365  *    by the command
4366  */
4367 static int qmp_check_client_args(const mon_cmd_t *cmd, QDict *client_args)
4368 {
4369     int flags, err;
4370     QDict *cmd_args;
4371
4372     cmd_args = qdict_from_args_type(cmd->args_type);
4373
4374     flags = 0;
4375     err = check_mandatory_args(cmd_args, client_args, &flags);
4376     if (err) {
4377         goto out;
4378     }
4379
4380     err = check_client_args_type(client_args, cmd_args, flags);
4381
4382 out:
4383     QDECREF(cmd_args);
4384     return err;
4385 }
4386
4387 /*
4388  * Input object checking rules
4389  *
4390  * 1. Input object must be a dict
4391  * 2. The "execute" key must exist
4392  * 3. The "execute" key must be a string
4393  * 4. If the "arguments" key exists, it must be a dict
4394  * 5. If the "id" key exists, it can be anything (ie. json-value)
4395  * 6. Any argument not listed above is considered invalid
4396  */
4397 static QDict *qmp_check_input_obj(QObject *input_obj)
4398 {
4399     const QDictEntry *ent;
4400     int has_exec_key = 0;
4401     QDict *input_dict;
4402
4403     if (qobject_type(input_obj) != QTYPE_QDICT) {
4404         qerror_report(QERR_QMP_BAD_INPUT_OBJECT, "object");
4405         return NULL;
4406     }
4407
4408     input_dict = qobject_to_qdict(input_obj);
4409
4410     for (ent = qdict_first(input_dict); ent; ent = qdict_next(input_dict, ent)){
4411         const char *arg_name = qdict_entry_key(ent);
4412         const QObject *arg_obj = qdict_entry_value(ent);
4413
4414         if (!strcmp(arg_name, "execute")) {
4415             if (qobject_type(arg_obj) != QTYPE_QSTRING) {
4416                 qerror_report(QERR_QMP_BAD_INPUT_OBJECT_MEMBER, "execute",
4417                               "string");
4418                 return NULL;
4419             }
4420             has_exec_key = 1;
4421         } else if (!strcmp(arg_name, "arguments")) {
4422             if (qobject_type(arg_obj) != QTYPE_QDICT) {
4423                 qerror_report(QERR_QMP_BAD_INPUT_OBJECT_MEMBER, "arguments",
4424                               "object");
4425                 return NULL;
4426             }
4427         } else if (!strcmp(arg_name, "id")) {
4428             /* FIXME: check duplicated IDs for async commands */
4429         } else {
4430             qerror_report(QERR_QMP_EXTRA_MEMBER, arg_name);
4431             return NULL;
4432         }
4433     }
4434
4435     if (!has_exec_key) {
4436         qerror_report(QERR_QMP_BAD_INPUT_OBJECT, "execute");
4437         return NULL;
4438     }
4439
4440     return input_dict;
4441 }
4442
4443 static void qmp_call_cmd(Monitor *mon, const mon_cmd_t *cmd,
4444                          const QDict *params)
4445 {
4446     int ret;
4447     QObject *data = NULL;
4448
4449     ret = cmd->mhandler.cmd_new(mon, params, &data);
4450     handler_audit(mon, cmd, ret);
4451     monitor_protocol_emitter(mon, data);
4452     qobject_decref(data);
4453 }
4454
4455 static void handle_qmp_command(JSONMessageParser *parser, QList *tokens)
4456 {
4457     int err;
4458     QObject *obj;
4459     QDict *input, *args;
4460     const mon_cmd_t *cmd;
4461     const char *cmd_name;
4462     Monitor *mon = cur_mon;
4463
4464     args = input = NULL;
4465
4466     obj = json_parser_parse(tokens, NULL);
4467     if (!obj) {
4468         // FIXME: should be triggered in json_parser_parse()
4469         qerror_report(QERR_JSON_PARSING);
4470         goto err_out;
4471     }
4472
4473     input = qmp_check_input_obj(obj);
4474     if (!input) {
4475         qobject_decref(obj);
4476         goto err_out;
4477     }
4478
4479     mon->mc->id = qdict_get(input, "id");
4480     qobject_incref(mon->mc->id);
4481
4482     cmd_name = qdict_get_str(input, "execute");
4483     trace_handle_qmp_command(mon, cmd_name);
4484     if (invalid_qmp_mode(mon, cmd_name)) {
4485         qerror_report(QERR_COMMAND_NOT_FOUND, cmd_name);
4486         goto err_out;
4487     }
4488
4489     cmd = qmp_find_cmd(cmd_name);
4490     if (!cmd) {
4491         qerror_report(QERR_COMMAND_NOT_FOUND, cmd_name);
4492         goto err_out;
4493     }
4494
4495     obj = qdict_get(input, "arguments");
4496     if (!obj) {
4497         args = qdict_new();
4498     } else {
4499         args = qobject_to_qdict(obj);
4500         QINCREF(args);
4501     }
4502
4503     err = qmp_check_client_args(cmd, args);
4504     if (err < 0) {
4505         goto err_out;
4506     }
4507
4508     if (handler_is_async(cmd)) {
4509         err = qmp_async_cmd_handler(mon, cmd, args);
4510         if (err) {
4511             /* emit the error response */
4512             goto err_out;
4513         }
4514     } else {
4515         qmp_call_cmd(mon, cmd, args);
4516     }
4517
4518     goto out;
4519
4520 err_out:
4521     monitor_protocol_emitter(mon, NULL);
4522 out:
4523     QDECREF(input);
4524     QDECREF(args);
4525 }
4526
4527 /**
4528  * monitor_control_read(): Read and handle QMP input
4529  */
4530 static void monitor_control_read(void *opaque, const uint8_t *buf, int size)
4531 {
4532     Monitor *old_mon = cur_mon;
4533
4534     cur_mon = opaque;
4535
4536     json_message_parser_feed(&cur_mon->mc->parser, (const char *) buf, size);
4537
4538     cur_mon = old_mon;
4539 }
4540
4541 static void monitor_read(void *opaque, const uint8_t *buf, int size)
4542 {
4543     Monitor *old_mon = cur_mon;
4544     int i;
4545
4546     cur_mon = opaque;
4547
4548     if (cur_mon->rs) {
4549         for (i = 0; i < size; i++)
4550             readline_handle_byte(cur_mon->rs, buf[i]);
4551     } else {
4552         if (size == 0 || buf[size - 1] != 0)
4553             monitor_printf(cur_mon, "corrupted command\n");
4554         else
4555             handle_user_command(cur_mon, (char *)buf);
4556     }
4557
4558     cur_mon = old_mon;
4559 }
4560
4561 static void monitor_command_cb(Monitor *mon, const char *cmdline, void *opaque)
4562 {
4563     monitor_suspend(mon);
4564     handle_user_command(mon, cmdline);
4565     monitor_resume(mon);
4566 }
4567
4568 int monitor_suspend(Monitor *mon)
4569 {
4570     if (!mon->rs)
4571         return -ENOTTY;
4572     mon->suspend_cnt++;
4573     return 0;
4574 }
4575
4576 void monitor_resume(Monitor *mon)
4577 {
4578     if (!mon->rs)
4579         return;
4580     if (--mon->suspend_cnt == 0)
4581         readline_show_prompt(mon->rs);
4582 }
4583
4584 static QObject *get_qmp_greeting(void)
4585 {
4586     QObject *ver = NULL;
4587
4588     qmp_marshal_input_query_version(NULL, NULL, &ver);
4589     return qobject_from_jsonf("{'QMP':{'version': %p,'capabilities': []}}",ver);
4590 }
4591
4592 /**
4593  * monitor_control_event(): Print QMP gretting
4594  */
4595 static void monitor_control_event(void *opaque, int event)
4596 {
4597     QObject *data;
4598     Monitor *mon = opaque;
4599
4600     switch (event) {
4601     case CHR_EVENT_OPENED:
4602         mon->mc->command_mode = 0;
4603         data = get_qmp_greeting();
4604         monitor_json_emitter(mon, data);
4605         qobject_decref(data);
4606         mon_refcount++;
4607         break;
4608     case CHR_EVENT_CLOSED:
4609         json_message_parser_destroy(&mon->mc->parser);
4610         json_message_parser_init(&mon->mc->parser, handle_qmp_command);
4611         mon_refcount--;
4612         monitor_fdsets_cleanup();
4613         break;
4614     }
4615 }
4616
4617 static void monitor_event(void *opaque, int event)
4618 {
4619     Monitor *mon = opaque;
4620
4621     switch (event) {
4622     case CHR_EVENT_MUX_IN:
4623         mon->mux_out = 0;
4624         if (mon->reset_seen) {
4625             readline_restart(mon->rs);
4626             monitor_resume(mon);
4627             monitor_flush(mon);
4628         } else {
4629             mon->suspend_cnt = 0;
4630         }
4631         break;
4632
4633     case CHR_EVENT_MUX_OUT:
4634         if (mon->reset_seen) {
4635             if (mon->suspend_cnt == 0) {
4636                 monitor_printf(mon, "\n");
4637             }
4638             monitor_flush(mon);
4639             monitor_suspend(mon);
4640         } else {
4641             mon->suspend_cnt++;
4642         }
4643         mon->mux_out = 1;
4644         break;
4645
4646     case CHR_EVENT_OPENED:
4647         monitor_printf(mon, "QEMU %s monitor - type 'help' for more "
4648                        "information\n", QEMU_VERSION);
4649         if (!mon->mux_out) {
4650             readline_show_prompt(mon->rs);
4651         }
4652         mon->reset_seen = 1;
4653         mon_refcount++;
4654         break;
4655
4656     case CHR_EVENT_CLOSED:
4657         mon_refcount--;
4658         monitor_fdsets_cleanup();
4659         break;
4660     }
4661 }
4662
4663 static int
4664 compare_mon_cmd(const void *a, const void *b)
4665 {
4666     return strcmp(((const mon_cmd_t *)a)->name,
4667             ((const mon_cmd_t *)b)->name);
4668 }
4669
4670 static void sortcmdlist(void)
4671 {
4672     int array_num;
4673     int elem_size = sizeof(mon_cmd_t);
4674
4675     array_num = sizeof(mon_cmds)/elem_size-1;
4676     qsort((void *)mon_cmds, array_num, elem_size, compare_mon_cmd);
4677
4678     array_num = sizeof(info_cmds)/elem_size-1;
4679     qsort((void *)info_cmds, array_num, elem_size, compare_mon_cmd);
4680 }
4681
4682
4683 /*
4684  * Local variables:
4685  *  c-indent-level: 4
4686  *  c-basic-offset: 4
4687  *  tab-width: 8
4688  * End:
4689  */
4690
4691 void monitor_init(CharDriverState *chr, int flags)
4692 {
4693     static int is_first_init = 1;
4694     Monitor *mon;
4695
4696     if (is_first_init) {
4697         monitor_protocol_event_init();
4698         is_first_init = 0;
4699     }
4700
4701     mon = g_malloc0(sizeof(*mon));
4702
4703     mon->chr = chr;
4704     mon->flags = flags;
4705     if (flags & MONITOR_USE_READLINE) {
4706         mon->rs = readline_init(mon, monitor_find_completion);
4707         monitor_read_command(mon, 0);
4708     }
4709
4710     if (monitor_ctrl_mode(mon)) {
4711         mon->mc = g_malloc0(sizeof(MonitorControl));
4712         /* Control mode requires special handlers */
4713         qemu_chr_add_handlers(chr, monitor_can_read, monitor_control_read,
4714                               monitor_control_event, mon);
4715         qemu_chr_fe_set_echo(chr, true);
4716
4717         json_message_parser_init(&mon->mc->parser, handle_qmp_command);
4718     } else {
4719         qemu_chr_add_handlers(chr, monitor_can_read, monitor_read,
4720                               monitor_event, mon);
4721     }
4722
4723     QLIST_INSERT_HEAD(&mon_list, mon, entry);
4724     if (!default_mon || (flags & MONITOR_IS_DEFAULT))
4725         default_mon = mon;
4726
4727     sortcmdlist();
4728 }
4729
4730 static void bdrv_password_cb(Monitor *mon, const char *password, void *opaque)
4731 {
4732     BlockDriverState *bs = opaque;
4733     int ret = 0;
4734
4735     if (bdrv_set_key(bs, password) != 0) {
4736         monitor_printf(mon, "invalid password\n");
4737         ret = -EPERM;
4738     }
4739     if (mon->password_completion_cb)
4740         mon->password_completion_cb(mon->password_opaque, ret);
4741
4742     monitor_read_command(mon, 1);
4743 }
4744
4745 ReadLineState *monitor_get_rs(Monitor *mon)
4746 {
4747     return mon->rs;
4748 }
4749
4750 int monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs,
4751                                 BlockDriverCompletionFunc *completion_cb,
4752                                 void *opaque)
4753 {
4754     int err;
4755
4756     if (!bdrv_key_required(bs)) {
4757         if (completion_cb)
4758             completion_cb(opaque, 0);
4759         return 0;
4760     }
4761
4762     if (monitor_ctrl_mode(mon)) {
4763         qerror_report(QERR_DEVICE_ENCRYPTED, bdrv_get_device_name(bs),
4764                       bdrv_get_encrypted_filename(bs));
4765         return -1;
4766     }
4767
4768     monitor_printf(mon, "%s (%s) is encrypted.\n", bdrv_get_device_name(bs),
4769                    bdrv_get_encrypted_filename(bs));
4770
4771     mon->password_completion_cb = completion_cb;
4772     mon->password_opaque = opaque;
4773
4774     err = monitor_read_password(mon, bdrv_password_cb, bs);
4775
4776     if (err && completion_cb)
4777         completion_cb(opaque, err);
4778
4779     return err;
4780 }
4781
4782 int monitor_read_block_device_key(Monitor *mon, const char *device,
4783                                   BlockDriverCompletionFunc *completion_cb,
4784                                   void *opaque)
4785 {
4786     BlockDriverState *bs;
4787
4788     bs = bdrv_find(device);
4789     if (!bs) {
4790         monitor_printf(mon, "Device not found %s\n", device);
4791         return -1;
4792     }
4793
4794     return monitor_read_bdrv_key_start(mon, bs, completion_cb, opaque);
4795 }
4796
4797 QemuOptsList qemu_mon_opts = {
4798     .name = "mon",
4799     .implied_opt_name = "chardev",
4800     .head = QTAILQ_HEAD_INITIALIZER(qemu_mon_opts.head),
4801     .desc = {
4802         {
4803             .name = "mode",
4804             .type = QEMU_OPT_STRING,
4805         },{
4806             .name = "chardev",
4807             .type = QEMU_OPT_STRING,
4808         },{
4809             .name = "default",
4810             .type = QEMU_OPT_BOOL,
4811         },{
4812             .name = "pretty",
4813             .type = QEMU_OPT_BOOL,
4814         },
4815         { /* end of list */ }
4816     },
4817 };
This page took 0.291574 seconds and 4 git commands to generate.