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