monitor: Throttle event VSERPORT_CHANGE separately by "id"
[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 "monitor/qdev.h"
27 #include "hw/usb.h"
28 #include "hw/i386/pc.h"
29 #include "hw/pci/pci.h"
30 #include "sysemu/watchdog.h"
31 #include "hw/loader.h"
32 #include "exec/gdbstub.h"
33 #include "net/net.h"
34 #include "net/slirp.h"
35 #include "sysemu/char.h"
36 #include "ui/qemu-spice.h"
37 #include "sysemu/sysemu.h"
38 #include "sysemu/numa.h"
39 #include "monitor/monitor.h"
40 #include "qemu/readline.h"
41 #include "ui/console.h"
42 #include "ui/input.h"
43 #include "sysemu/blockdev.h"
44 #include "audio/audio.h"
45 #include "disas/disas.h"
46 #include "sysemu/balloon.h"
47 #include "qemu/timer.h"
48 #include "migration/migration.h"
49 #include "sysemu/kvm.h"
50 #include "qemu/acl.h"
51 #include "sysemu/tpm.h"
52 #include "qapi/qmp/qerror.h"
53 #include "qapi/qmp/qint.h"
54 #include "qapi/qmp/qfloat.h"
55 #include "qapi/qmp/qlist.h"
56 #include "qapi/qmp/qbool.h"
57 #include "qapi/qmp/qstring.h"
58 #include "qapi/qmp/qjson.h"
59 #include "qapi/qmp/json-streamer.h"
60 #include "qapi/qmp/json-parser.h"
61 #include <qom/object_interfaces.h>
62 #include "qemu/osdep.h"
63 #include "cpu.h"
64 #include "trace.h"
65 #include "trace/control.h"
66 #include "monitor/hmp-target.h"
67 #ifdef CONFIG_TRACE_SIMPLE
68 #include "trace/simple.h"
69 #endif
70 #include "exec/memory.h"
71 #include "qmp-commands.h"
72 #include "hmp.h"
73 #include "qemu/thread.h"
74 #include "block/qapi.h"
75 #include "qapi/qmp-event.h"
76 #include "qapi-event.h"
77 #include "qmp-introspect.h"
78 #include "sysemu/block-backend.h"
79
80 /* for hmp_info_irq/pic */
81 #if defined(TARGET_SPARC)
82 #include "hw/sparc/sun4m.h"
83 #endif
84 #include "hw/lm32/lm32_pic.h"
85
86 #if defined(TARGET_S390X)
87 #include "hw/s390x/storage-keys.h"
88 #endif
89
90 /*
91  * Supported types:
92  *
93  * 'F'          filename
94  * 'B'          block device name
95  * 's'          string (accept optional quote)
96  * 'S'          it just appends the rest of the string (accept optional quote)
97  * 'O'          option string of the form NAME=VALUE,...
98  *              parsed according to QemuOptsList given by its name
99  *              Example: 'device:O' uses qemu_device_opts.
100  *              Restriction: only lists with empty desc are supported
101  *              TODO lift the restriction
102  * 'i'          32 bit integer
103  * 'l'          target long (32 or 64 bit)
104  * 'M'          Non-negative target long (32 or 64 bit), in user mode the
105  *              value is multiplied by 2^20 (think Mebibyte)
106  * 'o'          octets (aka bytes)
107  *              user mode accepts an optional E, e, P, p, T, t, G, g, M, m,
108  *              K, k suffix, which multiplies the value by 2^60 for suffixes E
109  *              and e, 2^50 for suffixes P and p, 2^40 for suffixes T and t,
110  *              2^30 for suffixes G and g, 2^20 for M and m, 2^10 for K and k
111  * 'T'          double
112  *              user mode accepts an optional ms, us, ns suffix,
113  *              which divides the value by 1e3, 1e6, 1e9, respectively
114  * '/'          optional gdb-like print format (like "/10x")
115  *
116  * '?'          optional type (for all types, except '/')
117  * '.'          other form of optional type (for 'i' and 'l')
118  * 'b'          boolean
119  *              user mode accepts "on" or "off"
120  * '-'          optional parameter (eg. '-f')
121  *
122  */
123
124 typedef struct mon_cmd_t {
125     const char *name;
126     const char *args_type;
127     const char *params;
128     const char *help;
129     union {
130         void (*cmd)(Monitor *mon, const QDict *qdict);
131         void (*cmd_new)(QDict *params, QObject **ret_data, Error **errp);
132     } mhandler;
133     /* @sub_table is a list of 2nd level of commands. If it do not exist,
134      * mhandler should be used. If it exist, sub_table[?].mhandler should be
135      * used, and mhandler of 1st level plays the role of help function.
136      */
137     struct mon_cmd_t *sub_table;
138     void (*command_completion)(ReadLineState *rs, int nb_args, const char *str);
139 } mon_cmd_t;
140
141 /* file descriptors passed via SCM_RIGHTS */
142 typedef struct mon_fd_t mon_fd_t;
143 struct mon_fd_t {
144     char *name;
145     int fd;
146     QLIST_ENTRY(mon_fd_t) next;
147 };
148
149 /* file descriptor associated with a file descriptor set */
150 typedef struct MonFdsetFd MonFdsetFd;
151 struct MonFdsetFd {
152     int fd;
153     bool removed;
154     char *opaque;
155     QLIST_ENTRY(MonFdsetFd) next;
156 };
157
158 /* file descriptor set containing fds passed via SCM_RIGHTS */
159 typedef struct MonFdset MonFdset;
160 struct MonFdset {
161     int64_t id;
162     QLIST_HEAD(, MonFdsetFd) fds;
163     QLIST_HEAD(, MonFdsetFd) dup_fds;
164     QLIST_ENTRY(MonFdset) next;
165 };
166
167 typedef struct {
168     QObject *id;
169     JSONMessageParser parser;
170     /*
171      * When a client connects, we're in capabilities negotiation mode.
172      * When command qmp_capabilities succeeds, we go into command
173      * mode.
174      */
175     bool in_command_mode;       /* are we in command mode? */
176 } MonitorQMP;
177
178 /*
179  * To prevent flooding clients, events can be throttled. The
180  * throttling is calculated globally, rather than per-Monitor
181  * instance.
182  */
183 typedef struct MonitorQAPIEventState {
184     QAPIEvent event;    /* Throttling state for this event type and... */
185     QDict *data;        /* ... data, see qapi_event_throttle_equal() */
186     QEMUTimer *timer;   /* Timer for handling delayed events */
187     QDict *qdict;       /* Delayed event (if any) */
188 } MonitorQAPIEventState;
189
190 typedef struct {
191     int64_t rate;       /* Minimum time (in ns) between two events */
192 } MonitorQAPIEventConf;
193
194 struct Monitor {
195     CharDriverState *chr;
196     int reset_seen;
197     int flags;
198     int suspend_cnt;
199     bool skip_flush;
200
201     QemuMutex out_lock;
202     QString *outbuf;
203     guint out_watch;
204
205     /* Read under either BQL or out_lock, written with BQL+out_lock.  */
206     int mux_out;
207
208     ReadLineState *rs;
209     MonitorQMP qmp;
210     CPUState *mon_cpu;
211     BlockCompletionFunc *password_completion_cb;
212     void *password_opaque;
213     mon_cmd_t *cmd_table;
214     QLIST_HEAD(,mon_fd_t) fds;
215     QLIST_ENTRY(Monitor) entry;
216 };
217
218 /* QMP checker flags */
219 #define QMP_ACCEPT_UNKNOWNS 1
220
221 /* Protects mon_list, monitor_event_state.  */
222 static QemuMutex monitor_lock;
223
224 static QLIST_HEAD(mon_list, Monitor) mon_list;
225 static QLIST_HEAD(mon_fdsets, MonFdset) mon_fdsets;
226 static int mon_refcount;
227
228 static mon_cmd_t mon_cmds[];
229 static mon_cmd_t info_cmds[];
230
231 static const mon_cmd_t qmp_cmds[];
232
233 Monitor *cur_mon;
234
235 static void monitor_command_cb(void *opaque, const char *cmdline,
236                                void *readline_opaque);
237
238 /**
239  * Is @mon a QMP monitor?
240  */
241 static inline bool monitor_is_qmp(const Monitor *mon)
242 {
243     return (mon->flags & MONITOR_USE_CONTROL);
244 }
245
246 /**
247  * Is the current monitor, if any, a QMP monitor?
248  */
249 bool monitor_cur_is_qmp(void)
250 {
251     return cur_mon && monitor_is_qmp(cur_mon);
252 }
253
254 void monitor_read_command(Monitor *mon, int show_prompt)
255 {
256     if (!mon->rs)
257         return;
258
259     readline_start(mon->rs, "(qemu) ", 0, monitor_command_cb, NULL);
260     if (show_prompt)
261         readline_show_prompt(mon->rs);
262 }
263
264 int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
265                           void *opaque)
266 {
267     if (mon->rs) {
268         readline_start(mon->rs, "Password: ", 1, readline_func, opaque);
269         /* prompt is printed on return from the command handler */
270         return 0;
271     } else {
272         monitor_printf(mon, "terminal does not support password prompting\n");
273         return -ENOTTY;
274     }
275 }
276
277 static void monitor_flush_locked(Monitor *mon);
278
279 static gboolean monitor_unblocked(GIOChannel *chan, GIOCondition cond,
280                                   void *opaque)
281 {
282     Monitor *mon = opaque;
283
284     qemu_mutex_lock(&mon->out_lock);
285     mon->out_watch = 0;
286     monitor_flush_locked(mon);
287     qemu_mutex_unlock(&mon->out_lock);
288     return FALSE;
289 }
290
291 /* Called with mon->out_lock held.  */
292 static void monitor_flush_locked(Monitor *mon)
293 {
294     int rc;
295     size_t len;
296     const char *buf;
297
298     if (mon->skip_flush) {
299         return;
300     }
301
302     buf = qstring_get_str(mon->outbuf);
303     len = qstring_get_length(mon->outbuf);
304
305     if (len && !mon->mux_out) {
306         rc = qemu_chr_fe_write(mon->chr, (const uint8_t *) buf, len);
307         if ((rc < 0 && errno != EAGAIN) || (rc == len)) {
308             /* all flushed or error */
309             QDECREF(mon->outbuf);
310             mon->outbuf = qstring_new();
311             return;
312         }
313         if (rc > 0) {
314             /* partinal write */
315             QString *tmp = qstring_from_str(buf + rc);
316             QDECREF(mon->outbuf);
317             mon->outbuf = tmp;
318         }
319         if (mon->out_watch == 0) {
320             mon->out_watch = qemu_chr_fe_add_watch(mon->chr, G_IO_OUT|G_IO_HUP,
321                                                    monitor_unblocked, mon);
322         }
323     }
324 }
325
326 void monitor_flush(Monitor *mon)
327 {
328     qemu_mutex_lock(&mon->out_lock);
329     monitor_flush_locked(mon);
330     qemu_mutex_unlock(&mon->out_lock);
331 }
332
333 /* flush at every end of line */
334 static void monitor_puts(Monitor *mon, const char *str)
335 {
336     char c;
337
338     qemu_mutex_lock(&mon->out_lock);
339     for(;;) {
340         c = *str++;
341         if (c == '\0')
342             break;
343         if (c == '\n') {
344             qstring_append_chr(mon->outbuf, '\r');
345         }
346         qstring_append_chr(mon->outbuf, c);
347         if (c == '\n') {
348             monitor_flush_locked(mon);
349         }
350     }
351     qemu_mutex_unlock(&mon->out_lock);
352 }
353
354 void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
355 {
356     char *buf;
357
358     if (!mon)
359         return;
360
361     if (monitor_is_qmp(mon)) {
362         return;
363     }
364
365     buf = g_strdup_vprintf(fmt, ap);
366     monitor_puts(mon, buf);
367     g_free(buf);
368 }
369
370 void monitor_printf(Monitor *mon, const char *fmt, ...)
371 {
372     va_list ap;
373     va_start(ap, fmt);
374     monitor_vprintf(mon, fmt, ap);
375     va_end(ap);
376 }
377
378 int monitor_fprintf(FILE *stream, const char *fmt, ...)
379 {
380     va_list ap;
381     va_start(ap, fmt);
382     monitor_vprintf((Monitor *)stream, fmt, ap);
383     va_end(ap);
384     return 0;
385 }
386
387 static void monitor_json_emitter(Monitor *mon, const QObject *data)
388 {
389     QString *json;
390
391     json = mon->flags & MONITOR_USE_PRETTY ? qobject_to_json_pretty(data) :
392                                              qobject_to_json(data);
393     assert(json != NULL);
394
395     qstring_append_chr(json, '\n');
396     monitor_puts(mon, qstring_get_str(json));
397
398     QDECREF(json);
399 }
400
401 static QDict *build_qmp_error_dict(Error *err)
402 {
403     QObject *obj;
404
405     obj = qobject_from_jsonf("{ 'error': { 'class': %s, 'desc': %s } }",
406                              ErrorClass_lookup[error_get_class(err)],
407                              error_get_pretty(err));
408
409     return qobject_to_qdict(obj);
410 }
411
412 static void monitor_protocol_emitter(Monitor *mon, QObject *data,
413                                      Error *err)
414 {
415     QDict *qmp;
416
417     trace_monitor_protocol_emitter(mon);
418
419     if (!err) {
420         /* success response */
421         qmp = qdict_new();
422         if (data) {
423             qobject_incref(data);
424             qdict_put_obj(qmp, "return", data);
425         } else {
426             /* return an empty QDict by default */
427             qdict_put(qmp, "return", qdict_new());
428         }
429     } else {
430         /* error response */
431         qmp = build_qmp_error_dict(err);
432     }
433
434     if (mon->qmp.id) {
435         qdict_put_obj(qmp, "id", mon->qmp.id);
436         mon->qmp.id = NULL;
437     }
438
439     monitor_json_emitter(mon, QOBJECT(qmp));
440     QDECREF(qmp);
441 }
442
443
444 static MonitorQAPIEventConf monitor_qapi_event_conf[QAPI_EVENT_MAX] = {
445     /* Limit guest-triggerable events to 1 per second */
446     [QAPI_EVENT_RTC_CHANGE]        = { 1000 * SCALE_MS },
447     [QAPI_EVENT_WATCHDOG]          = { 1000 * SCALE_MS },
448     [QAPI_EVENT_BALLOON_CHANGE]    = { 1000 * SCALE_MS },
449     [QAPI_EVENT_QUORUM_REPORT_BAD] = { 1000 * SCALE_MS },
450     [QAPI_EVENT_QUORUM_FAILURE]    = { 1000 * SCALE_MS },
451     [QAPI_EVENT_VSERPORT_CHANGE]   = { 1000 * SCALE_MS },
452 };
453
454 GHashTable *monitor_qapi_event_state;
455
456 /*
457  * Emits the event to every monitor instance, @event is only used for trace
458  * Called with monitor_lock held.
459  */
460 static void monitor_qapi_event_emit(QAPIEvent event, QDict *qdict)
461 {
462     Monitor *mon;
463
464     trace_monitor_protocol_event_emit(event, qdict);
465     QLIST_FOREACH(mon, &mon_list, entry) {
466         if (monitor_is_qmp(mon) && mon->qmp.in_command_mode) {
467             monitor_json_emitter(mon, QOBJECT(qdict));
468         }
469     }
470 }
471
472 static void monitor_qapi_event_handler(void *opaque);
473
474 /*
475  * Queue a new event for emission to Monitor instances,
476  * applying any rate limiting if required.
477  */
478 static void
479 monitor_qapi_event_queue(QAPIEvent event, QDict *qdict, Error **errp)
480 {
481     MonitorQAPIEventConf *evconf;
482     MonitorQAPIEventState *evstate;
483
484     assert(event < QAPI_EVENT_MAX);
485     evconf = &monitor_qapi_event_conf[event];
486     trace_monitor_protocol_event_queue(event, qdict, evconf->rate);
487
488     qemu_mutex_lock(&monitor_lock);
489
490     if (!evconf->rate) {
491         /* Unthrottled event */
492         monitor_qapi_event_emit(event, qdict);
493     } else {
494         QDict *data = qobject_to_qdict(qdict_get(qdict, "data"));
495         MonitorQAPIEventState key = { .event = event, .data = data };
496
497         evstate = g_hash_table_lookup(monitor_qapi_event_state, &key);
498         assert(!evstate || timer_pending(evstate->timer));
499
500         if (evstate) {
501             /*
502              * Timer is pending for (at least) evconf->rate ns after
503              * last send.  Store event for sending when timer fires,
504              * replacing a prior stored event if any.
505              */
506             QDECREF(evstate->qdict);
507             evstate->qdict = qdict;
508             QINCREF(evstate->qdict);
509         } else {
510             /*
511              * Last send was (at least) evconf->rate ns ago.
512              * Send immediately, and arm the timer to call
513              * monitor_qapi_event_handler() in evconf->rate ns.  Any
514              * events arriving before then will be delayed until then.
515              */
516             int64_t now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
517
518             monitor_qapi_event_emit(event, qdict);
519
520             evstate = g_new(MonitorQAPIEventState, 1);
521             evstate->event = event;
522             evstate->data = data;
523             QINCREF(evstate->data);
524             evstate->qdict = NULL;
525             evstate->timer = timer_new_ns(QEMU_CLOCK_REALTIME,
526                                           monitor_qapi_event_handler,
527                                           evstate);
528             g_hash_table_add(monitor_qapi_event_state, evstate);
529             timer_mod_ns(evstate->timer, now + evconf->rate);
530         }
531     }
532
533     qemu_mutex_unlock(&monitor_lock);
534 }
535
536 /*
537  * This function runs evconf->rate ns after sending a throttled
538  * event.
539  * If another event has since been stored, send it.
540  */
541 static void monitor_qapi_event_handler(void *opaque)
542 {
543     MonitorQAPIEventState *evstate = opaque;
544     MonitorQAPIEventConf *evconf = &monitor_qapi_event_conf[evstate->event];
545
546     trace_monitor_protocol_event_handler(evstate->event, evstate->qdict);
547     qemu_mutex_lock(&monitor_lock);
548
549     if (evstate->qdict) {
550         int64_t now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
551
552         monitor_qapi_event_emit(evstate->event, evstate->qdict);
553         QDECREF(evstate->qdict);
554         evstate->qdict = NULL;
555         timer_mod_ns(evstate->timer, now + evconf->rate);
556     } else {
557         g_hash_table_remove(monitor_qapi_event_state, evstate);
558         QDECREF(evstate->data);
559         timer_free(evstate->timer);
560         g_free(evstate);
561     }
562
563     qemu_mutex_unlock(&monitor_lock);
564 }
565
566 static unsigned int qapi_event_throttle_hash(const void *key)
567 {
568     const MonitorQAPIEventState *evstate = key;
569     unsigned int hash = evstate->event * 255;
570
571     if (evstate->event == QAPI_EVENT_VSERPORT_CHANGE) {
572         hash += g_str_hash(qdict_get_str(evstate->data, "id"));
573     }
574
575     return hash;
576 }
577
578 static gboolean qapi_event_throttle_equal(const void *a, const void *b)
579 {
580     const MonitorQAPIEventState *eva = a;
581     const MonitorQAPIEventState *evb = b;
582
583     if (eva->event != evb->event) {
584         return FALSE;
585     }
586
587     if (eva->event == QAPI_EVENT_VSERPORT_CHANGE) {
588         return !strcmp(qdict_get_str(eva->data, "id"),
589                        qdict_get_str(evb->data, "id"));
590     }
591
592     return TRUE;
593 }
594
595 static void monitor_qapi_event_init(void)
596 {
597     monitor_qapi_event_state = g_hash_table_new(qapi_event_throttle_hash,
598                                                 qapi_event_throttle_equal);
599     qmp_event_set_func_emit(monitor_qapi_event_queue);
600 }
601
602 static void qmp_capabilities(QDict *params, QObject **ret_data, Error **errp)
603 {
604     cur_mon->qmp.in_command_mode = true;
605 }
606
607 static void handle_hmp_command(Monitor *mon, const char *cmdline);
608
609 static void monitor_data_init(Monitor *mon)
610 {
611     memset(mon, 0, sizeof(Monitor));
612     qemu_mutex_init(&mon->out_lock);
613     mon->outbuf = qstring_new();
614     /* Use *mon_cmds by default. */
615     mon->cmd_table = mon_cmds;
616 }
617
618 static void monitor_data_destroy(Monitor *mon)
619 {
620     QDECREF(mon->outbuf);
621     qemu_mutex_destroy(&mon->out_lock);
622 }
623
624 char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index,
625                                 int64_t cpu_index, Error **errp)
626 {
627     char *output = NULL;
628     Monitor *old_mon, hmp;
629
630     monitor_data_init(&hmp);
631     hmp.skip_flush = true;
632
633     old_mon = cur_mon;
634     cur_mon = &hmp;
635
636     if (has_cpu_index) {
637         int ret = monitor_set_cpu(cpu_index);
638         if (ret < 0) {
639             cur_mon = old_mon;
640             error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index",
641                        "a CPU number");
642             goto out;
643         }
644     }
645
646     handle_hmp_command(&hmp, command_line);
647     cur_mon = old_mon;
648
649     qemu_mutex_lock(&hmp.out_lock);
650     if (qstring_get_length(hmp.outbuf) > 0) {
651         output = g_strdup(qstring_get_str(hmp.outbuf));
652     } else {
653         output = g_strdup("");
654     }
655     qemu_mutex_unlock(&hmp.out_lock);
656
657 out:
658     monitor_data_destroy(&hmp);
659     return output;
660 }
661
662 static int compare_cmd(const char *name, const char *list)
663 {
664     const char *p, *pstart;
665     int len;
666     len = strlen(name);
667     p = list;
668     for(;;) {
669         pstart = p;
670         p = strchr(p, '|');
671         if (!p)
672             p = pstart + strlen(pstart);
673         if ((p - pstart) == len && !memcmp(pstart, name, len))
674             return 1;
675         if (*p == '\0')
676             break;
677         p++;
678     }
679     return 0;
680 }
681
682 static int get_str(char *buf, int buf_size, const char **pp)
683 {
684     const char *p;
685     char *q;
686     int c;
687
688     q = buf;
689     p = *pp;
690     while (qemu_isspace(*p)) {
691         p++;
692     }
693     if (*p == '\0') {
694     fail:
695         *q = '\0';
696         *pp = p;
697         return -1;
698     }
699     if (*p == '\"') {
700         p++;
701         while (*p != '\0' && *p != '\"') {
702             if (*p == '\\') {
703                 p++;
704                 c = *p++;
705                 switch (c) {
706                 case 'n':
707                     c = '\n';
708                     break;
709                 case 'r':
710                     c = '\r';
711                     break;
712                 case '\\':
713                 case '\'':
714                 case '\"':
715                     break;
716                 default:
717                     printf("unsupported escape code: '\\%c'\n", c);
718                     goto fail;
719                 }
720                 if ((q - buf) < buf_size - 1) {
721                     *q++ = c;
722                 }
723             } else {
724                 if ((q - buf) < buf_size - 1) {
725                     *q++ = *p;
726                 }
727                 p++;
728             }
729         }
730         if (*p != '\"') {
731             printf("unterminated string\n");
732             goto fail;
733         }
734         p++;
735     } else {
736         while (*p != '\0' && !qemu_isspace(*p)) {
737             if ((q - buf) < buf_size - 1) {
738                 *q++ = *p;
739             }
740             p++;
741         }
742     }
743     *q = '\0';
744     *pp = p;
745     return 0;
746 }
747
748 #define MAX_ARGS 16
749
750 static void free_cmdline_args(char **args, int nb_args)
751 {
752     int i;
753
754     assert(nb_args <= MAX_ARGS);
755
756     for (i = 0; i < nb_args; i++) {
757         g_free(args[i]);
758     }
759
760 }
761
762 /*
763  * Parse the command line to get valid args.
764  * @cmdline: command line to be parsed.
765  * @pnb_args: location to store the number of args, must NOT be NULL.
766  * @args: location to store the args, which should be freed by caller, must
767  *        NOT be NULL.
768  *
769  * Returns 0 on success, negative on failure.
770  *
771  * NOTE: this parser is an approximate form of the real command parser. Number
772  *       of args have a limit of MAX_ARGS. If cmdline contains more, it will
773  *       return with failure.
774  */
775 static int parse_cmdline(const char *cmdline,
776                          int *pnb_args, char **args)
777 {
778     const char *p;
779     int nb_args, ret;
780     char buf[1024];
781
782     p = cmdline;
783     nb_args = 0;
784     for (;;) {
785         while (qemu_isspace(*p)) {
786             p++;
787         }
788         if (*p == '\0') {
789             break;
790         }
791         if (nb_args >= MAX_ARGS) {
792             goto fail;
793         }
794         ret = get_str(buf, sizeof(buf), &p);
795         if (ret < 0) {
796             goto fail;
797         }
798         args[nb_args] = g_strdup(buf);
799         nb_args++;
800     }
801     *pnb_args = nb_args;
802     return 0;
803
804  fail:
805     free_cmdline_args(args, nb_args);
806     return -1;
807 }
808
809 static void help_cmd_dump_one(Monitor *mon,
810                               const mon_cmd_t *cmd,
811                               char **prefix_args,
812                               int prefix_args_nb)
813 {
814     int i;
815
816     for (i = 0; i < prefix_args_nb; i++) {
817         monitor_printf(mon, "%s ", prefix_args[i]);
818     }
819     monitor_printf(mon, "%s %s -- %s\n", cmd->name, cmd->params, cmd->help);
820 }
821
822 /* @args[@arg_index] is the valid command need to find in @cmds */
823 static void help_cmd_dump(Monitor *mon, const mon_cmd_t *cmds,
824                           char **args, int nb_args, int arg_index)
825 {
826     const mon_cmd_t *cmd;
827
828     /* No valid arg need to compare with, dump all in *cmds */
829     if (arg_index >= nb_args) {
830         for (cmd = cmds; cmd->name != NULL; cmd++) {
831             help_cmd_dump_one(mon, cmd, args, arg_index);
832         }
833         return;
834     }
835
836     /* Find one entry to dump */
837     for (cmd = cmds; cmd->name != NULL; cmd++) {
838         if (compare_cmd(args[arg_index], cmd->name)) {
839             if (cmd->sub_table) {
840                 /* continue with next arg */
841                 help_cmd_dump(mon, cmd->sub_table,
842                               args, nb_args, arg_index + 1);
843             } else {
844                 help_cmd_dump_one(mon, cmd, args, arg_index);
845             }
846             break;
847         }
848     }
849 }
850
851 static void help_cmd(Monitor *mon, const char *name)
852 {
853     char *args[MAX_ARGS];
854     int nb_args = 0;
855
856     /* 1. parse user input */
857     if (name) {
858         /* special case for log, directly dump and return */
859         if (!strcmp(name, "log")) {
860             const QEMULogItem *item;
861             monitor_printf(mon, "Log items (comma separated):\n");
862             monitor_printf(mon, "%-10s %s\n", "none", "remove all logs");
863             for (item = qemu_log_items; item->mask != 0; item++) {
864                 monitor_printf(mon, "%-10s %s\n", item->name, item->help);
865             }
866             return;
867         }
868
869         if (parse_cmdline(name, &nb_args, args) < 0) {
870             return;
871         }
872     }
873
874     /* 2. dump the contents according to parsed args */
875     help_cmd_dump(mon, mon->cmd_table, args, nb_args, 0);
876
877     free_cmdline_args(args, nb_args);
878 }
879
880 static void do_help_cmd(Monitor *mon, const QDict *qdict)
881 {
882     help_cmd(mon, qdict_get_try_str(qdict, "name"));
883 }
884
885 static void hmp_trace_event(Monitor *mon, const QDict *qdict)
886 {
887     const char *tp_name = qdict_get_str(qdict, "name");
888     bool new_state = qdict_get_bool(qdict, "option");
889     Error *local_err = NULL;
890
891     qmp_trace_event_set_state(tp_name, new_state, true, true, &local_err);
892     if (local_err) {
893         error_report_err(local_err);
894     }
895 }
896
897 #ifdef CONFIG_TRACE_SIMPLE
898 static void hmp_trace_file(Monitor *mon, const QDict *qdict)
899 {
900     const char *op = qdict_get_try_str(qdict, "op");
901     const char *arg = qdict_get_try_str(qdict, "arg");
902
903     if (!op) {
904         st_print_trace_file_status((FILE *)mon, &monitor_fprintf);
905     } else if (!strcmp(op, "on")) {
906         st_set_trace_file_enabled(true);
907     } else if (!strcmp(op, "off")) {
908         st_set_trace_file_enabled(false);
909     } else if (!strcmp(op, "flush")) {
910         st_flush_trace_buffer();
911     } else if (!strcmp(op, "set")) {
912         if (arg) {
913             st_set_trace_file(arg);
914         }
915     } else {
916         monitor_printf(mon, "unexpected argument \"%s\"\n", op);
917         help_cmd(mon, "trace-file");
918     }
919 }
920 #endif
921
922 static void hmp_info_help(Monitor *mon, const QDict *qdict)
923 {
924     help_cmd(mon, "info");
925 }
926
927 CommandInfoList *qmp_query_commands(Error **errp)
928 {
929     CommandInfoList *info, *cmd_list = NULL;
930     const mon_cmd_t *cmd;
931
932     for (cmd = qmp_cmds; cmd->name != NULL; cmd++) {
933         info = g_malloc0(sizeof(*info));
934         info->value = g_malloc0(sizeof(*info->value));
935         info->value->name = g_strdup(cmd->name);
936
937         info->next = cmd_list;
938         cmd_list = info;
939     }
940
941     return cmd_list;
942 }
943
944 EventInfoList *qmp_query_events(Error **errp)
945 {
946     EventInfoList *info, *ev_list = NULL;
947     QAPIEvent e;
948
949     for (e = 0 ; e < QAPI_EVENT_MAX ; e++) {
950         const char *event_name = QAPIEvent_lookup[e];
951         assert(event_name != NULL);
952         info = g_malloc0(sizeof(*info));
953         info->value = g_malloc0(sizeof(*info->value));
954         info->value->name = g_strdup(event_name);
955
956         info->next = ev_list;
957         ev_list = info;
958     }
959
960     return ev_list;
961 }
962
963 /*
964  * Minor hack: generated marshalling suppressed for this command
965  * ('gen': false in the schema) so we can parse the JSON string
966  * directly into QObject instead of first parsing it with
967  * visit_type_SchemaInfoList() into a SchemaInfoList, then marshal it
968  * to QObject with generated output marshallers, every time.  Instead,
969  * we do it in test-qmp-input-visitor.c, just to make sure
970  * qapi-introspect.py's output actually conforms to the schema.
971  */
972 static void qmp_query_qmp_schema(QDict *qdict, QObject **ret_data,
973                                  Error **errp)
974 {
975     *ret_data = qobject_from_json(qmp_schema_json);
976 }
977
978 /* set the current CPU defined by the user */
979 int monitor_set_cpu(int cpu_index)
980 {
981     CPUState *cpu;
982
983     cpu = qemu_get_cpu(cpu_index);
984     if (cpu == NULL) {
985         return -1;
986     }
987     cur_mon->mon_cpu = cpu;
988     return 0;
989 }
990
991 CPUState *mon_get_cpu(void)
992 {
993     if (!cur_mon->mon_cpu) {
994         monitor_set_cpu(0);
995     }
996     cpu_synchronize_state(cur_mon->mon_cpu);
997     return cur_mon->mon_cpu;
998 }
999
1000 CPUArchState *mon_get_cpu_env(void)
1001 {
1002     return mon_get_cpu()->env_ptr;
1003 }
1004
1005 int monitor_get_cpu_index(void)
1006 {
1007     return mon_get_cpu()->cpu_index;
1008 }
1009
1010 static void hmp_info_registers(Monitor *mon, const QDict *qdict)
1011 {
1012     cpu_dump_state(mon_get_cpu(), (FILE *)mon, monitor_fprintf, CPU_DUMP_FPU);
1013 }
1014
1015 static void hmp_info_jit(Monitor *mon, const QDict *qdict)
1016 {
1017     dump_exec_info((FILE *)mon, monitor_fprintf);
1018     dump_drift_info((FILE *)mon, monitor_fprintf);
1019 }
1020
1021 static void hmp_info_opcount(Monitor *mon, const QDict *qdict)
1022 {
1023     dump_opcount_info((FILE *)mon, monitor_fprintf);
1024 }
1025
1026 static void hmp_info_history(Monitor *mon, const QDict *qdict)
1027 {
1028     int i;
1029     const char *str;
1030
1031     if (!mon->rs)
1032         return;
1033     i = 0;
1034     for(;;) {
1035         str = readline_get_history(mon->rs, i);
1036         if (!str)
1037             break;
1038         monitor_printf(mon, "%d: '%s'\n", i, str);
1039         i++;
1040     }
1041 }
1042
1043 static void hmp_info_cpustats(Monitor *mon, const QDict *qdict)
1044 {
1045     cpu_dump_statistics(mon_get_cpu(), (FILE *)mon, &monitor_fprintf, 0);
1046 }
1047
1048 static void hmp_info_trace_events(Monitor *mon, const QDict *qdict)
1049 {
1050     TraceEventInfoList *events = qmp_trace_event_get_state("*", NULL);
1051     TraceEventInfoList *elem;
1052
1053     for (elem = events; elem != NULL; elem = elem->next) {
1054         monitor_printf(mon, "%s : state %u\n",
1055                        elem->value->name,
1056                        elem->value->state == TRACE_EVENT_STATE_ENABLED ? 1 : 0);
1057     }
1058     qapi_free_TraceEventInfoList(events);
1059 }
1060
1061 void qmp_client_migrate_info(const char *protocol, const char *hostname,
1062                              bool has_port, int64_t port,
1063                              bool has_tls_port, int64_t tls_port,
1064                              bool has_cert_subject, const char *cert_subject,
1065                              Error **errp)
1066 {
1067     if (strcmp(protocol, "spice") == 0) {
1068         if (!qemu_using_spice(errp)) {
1069             return;
1070         }
1071
1072         if (!has_port && !has_tls_port) {
1073             error_setg(errp, QERR_MISSING_PARAMETER, "port/tls-port");
1074             return;
1075         }
1076
1077         if (qemu_spice_migrate_info(hostname,
1078                                     has_port ? port : -1,
1079                                     has_tls_port ? tls_port : -1,
1080                                     cert_subject)) {
1081             error_setg(errp, QERR_UNDEFINED_ERROR);
1082             return;
1083         }
1084         return;
1085     }
1086
1087     error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "protocol", "spice");
1088 }
1089
1090 static void hmp_logfile(Monitor *mon, const QDict *qdict)
1091 {
1092     qemu_set_log_filename(qdict_get_str(qdict, "filename"));
1093 }
1094
1095 static void hmp_log(Monitor *mon, const QDict *qdict)
1096 {
1097     int mask;
1098     const char *items = qdict_get_str(qdict, "items");
1099
1100     if (!strcmp(items, "none")) {
1101         mask = 0;
1102     } else {
1103         mask = qemu_str_to_log_mask(items);
1104         if (!mask) {
1105             help_cmd(mon, "log");
1106             return;
1107         }
1108     }
1109     qemu_set_log(mask);
1110 }
1111
1112 static void hmp_singlestep(Monitor *mon, const QDict *qdict)
1113 {
1114     const char *option = qdict_get_try_str(qdict, "option");
1115     if (!option || !strcmp(option, "on")) {
1116         singlestep = 1;
1117     } else if (!strcmp(option, "off")) {
1118         singlestep = 0;
1119     } else {
1120         monitor_printf(mon, "unexpected option %s\n", option);
1121     }
1122 }
1123
1124 static void hmp_gdbserver(Monitor *mon, const QDict *qdict)
1125 {
1126     const char *device = qdict_get_try_str(qdict, "device");
1127     if (!device)
1128         device = "tcp::" DEFAULT_GDBSTUB_PORT;
1129     if (gdbserver_start(device) < 0) {
1130         monitor_printf(mon, "Could not open gdbserver on device '%s'\n",
1131                        device);
1132     } else if (strcmp(device, "none") == 0) {
1133         monitor_printf(mon, "Disabled gdbserver\n");
1134     } else {
1135         monitor_printf(mon, "Waiting for gdb connection on device '%s'\n",
1136                        device);
1137     }
1138 }
1139
1140 static void hmp_watchdog_action(Monitor *mon, const QDict *qdict)
1141 {
1142     const char *action = qdict_get_str(qdict, "action");
1143     if (select_watchdog_action(action) == -1) {
1144         monitor_printf(mon, "Unknown watchdog action '%s'\n", action);
1145     }
1146 }
1147
1148 static void monitor_printc(Monitor *mon, int c)
1149 {
1150     monitor_printf(mon, "'");
1151     switch(c) {
1152     case '\'':
1153         monitor_printf(mon, "\\'");
1154         break;
1155     case '\\':
1156         monitor_printf(mon, "\\\\");
1157         break;
1158     case '\n':
1159         monitor_printf(mon, "\\n");
1160         break;
1161     case '\r':
1162         monitor_printf(mon, "\\r");
1163         break;
1164     default:
1165         if (c >= 32 && c <= 126) {
1166             monitor_printf(mon, "%c", c);
1167         } else {
1168             monitor_printf(mon, "\\x%02x", c);
1169         }
1170         break;
1171     }
1172     monitor_printf(mon, "'");
1173 }
1174
1175 static void memory_dump(Monitor *mon, int count, int format, int wsize,
1176                         hwaddr addr, int is_physical)
1177 {
1178     int l, line_size, i, max_digits, len;
1179     uint8_t buf[16];
1180     uint64_t v;
1181
1182     if (format == 'i') {
1183         int flags = 0;
1184 #ifdef TARGET_I386
1185         CPUArchState *env = mon_get_cpu_env();
1186         if (wsize == 2) {
1187             flags = 1;
1188         } else if (wsize == 4) {
1189             flags = 0;
1190         } else {
1191             /* as default we use the current CS size */
1192             flags = 0;
1193             if (env) {
1194 #ifdef TARGET_X86_64
1195                 if ((env->efer & MSR_EFER_LMA) &&
1196                     (env->segs[R_CS].flags & DESC_L_MASK))
1197                     flags = 2;
1198                 else
1199 #endif
1200                 if (!(env->segs[R_CS].flags & DESC_B_MASK))
1201                     flags = 1;
1202             }
1203         }
1204 #endif
1205 #ifdef TARGET_PPC
1206         CPUArchState *env = mon_get_cpu_env();
1207         flags = msr_le << 16;
1208         flags |= env->bfd_mach;
1209 #endif
1210         monitor_disas(mon, mon_get_cpu(), addr, count, is_physical, flags);
1211         return;
1212     }
1213
1214     len = wsize * count;
1215     if (wsize == 1)
1216         line_size = 8;
1217     else
1218         line_size = 16;
1219     max_digits = 0;
1220
1221     switch(format) {
1222     case 'o':
1223         max_digits = (wsize * 8 + 2) / 3;
1224         break;
1225     default:
1226     case 'x':
1227         max_digits = (wsize * 8) / 4;
1228         break;
1229     case 'u':
1230     case 'd':
1231         max_digits = (wsize * 8 * 10 + 32) / 33;
1232         break;
1233     case 'c':
1234         wsize = 1;
1235         break;
1236     }
1237
1238     while (len > 0) {
1239         if (is_physical)
1240             monitor_printf(mon, TARGET_FMT_plx ":", addr);
1241         else
1242             monitor_printf(mon, TARGET_FMT_lx ":", (target_ulong)addr);
1243         l = len;
1244         if (l > line_size)
1245             l = line_size;
1246         if (is_physical) {
1247             cpu_physical_memory_read(addr, buf, l);
1248         } else {
1249             if (cpu_memory_rw_debug(mon_get_cpu(), addr, buf, l, 0) < 0) {
1250                 monitor_printf(mon, " Cannot access memory\n");
1251                 break;
1252             }
1253         }
1254         i = 0;
1255         while (i < l) {
1256             switch(wsize) {
1257             default:
1258             case 1:
1259                 v = ldub_p(buf + i);
1260                 break;
1261             case 2:
1262                 v = lduw_p(buf + i);
1263                 break;
1264             case 4:
1265                 v = (uint32_t)ldl_p(buf + i);
1266                 break;
1267             case 8:
1268                 v = ldq_p(buf + i);
1269                 break;
1270             }
1271             monitor_printf(mon, " ");
1272             switch(format) {
1273             case 'o':
1274                 monitor_printf(mon, "%#*" PRIo64, max_digits, v);
1275                 break;
1276             case 'x':
1277                 monitor_printf(mon, "0x%0*" PRIx64, max_digits, v);
1278                 break;
1279             case 'u':
1280                 monitor_printf(mon, "%*" PRIu64, max_digits, v);
1281                 break;
1282             case 'd':
1283                 monitor_printf(mon, "%*" PRId64, max_digits, v);
1284                 break;
1285             case 'c':
1286                 monitor_printc(mon, v);
1287                 break;
1288             }
1289             i += wsize;
1290         }
1291         monitor_printf(mon, "\n");
1292         addr += l;
1293         len -= l;
1294     }
1295 }
1296
1297 static void hmp_memory_dump(Monitor *mon, const QDict *qdict)
1298 {
1299     int count = qdict_get_int(qdict, "count");
1300     int format = qdict_get_int(qdict, "format");
1301     int size = qdict_get_int(qdict, "size");
1302     target_long addr = qdict_get_int(qdict, "addr");
1303
1304     memory_dump(mon, count, format, size, addr, 0);
1305 }
1306
1307 static void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
1308 {
1309     int count = qdict_get_int(qdict, "count");
1310     int format = qdict_get_int(qdict, "format");
1311     int size = qdict_get_int(qdict, "size");
1312     hwaddr addr = qdict_get_int(qdict, "addr");
1313
1314     memory_dump(mon, count, format, size, addr, 1);
1315 }
1316
1317 static void do_print(Monitor *mon, const QDict *qdict)
1318 {
1319     int format = qdict_get_int(qdict, "format");
1320     hwaddr val = qdict_get_int(qdict, "val");
1321
1322     switch(format) {
1323     case 'o':
1324         monitor_printf(mon, "%#" HWADDR_PRIo, val);
1325         break;
1326     case 'x':
1327         monitor_printf(mon, "%#" HWADDR_PRIx, val);
1328         break;
1329     case 'u':
1330         monitor_printf(mon, "%" HWADDR_PRIu, val);
1331         break;
1332     default:
1333     case 'd':
1334         monitor_printf(mon, "%" HWADDR_PRId, val);
1335         break;
1336     case 'c':
1337         monitor_printc(mon, val);
1338         break;
1339     }
1340     monitor_printf(mon, "\n");
1341 }
1342
1343 static void hmp_sum(Monitor *mon, const QDict *qdict)
1344 {
1345     uint32_t addr;
1346     uint16_t sum;
1347     uint32_t start = qdict_get_int(qdict, "start");
1348     uint32_t size = qdict_get_int(qdict, "size");
1349
1350     sum = 0;
1351     for(addr = start; addr < (start + size); addr++) {
1352         uint8_t val = address_space_ldub(&address_space_memory, addr,
1353                                          MEMTXATTRS_UNSPECIFIED, NULL);
1354         /* BSD sum algorithm ('sum' Unix command) */
1355         sum = (sum >> 1) | (sum << 15);
1356         sum += val;
1357     }
1358     monitor_printf(mon, "%05d\n", sum);
1359 }
1360
1361 static int mouse_button_state;
1362
1363 static void hmp_mouse_move(Monitor *mon, const QDict *qdict)
1364 {
1365     int dx, dy, dz, button;
1366     const char *dx_str = qdict_get_str(qdict, "dx_str");
1367     const char *dy_str = qdict_get_str(qdict, "dy_str");
1368     const char *dz_str = qdict_get_try_str(qdict, "dz_str");
1369
1370     dx = strtol(dx_str, NULL, 0);
1371     dy = strtol(dy_str, NULL, 0);
1372     qemu_input_queue_rel(NULL, INPUT_AXIS_X, dx);
1373     qemu_input_queue_rel(NULL, INPUT_AXIS_Y, dy);
1374
1375     if (dz_str) {
1376         dz = strtol(dz_str, NULL, 0);
1377         if (dz != 0) {
1378             button = (dz > 0) ? INPUT_BUTTON_WHEEL_UP : INPUT_BUTTON_WHEEL_DOWN;
1379             qemu_input_queue_btn(NULL, button, true);
1380             qemu_input_event_sync();
1381             qemu_input_queue_btn(NULL, button, false);
1382         }
1383     }
1384     qemu_input_event_sync();
1385 }
1386
1387 static void hmp_mouse_button(Monitor *mon, const QDict *qdict)
1388 {
1389     static uint32_t bmap[INPUT_BUTTON_MAX] = {
1390         [INPUT_BUTTON_LEFT]       = MOUSE_EVENT_LBUTTON,
1391         [INPUT_BUTTON_MIDDLE]     = MOUSE_EVENT_MBUTTON,
1392         [INPUT_BUTTON_RIGHT]      = MOUSE_EVENT_RBUTTON,
1393     };
1394     int button_state = qdict_get_int(qdict, "button_state");
1395
1396     if (mouse_button_state == button_state) {
1397         return;
1398     }
1399     qemu_input_update_buttons(NULL, bmap, mouse_button_state, button_state);
1400     qemu_input_event_sync();
1401     mouse_button_state = button_state;
1402 }
1403
1404 static void hmp_ioport_read(Monitor *mon, const QDict *qdict)
1405 {
1406     int size = qdict_get_int(qdict, "size");
1407     int addr = qdict_get_int(qdict, "addr");
1408     int has_index = qdict_haskey(qdict, "index");
1409     uint32_t val;
1410     int suffix;
1411
1412     if (has_index) {
1413         int index = qdict_get_int(qdict, "index");
1414         cpu_outb(addr & IOPORTS_MASK, index & 0xff);
1415         addr++;
1416     }
1417     addr &= 0xffff;
1418
1419     switch(size) {
1420     default:
1421     case 1:
1422         val = cpu_inb(addr);
1423         suffix = 'b';
1424         break;
1425     case 2:
1426         val = cpu_inw(addr);
1427         suffix = 'w';
1428         break;
1429     case 4:
1430         val = cpu_inl(addr);
1431         suffix = 'l';
1432         break;
1433     }
1434     monitor_printf(mon, "port%c[0x%04x] = %#0*x\n",
1435                    suffix, addr, size * 2, val);
1436 }
1437
1438 static void hmp_ioport_write(Monitor *mon, const QDict *qdict)
1439 {
1440     int size = qdict_get_int(qdict, "size");
1441     int addr = qdict_get_int(qdict, "addr");
1442     int val = qdict_get_int(qdict, "val");
1443
1444     addr &= IOPORTS_MASK;
1445
1446     switch (size) {
1447     default:
1448     case 1:
1449         cpu_outb(addr, val);
1450         break;
1451     case 2:
1452         cpu_outw(addr, val);
1453         break;
1454     case 4:
1455         cpu_outl(addr, val);
1456         break;
1457     }
1458 }
1459
1460 static void hmp_boot_set(Monitor *mon, const QDict *qdict)
1461 {
1462     Error *local_err = NULL;
1463     const char *bootdevice = qdict_get_str(qdict, "bootdevice");
1464
1465     qemu_boot_set(bootdevice, &local_err);
1466     if (local_err) {
1467         monitor_printf(mon, "%s\n", error_get_pretty(local_err));
1468         error_free(local_err);
1469     } else {
1470         monitor_printf(mon, "boot device list now set to %s\n", bootdevice);
1471     }
1472 }
1473
1474 static void hmp_info_mtree(Monitor *mon, const QDict *qdict)
1475 {
1476     mtree_info((fprintf_function)monitor_printf, mon);
1477 }
1478
1479 static void hmp_info_numa(Monitor *mon, const QDict *qdict)
1480 {
1481     int i;
1482     CPUState *cpu;
1483     uint64_t *node_mem;
1484
1485     node_mem = g_new0(uint64_t, nb_numa_nodes);
1486     query_numa_node_mem(node_mem);
1487     monitor_printf(mon, "%d nodes\n", nb_numa_nodes);
1488     for (i = 0; i < nb_numa_nodes; i++) {
1489         monitor_printf(mon, "node %d cpus:", i);
1490         CPU_FOREACH(cpu) {
1491             if (cpu->numa_node == i) {
1492                 monitor_printf(mon, " %d", cpu->cpu_index);
1493             }
1494         }
1495         monitor_printf(mon, "\n");
1496         monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i,
1497                        node_mem[i] >> 20);
1498     }
1499     g_free(node_mem);
1500 }
1501
1502 #ifdef CONFIG_PROFILER
1503
1504 int64_t tcg_time;
1505 int64_t dev_time;
1506
1507 static void hmp_info_profile(Monitor *mon, const QDict *qdict)
1508 {
1509     monitor_printf(mon, "async time  %" PRId64 " (%0.3f)\n",
1510                    dev_time, dev_time / (double)get_ticks_per_sec());
1511     monitor_printf(mon, "qemu time   %" PRId64 " (%0.3f)\n",
1512                    tcg_time, tcg_time / (double)get_ticks_per_sec());
1513     tcg_time = 0;
1514     dev_time = 0;
1515 }
1516 #else
1517 static void hmp_info_profile(Monitor *mon, const QDict *qdict)
1518 {
1519     monitor_printf(mon, "Internal profiler not compiled\n");
1520 }
1521 #endif
1522
1523 /* Capture support */
1524 static QLIST_HEAD (capture_list_head, CaptureState) capture_head;
1525
1526 static void hmp_info_capture(Monitor *mon, const QDict *qdict)
1527 {
1528     int i;
1529     CaptureState *s;
1530
1531     for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1532         monitor_printf(mon, "[%d]: ", i);
1533         s->ops.info (s->opaque);
1534     }
1535 }
1536
1537 static void hmp_stopcapture(Monitor *mon, const QDict *qdict)
1538 {
1539     int i;
1540     int n = qdict_get_int(qdict, "n");
1541     CaptureState *s;
1542
1543     for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1544         if (i == n) {
1545             s->ops.destroy (s->opaque);
1546             QLIST_REMOVE (s, entries);
1547             g_free (s);
1548             return;
1549         }
1550     }
1551 }
1552
1553 static void hmp_wavcapture(Monitor *mon, const QDict *qdict)
1554 {
1555     const char *path = qdict_get_str(qdict, "path");
1556     int has_freq = qdict_haskey(qdict, "freq");
1557     int freq = qdict_get_try_int(qdict, "freq", -1);
1558     int has_bits = qdict_haskey(qdict, "bits");
1559     int bits = qdict_get_try_int(qdict, "bits", -1);
1560     int has_channels = qdict_haskey(qdict, "nchannels");
1561     int nchannels = qdict_get_try_int(qdict, "nchannels", -1);
1562     CaptureState *s;
1563
1564     s = g_malloc0 (sizeof (*s));
1565
1566     freq = has_freq ? freq : 44100;
1567     bits = has_bits ? bits : 16;
1568     nchannels = has_channels ? nchannels : 2;
1569
1570     if (wav_start_capture (s, path, freq, bits, nchannels)) {
1571         monitor_printf(mon, "Failed to add wave capture\n");
1572         g_free (s);
1573         return;
1574     }
1575     QLIST_INSERT_HEAD (&capture_head, s, entries);
1576 }
1577
1578 static qemu_acl *find_acl(Monitor *mon, const char *name)
1579 {
1580     qemu_acl *acl = qemu_acl_find(name);
1581
1582     if (!acl) {
1583         monitor_printf(mon, "acl: unknown list '%s'\n", name);
1584     }
1585     return acl;
1586 }
1587
1588 static void hmp_acl_show(Monitor *mon, const QDict *qdict)
1589 {
1590     const char *aclname = qdict_get_str(qdict, "aclname");
1591     qemu_acl *acl = find_acl(mon, aclname);
1592     qemu_acl_entry *entry;
1593     int i = 0;
1594
1595     if (acl) {
1596         monitor_printf(mon, "policy: %s\n",
1597                        acl->defaultDeny ? "deny" : "allow");
1598         QTAILQ_FOREACH(entry, &acl->entries, next) {
1599             i++;
1600             monitor_printf(mon, "%d: %s %s\n", i,
1601                            entry->deny ? "deny" : "allow", entry->match);
1602         }
1603     }
1604 }
1605
1606 static void hmp_acl_reset(Monitor *mon, const QDict *qdict)
1607 {
1608     const char *aclname = qdict_get_str(qdict, "aclname");
1609     qemu_acl *acl = find_acl(mon, aclname);
1610
1611     if (acl) {
1612         qemu_acl_reset(acl);
1613         monitor_printf(mon, "acl: removed all rules\n");
1614     }
1615 }
1616
1617 static void hmp_acl_policy(Monitor *mon, const QDict *qdict)
1618 {
1619     const char *aclname = qdict_get_str(qdict, "aclname");
1620     const char *policy = qdict_get_str(qdict, "policy");
1621     qemu_acl *acl = find_acl(mon, aclname);
1622
1623     if (acl) {
1624         if (strcmp(policy, "allow") == 0) {
1625             acl->defaultDeny = 0;
1626             monitor_printf(mon, "acl: policy set to 'allow'\n");
1627         } else if (strcmp(policy, "deny") == 0) {
1628             acl->defaultDeny = 1;
1629             monitor_printf(mon, "acl: policy set to 'deny'\n");
1630         } else {
1631             monitor_printf(mon, "acl: unknown policy '%s', "
1632                            "expected 'deny' or 'allow'\n", policy);
1633         }
1634     }
1635 }
1636
1637 static void hmp_acl_add(Monitor *mon, const QDict *qdict)
1638 {
1639     const char *aclname = qdict_get_str(qdict, "aclname");
1640     const char *match = qdict_get_str(qdict, "match");
1641     const char *policy = qdict_get_str(qdict, "policy");
1642     int has_index = qdict_haskey(qdict, "index");
1643     int index = qdict_get_try_int(qdict, "index", -1);
1644     qemu_acl *acl = find_acl(mon, aclname);
1645     int deny, ret;
1646
1647     if (acl) {
1648         if (strcmp(policy, "allow") == 0) {
1649             deny = 0;
1650         } else if (strcmp(policy, "deny") == 0) {
1651             deny = 1;
1652         } else {
1653             monitor_printf(mon, "acl: unknown policy '%s', "
1654                            "expected 'deny' or 'allow'\n", policy);
1655             return;
1656         }
1657         if (has_index)
1658             ret = qemu_acl_insert(acl, deny, match, index);
1659         else
1660             ret = qemu_acl_append(acl, deny, match);
1661         if (ret < 0)
1662             monitor_printf(mon, "acl: unable to add acl entry\n");
1663         else
1664             monitor_printf(mon, "acl: added rule at position %d\n", ret);
1665     }
1666 }
1667
1668 static void hmp_acl_remove(Monitor *mon, const QDict *qdict)
1669 {
1670     const char *aclname = qdict_get_str(qdict, "aclname");
1671     const char *match = qdict_get_str(qdict, "match");
1672     qemu_acl *acl = find_acl(mon, aclname);
1673     int ret;
1674
1675     if (acl) {
1676         ret = qemu_acl_remove(acl, match);
1677         if (ret < 0)
1678             monitor_printf(mon, "acl: no matching acl entry\n");
1679         else
1680             monitor_printf(mon, "acl: removed rule at position %d\n", ret);
1681     }
1682 }
1683
1684 void qmp_getfd(const char *fdname, Error **errp)
1685 {
1686     mon_fd_t *monfd;
1687     int fd;
1688
1689     fd = qemu_chr_fe_get_msgfd(cur_mon->chr);
1690     if (fd == -1) {
1691         error_setg(errp, QERR_FD_NOT_SUPPLIED);
1692         return;
1693     }
1694
1695     if (qemu_isdigit(fdname[0])) {
1696         close(fd);
1697         error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "fdname",
1698                    "a name not starting with a digit");
1699         return;
1700     }
1701
1702     QLIST_FOREACH(monfd, &cur_mon->fds, next) {
1703         if (strcmp(monfd->name, fdname) != 0) {
1704             continue;
1705         }
1706
1707         close(monfd->fd);
1708         monfd->fd = fd;
1709         return;
1710     }
1711
1712     monfd = g_malloc0(sizeof(mon_fd_t));
1713     monfd->name = g_strdup(fdname);
1714     monfd->fd = fd;
1715
1716     QLIST_INSERT_HEAD(&cur_mon->fds, monfd, next);
1717 }
1718
1719 void qmp_closefd(const char *fdname, Error **errp)
1720 {
1721     mon_fd_t *monfd;
1722
1723     QLIST_FOREACH(monfd, &cur_mon->fds, next) {
1724         if (strcmp(monfd->name, fdname) != 0) {
1725             continue;
1726         }
1727
1728         QLIST_REMOVE(monfd, next);
1729         close(monfd->fd);
1730         g_free(monfd->name);
1731         g_free(monfd);
1732         return;
1733     }
1734
1735     error_setg(errp, QERR_FD_NOT_FOUND, fdname);
1736 }
1737
1738 static void hmp_loadvm(Monitor *mon, const QDict *qdict)
1739 {
1740     int saved_vm_running  = runstate_is_running();
1741     const char *name = qdict_get_str(qdict, "name");
1742
1743     vm_stop(RUN_STATE_RESTORE_VM);
1744
1745     if (load_vmstate(name) == 0 && saved_vm_running) {
1746         vm_start();
1747     }
1748 }
1749
1750 int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp)
1751 {
1752     mon_fd_t *monfd;
1753
1754     QLIST_FOREACH(monfd, &mon->fds, next) {
1755         int fd;
1756
1757         if (strcmp(monfd->name, fdname) != 0) {
1758             continue;
1759         }
1760
1761         fd = monfd->fd;
1762
1763         /* caller takes ownership of fd */
1764         QLIST_REMOVE(monfd, next);
1765         g_free(monfd->name);
1766         g_free(monfd);
1767
1768         return fd;
1769     }
1770
1771     error_setg(errp, "File descriptor named '%s' has not been found", fdname);
1772     return -1;
1773 }
1774
1775 static void monitor_fdset_cleanup(MonFdset *mon_fdset)
1776 {
1777     MonFdsetFd *mon_fdset_fd;
1778     MonFdsetFd *mon_fdset_fd_next;
1779
1780     QLIST_FOREACH_SAFE(mon_fdset_fd, &mon_fdset->fds, next, mon_fdset_fd_next) {
1781         if ((mon_fdset_fd->removed ||
1782                 (QLIST_EMPTY(&mon_fdset->dup_fds) && mon_refcount == 0)) &&
1783                 runstate_is_running()) {
1784             close(mon_fdset_fd->fd);
1785             g_free(mon_fdset_fd->opaque);
1786             QLIST_REMOVE(mon_fdset_fd, next);
1787             g_free(mon_fdset_fd);
1788         }
1789     }
1790
1791     if (QLIST_EMPTY(&mon_fdset->fds) && QLIST_EMPTY(&mon_fdset->dup_fds)) {
1792         QLIST_REMOVE(mon_fdset, next);
1793         g_free(mon_fdset);
1794     }
1795 }
1796
1797 static void monitor_fdsets_cleanup(void)
1798 {
1799     MonFdset *mon_fdset;
1800     MonFdset *mon_fdset_next;
1801
1802     QLIST_FOREACH_SAFE(mon_fdset, &mon_fdsets, next, mon_fdset_next) {
1803         monitor_fdset_cleanup(mon_fdset);
1804     }
1805 }
1806
1807 AddfdInfo *qmp_add_fd(bool has_fdset_id, int64_t fdset_id, bool has_opaque,
1808                       const char *opaque, Error **errp)
1809 {
1810     int fd;
1811     Monitor *mon = cur_mon;
1812     AddfdInfo *fdinfo;
1813
1814     fd = qemu_chr_fe_get_msgfd(mon->chr);
1815     if (fd == -1) {
1816         error_setg(errp, QERR_FD_NOT_SUPPLIED);
1817         goto error;
1818     }
1819
1820     fdinfo = monitor_fdset_add_fd(fd, has_fdset_id, fdset_id,
1821                                   has_opaque, opaque, errp);
1822     if (fdinfo) {
1823         return fdinfo;
1824     }
1825
1826 error:
1827     if (fd != -1) {
1828         close(fd);
1829     }
1830     return NULL;
1831 }
1832
1833 void qmp_remove_fd(int64_t fdset_id, bool has_fd, int64_t fd, Error **errp)
1834 {
1835     MonFdset *mon_fdset;
1836     MonFdsetFd *mon_fdset_fd;
1837     char fd_str[60];
1838
1839     QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
1840         if (mon_fdset->id != fdset_id) {
1841             continue;
1842         }
1843         QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
1844             if (has_fd) {
1845                 if (mon_fdset_fd->fd != fd) {
1846                     continue;
1847                 }
1848                 mon_fdset_fd->removed = true;
1849                 break;
1850             } else {
1851                 mon_fdset_fd->removed = true;
1852             }
1853         }
1854         if (has_fd && !mon_fdset_fd) {
1855             goto error;
1856         }
1857         monitor_fdset_cleanup(mon_fdset);
1858         return;
1859     }
1860
1861 error:
1862     if (has_fd) {
1863         snprintf(fd_str, sizeof(fd_str), "fdset-id:%" PRId64 ", fd:%" PRId64,
1864                  fdset_id, fd);
1865     } else {
1866         snprintf(fd_str, sizeof(fd_str), "fdset-id:%" PRId64, fdset_id);
1867     }
1868     error_setg(errp, QERR_FD_NOT_FOUND, fd_str);
1869 }
1870
1871 FdsetInfoList *qmp_query_fdsets(Error **errp)
1872 {
1873     MonFdset *mon_fdset;
1874     MonFdsetFd *mon_fdset_fd;
1875     FdsetInfoList *fdset_list = NULL;
1876
1877     QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
1878         FdsetInfoList *fdset_info = g_malloc0(sizeof(*fdset_info));
1879         FdsetFdInfoList *fdsetfd_list = NULL;
1880
1881         fdset_info->value = g_malloc0(sizeof(*fdset_info->value));
1882         fdset_info->value->fdset_id = mon_fdset->id;
1883
1884         QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
1885             FdsetFdInfoList *fdsetfd_info;
1886
1887             fdsetfd_info = g_malloc0(sizeof(*fdsetfd_info));
1888             fdsetfd_info->value = g_malloc0(sizeof(*fdsetfd_info->value));
1889             fdsetfd_info->value->fd = mon_fdset_fd->fd;
1890             if (mon_fdset_fd->opaque) {
1891                 fdsetfd_info->value->has_opaque = true;
1892                 fdsetfd_info->value->opaque = g_strdup(mon_fdset_fd->opaque);
1893             } else {
1894                 fdsetfd_info->value->has_opaque = false;
1895             }
1896
1897             fdsetfd_info->next = fdsetfd_list;
1898             fdsetfd_list = fdsetfd_info;
1899         }
1900
1901         fdset_info->value->fds = fdsetfd_list;
1902
1903         fdset_info->next = fdset_list;
1904         fdset_list = fdset_info;
1905     }
1906
1907     return fdset_list;
1908 }
1909
1910 AddfdInfo *monitor_fdset_add_fd(int fd, bool has_fdset_id, int64_t fdset_id,
1911                                 bool has_opaque, const char *opaque,
1912                                 Error **errp)
1913 {
1914     MonFdset *mon_fdset = NULL;
1915     MonFdsetFd *mon_fdset_fd;
1916     AddfdInfo *fdinfo;
1917
1918     if (has_fdset_id) {
1919         QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
1920             /* Break if match found or match impossible due to ordering by ID */
1921             if (fdset_id <= mon_fdset->id) {
1922                 if (fdset_id < mon_fdset->id) {
1923                     mon_fdset = NULL;
1924                 }
1925                 break;
1926             }
1927         }
1928     }
1929
1930     if (mon_fdset == NULL) {
1931         int64_t fdset_id_prev = -1;
1932         MonFdset *mon_fdset_cur = QLIST_FIRST(&mon_fdsets);
1933
1934         if (has_fdset_id) {
1935             if (fdset_id < 0) {
1936                 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "fdset-id",
1937                            "a non-negative value");
1938                 return NULL;
1939             }
1940             /* Use specified fdset ID */
1941             QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
1942                 mon_fdset_cur = mon_fdset;
1943                 if (fdset_id < mon_fdset_cur->id) {
1944                     break;
1945                 }
1946             }
1947         } else {
1948             /* Use first available fdset ID */
1949             QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
1950                 mon_fdset_cur = mon_fdset;
1951                 if (fdset_id_prev == mon_fdset_cur->id - 1) {
1952                     fdset_id_prev = mon_fdset_cur->id;
1953                     continue;
1954                 }
1955                 break;
1956             }
1957         }
1958
1959         mon_fdset = g_malloc0(sizeof(*mon_fdset));
1960         if (has_fdset_id) {
1961             mon_fdset->id = fdset_id;
1962         } else {
1963             mon_fdset->id = fdset_id_prev + 1;
1964         }
1965
1966         /* The fdset list is ordered by fdset ID */
1967         if (!mon_fdset_cur) {
1968             QLIST_INSERT_HEAD(&mon_fdsets, mon_fdset, next);
1969         } else if (mon_fdset->id < mon_fdset_cur->id) {
1970             QLIST_INSERT_BEFORE(mon_fdset_cur, mon_fdset, next);
1971         } else {
1972             QLIST_INSERT_AFTER(mon_fdset_cur, mon_fdset, next);
1973         }
1974     }
1975
1976     mon_fdset_fd = g_malloc0(sizeof(*mon_fdset_fd));
1977     mon_fdset_fd->fd = fd;
1978     mon_fdset_fd->removed = false;
1979     if (has_opaque) {
1980         mon_fdset_fd->opaque = g_strdup(opaque);
1981     }
1982     QLIST_INSERT_HEAD(&mon_fdset->fds, mon_fdset_fd, next);
1983
1984     fdinfo = g_malloc0(sizeof(*fdinfo));
1985     fdinfo->fdset_id = mon_fdset->id;
1986     fdinfo->fd = mon_fdset_fd->fd;
1987
1988     return fdinfo;
1989 }
1990
1991 int monitor_fdset_get_fd(int64_t fdset_id, int flags)
1992 {
1993 #ifndef _WIN32
1994     MonFdset *mon_fdset;
1995     MonFdsetFd *mon_fdset_fd;
1996     int mon_fd_flags;
1997
1998     QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
1999         if (mon_fdset->id != fdset_id) {
2000             continue;
2001         }
2002         QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
2003             mon_fd_flags = fcntl(mon_fdset_fd->fd, F_GETFL);
2004             if (mon_fd_flags == -1) {
2005                 return -1;
2006             }
2007
2008             if ((flags & O_ACCMODE) == (mon_fd_flags & O_ACCMODE)) {
2009                 return mon_fdset_fd->fd;
2010             }
2011         }
2012         errno = EACCES;
2013         return -1;
2014     }
2015 #endif
2016
2017     errno = ENOENT;
2018     return -1;
2019 }
2020
2021 int monitor_fdset_dup_fd_add(int64_t fdset_id, int dup_fd)
2022 {
2023     MonFdset *mon_fdset;
2024     MonFdsetFd *mon_fdset_fd_dup;
2025
2026     QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2027         if (mon_fdset->id != fdset_id) {
2028             continue;
2029         }
2030         QLIST_FOREACH(mon_fdset_fd_dup, &mon_fdset->dup_fds, next) {
2031             if (mon_fdset_fd_dup->fd == dup_fd) {
2032                 return -1;
2033             }
2034         }
2035         mon_fdset_fd_dup = g_malloc0(sizeof(*mon_fdset_fd_dup));
2036         mon_fdset_fd_dup->fd = dup_fd;
2037         QLIST_INSERT_HEAD(&mon_fdset->dup_fds, mon_fdset_fd_dup, next);
2038         return 0;
2039     }
2040     return -1;
2041 }
2042
2043 static int monitor_fdset_dup_fd_find_remove(int dup_fd, bool remove)
2044 {
2045     MonFdset *mon_fdset;
2046     MonFdsetFd *mon_fdset_fd_dup;
2047
2048     QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
2049         QLIST_FOREACH(mon_fdset_fd_dup, &mon_fdset->dup_fds, next) {
2050             if (mon_fdset_fd_dup->fd == dup_fd) {
2051                 if (remove) {
2052                     QLIST_REMOVE(mon_fdset_fd_dup, next);
2053                     if (QLIST_EMPTY(&mon_fdset->dup_fds)) {
2054                         monitor_fdset_cleanup(mon_fdset);
2055                     }
2056                     return -1;
2057                 } else {
2058                     return mon_fdset->id;
2059                 }
2060             }
2061         }
2062     }
2063     return -1;
2064 }
2065
2066 int monitor_fdset_dup_fd_find(int dup_fd)
2067 {
2068     return monitor_fdset_dup_fd_find_remove(dup_fd, false);
2069 }
2070
2071 void monitor_fdset_dup_fd_remove(int dup_fd)
2072 {
2073     monitor_fdset_dup_fd_find_remove(dup_fd, true);
2074 }
2075
2076 int monitor_fd_param(Monitor *mon, const char *fdname, Error **errp)
2077 {
2078     int fd;
2079     Error *local_err = NULL;
2080
2081     if (!qemu_isdigit(fdname[0]) && mon) {
2082         fd = monitor_get_fd(mon, fdname, &local_err);
2083     } else {
2084         fd = qemu_parse_fd(fdname);
2085         if (fd == -1) {
2086             error_setg(&local_err, "Invalid file descriptor number '%s'",
2087                        fdname);
2088         }
2089     }
2090     if (local_err) {
2091         error_propagate(errp, local_err);
2092         assert(fd == -1);
2093     } else {
2094         assert(fd != -1);
2095     }
2096
2097     return fd;
2098 }
2099
2100 /* Please update hmp-commands.hx when adding or changing commands */
2101 static mon_cmd_t info_cmds[] = {
2102 #include "hmp-commands-info.h"
2103     { NULL, NULL, },
2104 };
2105
2106 /* mon_cmds and info_cmds would be sorted at runtime */
2107 static mon_cmd_t mon_cmds[] = {
2108 #include "hmp-commands.h"
2109     { NULL, NULL, },
2110 };
2111
2112 static const mon_cmd_t qmp_cmds[] = {
2113 #include "qmp-commands-old.h"
2114     { /* NULL */ },
2115 };
2116
2117 /*******************************************************************/
2118
2119 static const char *pch;
2120 static sigjmp_buf expr_env;
2121
2122
2123 static void GCC_FMT_ATTR(2, 3) QEMU_NORETURN
2124 expr_error(Monitor *mon, const char *fmt, ...)
2125 {
2126     va_list ap;
2127     va_start(ap, fmt);
2128     monitor_vprintf(mon, fmt, ap);
2129     monitor_printf(mon, "\n");
2130     va_end(ap);
2131     siglongjmp(expr_env, 1);
2132 }
2133
2134 /* return 0 if OK, -1 if not found */
2135 static int get_monitor_def(target_long *pval, const char *name)
2136 {
2137     const MonitorDef *md = target_monitor_defs();
2138     void *ptr;
2139
2140     if (md == NULL) {
2141         return -1;
2142     }
2143
2144     for(; md->name != NULL; md++) {
2145         if (compare_cmd(name, md->name)) {
2146             if (md->get_value) {
2147                 *pval = md->get_value(md, md->offset);
2148             } else {
2149                 CPUArchState *env = mon_get_cpu_env();
2150                 ptr = (uint8_t *)env + md->offset;
2151                 switch(md->type) {
2152                 case MD_I32:
2153                     *pval = *(int32_t *)ptr;
2154                     break;
2155                 case MD_TLONG:
2156                     *pval = *(target_long *)ptr;
2157                     break;
2158                 default:
2159                     *pval = 0;
2160                     break;
2161                 }
2162             }
2163             return 0;
2164         }
2165     }
2166     return -1;
2167 }
2168
2169 static void next(void)
2170 {
2171     if (*pch != '\0') {
2172         pch++;
2173         while (qemu_isspace(*pch))
2174             pch++;
2175     }
2176 }
2177
2178 static int64_t expr_sum(Monitor *mon);
2179
2180 static int64_t expr_unary(Monitor *mon)
2181 {
2182     int64_t n;
2183     char *p;
2184     int ret;
2185
2186     switch(*pch) {
2187     case '+':
2188         next();
2189         n = expr_unary(mon);
2190         break;
2191     case '-':
2192         next();
2193         n = -expr_unary(mon);
2194         break;
2195     case '~':
2196         next();
2197         n = ~expr_unary(mon);
2198         break;
2199     case '(':
2200         next();
2201         n = expr_sum(mon);
2202         if (*pch != ')') {
2203             expr_error(mon, "')' expected");
2204         }
2205         next();
2206         break;
2207     case '\'':
2208         pch++;
2209         if (*pch == '\0')
2210             expr_error(mon, "character constant expected");
2211         n = *pch;
2212         pch++;
2213         if (*pch != '\'')
2214             expr_error(mon, "missing terminating \' character");
2215         next();
2216         break;
2217     case '$':
2218         {
2219             char buf[128], *q;
2220             target_long reg=0;
2221
2222             pch++;
2223             q = buf;
2224             while ((*pch >= 'a' && *pch <= 'z') ||
2225                    (*pch >= 'A' && *pch <= 'Z') ||
2226                    (*pch >= '0' && *pch <= '9') ||
2227                    *pch == '_' || *pch == '.') {
2228                 if ((q - buf) < sizeof(buf) - 1)
2229                     *q++ = *pch;
2230                 pch++;
2231             }
2232             while (qemu_isspace(*pch))
2233                 pch++;
2234             *q = 0;
2235             ret = get_monitor_def(&reg, buf);
2236             if (ret < 0)
2237                 expr_error(mon, "unknown register");
2238             n = reg;
2239         }
2240         break;
2241     case '\0':
2242         expr_error(mon, "unexpected end of expression");
2243         n = 0;
2244         break;
2245     default:
2246         errno = 0;
2247         n = strtoull(pch, &p, 0);
2248         if (errno == ERANGE) {
2249             expr_error(mon, "number too large");
2250         }
2251         if (pch == p) {
2252             expr_error(mon, "invalid char '%c' in expression", *p);
2253         }
2254         pch = p;
2255         while (qemu_isspace(*pch))
2256             pch++;
2257         break;
2258     }
2259     return n;
2260 }
2261
2262
2263 static int64_t expr_prod(Monitor *mon)
2264 {
2265     int64_t val, val2;
2266     int op;
2267
2268     val = expr_unary(mon);
2269     for(;;) {
2270         op = *pch;
2271         if (op != '*' && op != '/' && op != '%')
2272             break;
2273         next();
2274         val2 = expr_unary(mon);
2275         switch(op) {
2276         default:
2277         case '*':
2278             val *= val2;
2279             break;
2280         case '/':
2281         case '%':
2282             if (val2 == 0)
2283                 expr_error(mon, "division by zero");
2284             if (op == '/')
2285                 val /= val2;
2286             else
2287                 val %= val2;
2288             break;
2289         }
2290     }
2291     return val;
2292 }
2293
2294 static int64_t expr_logic(Monitor *mon)
2295 {
2296     int64_t val, val2;
2297     int op;
2298
2299     val = expr_prod(mon);
2300     for(;;) {
2301         op = *pch;
2302         if (op != '&' && op != '|' && op != '^')
2303             break;
2304         next();
2305         val2 = expr_prod(mon);
2306         switch(op) {
2307         default:
2308         case '&':
2309             val &= val2;
2310             break;
2311         case '|':
2312             val |= val2;
2313             break;
2314         case '^':
2315             val ^= val2;
2316             break;
2317         }
2318     }
2319     return val;
2320 }
2321
2322 static int64_t expr_sum(Monitor *mon)
2323 {
2324     int64_t val, val2;
2325     int op;
2326
2327     val = expr_logic(mon);
2328     for(;;) {
2329         op = *pch;
2330         if (op != '+' && op != '-')
2331             break;
2332         next();
2333         val2 = expr_logic(mon);
2334         if (op == '+')
2335             val += val2;
2336         else
2337             val -= val2;
2338     }
2339     return val;
2340 }
2341
2342 static int get_expr(Monitor *mon, int64_t *pval, const char **pp)
2343 {
2344     pch = *pp;
2345     if (sigsetjmp(expr_env, 0)) {
2346         *pp = pch;
2347         return -1;
2348     }
2349     while (qemu_isspace(*pch))
2350         pch++;
2351     *pval = expr_sum(mon);
2352     *pp = pch;
2353     return 0;
2354 }
2355
2356 static int get_double(Monitor *mon, double *pval, const char **pp)
2357 {
2358     const char *p = *pp;
2359     char *tailp;
2360     double d;
2361
2362     d = strtod(p, &tailp);
2363     if (tailp == p) {
2364         monitor_printf(mon, "Number expected\n");
2365         return -1;
2366     }
2367     if (d != d || d - d != 0) {
2368         /* NaN or infinity */
2369         monitor_printf(mon, "Bad number\n");
2370         return -1;
2371     }
2372     *pval = d;
2373     *pp = tailp;
2374     return 0;
2375 }
2376
2377 /*
2378  * Store the command-name in cmdname, and return a pointer to
2379  * the remaining of the command string.
2380  */
2381 static const char *get_command_name(const char *cmdline,
2382                                     char *cmdname, size_t nlen)
2383 {
2384     size_t len;
2385     const char *p, *pstart;
2386
2387     p = cmdline;
2388     while (qemu_isspace(*p))
2389         p++;
2390     if (*p == '\0')
2391         return NULL;
2392     pstart = p;
2393     while (*p != '\0' && *p != '/' && !qemu_isspace(*p))
2394         p++;
2395     len = p - pstart;
2396     if (len > nlen - 1)
2397         len = nlen - 1;
2398     memcpy(cmdname, pstart, len);
2399     cmdname[len] = '\0';
2400     return p;
2401 }
2402
2403 /**
2404  * Read key of 'type' into 'key' and return the current
2405  * 'type' pointer.
2406  */
2407 static char *key_get_info(const char *type, char **key)
2408 {
2409     size_t len;
2410     char *p, *str;
2411
2412     if (*type == ',')
2413         type++;
2414
2415     p = strchr(type, ':');
2416     if (!p) {
2417         *key = NULL;
2418         return NULL;
2419     }
2420     len = p - type;
2421
2422     str = g_malloc(len + 1);
2423     memcpy(str, type, len);
2424     str[len] = '\0';
2425
2426     *key = str;
2427     return ++p;
2428 }
2429
2430 static int default_fmt_format = 'x';
2431 static int default_fmt_size = 4;
2432
2433 static int is_valid_option(const char *c, const char *typestr)
2434 {
2435     char option[3];
2436   
2437     option[0] = '-';
2438     option[1] = *c;
2439     option[2] = '\0';
2440   
2441     typestr = strstr(typestr, option);
2442     return (typestr != NULL);
2443 }
2444
2445 static const mon_cmd_t *search_dispatch_table(const mon_cmd_t *disp_table,
2446                                               const char *cmdname)
2447 {
2448     const mon_cmd_t *cmd;
2449
2450     for (cmd = disp_table; cmd->name != NULL; cmd++) {
2451         if (compare_cmd(cmdname, cmd->name)) {
2452             return cmd;
2453         }
2454     }
2455
2456     return NULL;
2457 }
2458
2459 static const mon_cmd_t *qmp_find_cmd(const char *cmdname)
2460 {
2461     return search_dispatch_table(qmp_cmds, cmdname);
2462 }
2463
2464 /*
2465  * Parse command name from @cmdp according to command table @table.
2466  * If blank, return NULL.
2467  * Else, if no valid command can be found, report to @mon, and return
2468  * NULL.
2469  * Else, change @cmdp to point right behind the name, and return its
2470  * command table entry.
2471  * Do not assume the return value points into @table!  It doesn't when
2472  * the command is found in a sub-command table.
2473  */
2474 static const mon_cmd_t *monitor_parse_command(Monitor *mon,
2475                                               const char **cmdp,
2476                                               mon_cmd_t *table)
2477 {
2478     const char *p;
2479     const mon_cmd_t *cmd;
2480     char cmdname[256];
2481
2482     /* extract the command name */
2483     p = get_command_name(*cmdp, cmdname, sizeof(cmdname));
2484     if (!p)
2485         return NULL;
2486
2487     cmd = search_dispatch_table(table, cmdname);
2488     if (!cmd) {
2489         monitor_printf(mon, "unknown command: '%.*s'\n",
2490                        (int)(p - *cmdp), *cmdp);
2491         return NULL;
2492     }
2493
2494     /* filter out following useless space */
2495     while (qemu_isspace(*p)) {
2496         p++;
2497     }
2498
2499     *cmdp = p;
2500     /* search sub command */
2501     if (cmd->sub_table != NULL && *p != '\0') {
2502         return monitor_parse_command(mon, cmdp, cmd->sub_table);
2503     }
2504
2505     return cmd;
2506 }
2507
2508 /*
2509  * Parse arguments for @cmd.
2510  * If it can't be parsed, report to @mon, and return NULL.
2511  * Else, insert command arguments into a QDict, and return it.
2512  * Note: On success, caller has to free the QDict structure.
2513  */
2514
2515 static QDict *monitor_parse_arguments(Monitor *mon,
2516                                       const char **endp,
2517                                       const mon_cmd_t *cmd)
2518 {
2519     const char *typestr;
2520     char *key;
2521     int c;
2522     const char *p = *endp;
2523     char buf[1024];
2524     QDict *qdict = qdict_new();
2525
2526     /* parse the parameters */
2527     typestr = cmd->args_type;
2528     for(;;) {
2529         typestr = key_get_info(typestr, &key);
2530         if (!typestr)
2531             break;
2532         c = *typestr;
2533         typestr++;
2534         switch(c) {
2535         case 'F':
2536         case 'B':
2537         case 's':
2538             {
2539                 int ret;
2540
2541                 while (qemu_isspace(*p))
2542                     p++;
2543                 if (*typestr == '?') {
2544                     typestr++;
2545                     if (*p == '\0') {
2546                         /* no optional string: NULL argument */
2547                         break;
2548                     }
2549                 }
2550                 ret = get_str(buf, sizeof(buf), &p);
2551                 if (ret < 0) {
2552                     switch(c) {
2553                     case 'F':
2554                         monitor_printf(mon, "%s: filename expected\n",
2555                                        cmd->name);
2556                         break;
2557                     case 'B':
2558                         monitor_printf(mon, "%s: block device name expected\n",
2559                                        cmd->name);
2560                         break;
2561                     default:
2562                         monitor_printf(mon, "%s: string expected\n", cmd->name);
2563                         break;
2564                     }
2565                     goto fail;
2566                 }
2567                 qdict_put(qdict, key, qstring_from_str(buf));
2568             }
2569             break;
2570         case 'O':
2571             {
2572                 QemuOptsList *opts_list;
2573                 QemuOpts *opts;
2574
2575                 opts_list = qemu_find_opts(key);
2576                 if (!opts_list || opts_list->desc->name) {
2577                     goto bad_type;
2578                 }
2579                 while (qemu_isspace(*p)) {
2580                     p++;
2581                 }
2582                 if (!*p)
2583                     break;
2584                 if (get_str(buf, sizeof(buf), &p) < 0) {
2585                     goto fail;
2586                 }
2587                 opts = qemu_opts_parse_noisily(opts_list, buf, true);
2588                 if (!opts) {
2589                     goto fail;
2590                 }
2591                 qemu_opts_to_qdict(opts, qdict);
2592                 qemu_opts_del(opts);
2593             }
2594             break;
2595         case '/':
2596             {
2597                 int count, format, size;
2598
2599                 while (qemu_isspace(*p))
2600                     p++;
2601                 if (*p == '/') {
2602                     /* format found */
2603                     p++;
2604                     count = 1;
2605                     if (qemu_isdigit(*p)) {
2606                         count = 0;
2607                         while (qemu_isdigit(*p)) {
2608                             count = count * 10 + (*p - '0');
2609                             p++;
2610                         }
2611                     }
2612                     size = -1;
2613                     format = -1;
2614                     for(;;) {
2615                         switch(*p) {
2616                         case 'o':
2617                         case 'd':
2618                         case 'u':
2619                         case 'x':
2620                         case 'i':
2621                         case 'c':
2622                             format = *p++;
2623                             break;
2624                         case 'b':
2625                             size = 1;
2626                             p++;
2627                             break;
2628                         case 'h':
2629                             size = 2;
2630                             p++;
2631                             break;
2632                         case 'w':
2633                             size = 4;
2634                             p++;
2635                             break;
2636                         case 'g':
2637                         case 'L':
2638                             size = 8;
2639                             p++;
2640                             break;
2641                         default:
2642                             goto next;
2643                         }
2644                     }
2645                 next:
2646                     if (*p != '\0' && !qemu_isspace(*p)) {
2647                         monitor_printf(mon, "invalid char in format: '%c'\n",
2648                                        *p);
2649                         goto fail;
2650                     }
2651                     if (format < 0)
2652                         format = default_fmt_format;
2653                     if (format != 'i') {
2654                         /* for 'i', not specifying a size gives -1 as size */
2655                         if (size < 0)
2656                             size = default_fmt_size;
2657                         default_fmt_size = size;
2658                     }
2659                     default_fmt_format = format;
2660                 } else {
2661                     count = 1;
2662                     format = default_fmt_format;
2663                     if (format != 'i') {
2664                         size = default_fmt_size;
2665                     } else {
2666                         size = -1;
2667                     }
2668                 }
2669                 qdict_put(qdict, "count", qint_from_int(count));
2670                 qdict_put(qdict, "format", qint_from_int(format));
2671                 qdict_put(qdict, "size", qint_from_int(size));
2672             }
2673             break;
2674         case 'i':
2675         case 'l':
2676         case 'M':
2677             {
2678                 int64_t val;
2679
2680                 while (qemu_isspace(*p))
2681                     p++;
2682                 if (*typestr == '?' || *typestr == '.') {
2683                     if (*typestr == '?') {
2684                         if (*p == '\0') {
2685                             typestr++;
2686                             break;
2687                         }
2688                     } else {
2689                         if (*p == '.') {
2690                             p++;
2691                             while (qemu_isspace(*p))
2692                                 p++;
2693                         } else {
2694                             typestr++;
2695                             break;
2696                         }
2697                     }
2698                     typestr++;
2699                 }
2700                 if (get_expr(mon, &val, &p))
2701                     goto fail;
2702                 /* Check if 'i' is greater than 32-bit */
2703                 if ((c == 'i') && ((val >> 32) & 0xffffffff)) {
2704                     monitor_printf(mon, "\'%s\' has failed: ", cmd->name);
2705                     monitor_printf(mon, "integer is for 32-bit values\n");
2706                     goto fail;
2707                 } else if (c == 'M') {
2708                     if (val < 0) {
2709                         monitor_printf(mon, "enter a positive value\n");
2710                         goto fail;
2711                     }
2712                     val <<= 20;
2713                 }
2714                 qdict_put(qdict, key, qint_from_int(val));
2715             }
2716             break;
2717         case 'o':
2718             {
2719                 int64_t val;
2720                 char *end;
2721
2722                 while (qemu_isspace(*p)) {
2723                     p++;
2724                 }
2725                 if (*typestr == '?') {
2726                     typestr++;
2727                     if (*p == '\0') {
2728                         break;
2729                     }
2730                 }
2731                 val = qemu_strtosz(p, &end);
2732                 if (val < 0) {
2733                     monitor_printf(mon, "invalid size\n");
2734                     goto fail;
2735                 }
2736                 qdict_put(qdict, key, qint_from_int(val));
2737                 p = end;
2738             }
2739             break;
2740         case 'T':
2741             {
2742                 double val;
2743
2744                 while (qemu_isspace(*p))
2745                     p++;
2746                 if (*typestr == '?') {
2747                     typestr++;
2748                     if (*p == '\0') {
2749                         break;
2750                     }
2751                 }
2752                 if (get_double(mon, &val, &p) < 0) {
2753                     goto fail;
2754                 }
2755                 if (p[0] && p[1] == 's') {
2756                     switch (*p) {
2757                     case 'm':
2758                         val /= 1e3; p += 2; break;
2759                     case 'u':
2760                         val /= 1e6; p += 2; break;
2761                     case 'n':
2762                         val /= 1e9; p += 2; break;
2763                     }
2764                 }
2765                 if (*p && !qemu_isspace(*p)) {
2766                     monitor_printf(mon, "Unknown unit suffix\n");
2767                     goto fail;
2768                 }
2769                 qdict_put(qdict, key, qfloat_from_double(val));
2770             }
2771             break;
2772         case 'b':
2773             {
2774                 const char *beg;
2775                 bool val;
2776
2777                 while (qemu_isspace(*p)) {
2778                     p++;
2779                 }
2780                 beg = p;
2781                 while (qemu_isgraph(*p)) {
2782                     p++;
2783                 }
2784                 if (p - beg == 2 && !memcmp(beg, "on", p - beg)) {
2785                     val = true;
2786                 } else if (p - beg == 3 && !memcmp(beg, "off", p - beg)) {
2787                     val = false;
2788                 } else {
2789                     monitor_printf(mon, "Expected 'on' or 'off'\n");
2790                     goto fail;
2791                 }
2792                 qdict_put(qdict, key, qbool_from_bool(val));
2793             }
2794             break;
2795         case '-':
2796             {
2797                 const char *tmp = p;
2798                 int skip_key = 0;
2799                 /* option */
2800
2801                 c = *typestr++;
2802                 if (c == '\0')
2803                     goto bad_type;
2804                 while (qemu_isspace(*p))
2805                     p++;
2806                 if (*p == '-') {
2807                     p++;
2808                     if(c != *p) {
2809                         if(!is_valid_option(p, typestr)) {
2810                   
2811                             monitor_printf(mon, "%s: unsupported option -%c\n",
2812                                            cmd->name, *p);
2813                             goto fail;
2814                         } else {
2815                             skip_key = 1;
2816                         }
2817                     }
2818                     if(skip_key) {
2819                         p = tmp;
2820                     } else {
2821                         /* has option */
2822                         p++;
2823                         qdict_put(qdict, key, qbool_from_bool(true));
2824                     }
2825                 }
2826             }
2827             break;
2828         case 'S':
2829             {
2830                 /* package all remaining string */
2831                 int len;
2832
2833                 while (qemu_isspace(*p)) {
2834                     p++;
2835                 }
2836                 if (*typestr == '?') {
2837                     typestr++;
2838                     if (*p == '\0') {
2839                         /* no remaining string: NULL argument */
2840                         break;
2841                     }
2842                 }
2843                 len = strlen(p);
2844                 if (len <= 0) {
2845                     monitor_printf(mon, "%s: string expected\n",
2846                                    cmd->name);
2847                     goto fail;
2848                 }
2849                 qdict_put(qdict, key, qstring_from_str(p));
2850                 p += len;
2851             }
2852             break;
2853         default:
2854         bad_type:
2855             monitor_printf(mon, "%s: unknown type '%c'\n", cmd->name, c);
2856             goto fail;
2857         }
2858         g_free(key);
2859         key = NULL;
2860     }
2861     /* check that all arguments were parsed */
2862     while (qemu_isspace(*p))
2863         p++;
2864     if (*p != '\0') {
2865         monitor_printf(mon, "%s: extraneous characters at the end of line\n",
2866                        cmd->name);
2867         goto fail;
2868     }
2869
2870     return qdict;
2871
2872 fail:
2873     QDECREF(qdict);
2874     g_free(key);
2875     return NULL;
2876 }
2877
2878 static void handle_hmp_command(Monitor *mon, const char *cmdline)
2879 {
2880     QDict *qdict;
2881     const mon_cmd_t *cmd;
2882
2883     cmd = monitor_parse_command(mon, &cmdline, mon->cmd_table);
2884     if (!cmd) {
2885         return;
2886     }
2887
2888     qdict = monitor_parse_arguments(mon, &cmdline, cmd);
2889     if (!qdict) {
2890         monitor_printf(mon, "Try \"help %s\" for more information\n",
2891                        cmd->name);
2892         return;
2893     }
2894
2895     cmd->mhandler.cmd(mon, qdict);
2896     QDECREF(qdict);
2897 }
2898
2899 static void cmd_completion(Monitor *mon, const char *name, const char *list)
2900 {
2901     const char *p, *pstart;
2902     char cmd[128];
2903     int len;
2904
2905     p = list;
2906     for(;;) {
2907         pstart = p;
2908         p = strchr(p, '|');
2909         if (!p)
2910             p = pstart + strlen(pstart);
2911         len = p - pstart;
2912         if (len > sizeof(cmd) - 2)
2913             len = sizeof(cmd) - 2;
2914         memcpy(cmd, pstart, len);
2915         cmd[len] = '\0';
2916         if (name[0] == '\0' || !strncmp(name, cmd, strlen(name))) {
2917             readline_add_completion(mon->rs, cmd);
2918         }
2919         if (*p == '\0')
2920             break;
2921         p++;
2922     }
2923 }
2924
2925 static void file_completion(Monitor *mon, const char *input)
2926 {
2927     DIR *ffs;
2928     struct dirent *d;
2929     char path[1024];
2930     char file[1024], file_prefix[1024];
2931     int input_path_len;
2932     const char *p;
2933
2934     p = strrchr(input, '/');
2935     if (!p) {
2936         input_path_len = 0;
2937         pstrcpy(file_prefix, sizeof(file_prefix), input);
2938         pstrcpy(path, sizeof(path), ".");
2939     } else {
2940         input_path_len = p - input + 1;
2941         memcpy(path, input, input_path_len);
2942         if (input_path_len > sizeof(path) - 1)
2943             input_path_len = sizeof(path) - 1;
2944         path[input_path_len] = '\0';
2945         pstrcpy(file_prefix, sizeof(file_prefix), p + 1);
2946     }
2947
2948     ffs = opendir(path);
2949     if (!ffs)
2950         return;
2951     for(;;) {
2952         struct stat sb;
2953         d = readdir(ffs);
2954         if (!d)
2955             break;
2956
2957         if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) {
2958             continue;
2959         }
2960
2961         if (strstart(d->d_name, file_prefix, NULL)) {
2962             memcpy(file, input, input_path_len);
2963             if (input_path_len < sizeof(file))
2964                 pstrcpy(file + input_path_len, sizeof(file) - input_path_len,
2965                         d->d_name);
2966             /* stat the file to find out if it's a directory.
2967              * In that case add a slash to speed up typing long paths
2968              */
2969             if (stat(file, &sb) == 0 && S_ISDIR(sb.st_mode)) {
2970                 pstrcat(file, sizeof(file), "/");
2971             }
2972             readline_add_completion(mon->rs, file);
2973         }
2974     }
2975     closedir(ffs);
2976 }
2977
2978 static const char *next_arg_type(const char *typestr)
2979 {
2980     const char *p = strchr(typestr, ':');
2981     return (p != NULL ? ++p : typestr);
2982 }
2983
2984 static void add_completion_option(ReadLineState *rs, const char *str,
2985                                   const char *option)
2986 {
2987     if (!str || !option) {
2988         return;
2989     }
2990     if (!strncmp(option, str, strlen(str))) {
2991         readline_add_completion(rs, option);
2992     }
2993 }
2994
2995 void chardev_add_completion(ReadLineState *rs, int nb_args, const char *str)
2996 {
2997     size_t len;
2998     ChardevBackendInfoList *list, *start;
2999
3000     if (nb_args != 2) {
3001         return;
3002     }
3003     len = strlen(str);
3004     readline_set_completion_index(rs, len);
3005
3006     start = list = qmp_query_chardev_backends(NULL);
3007     while (list) {
3008         const char *chr_name = list->value->name;
3009
3010         if (!strncmp(chr_name, str, len)) {
3011             readline_add_completion(rs, chr_name);
3012         }
3013         list = list->next;
3014     }
3015     qapi_free_ChardevBackendInfoList(start);
3016 }
3017
3018 void netdev_add_completion(ReadLineState *rs, int nb_args, const char *str)
3019 {
3020     size_t len;
3021     int i;
3022
3023     if (nb_args != 2) {
3024         return;
3025     }
3026     len = strlen(str);
3027     readline_set_completion_index(rs, len);
3028     for (i = 0; NetClientOptionsKind_lookup[i]; i++) {
3029         add_completion_option(rs, str, NetClientOptionsKind_lookup[i]);
3030     }
3031 }
3032
3033 void device_add_completion(ReadLineState *rs, int nb_args, const char *str)
3034 {
3035     GSList *list, *elt;
3036     size_t len;
3037
3038     if (nb_args != 2) {
3039         return;
3040     }
3041
3042     len = strlen(str);
3043     readline_set_completion_index(rs, len);
3044     list = elt = object_class_get_list(TYPE_DEVICE, false);
3045     while (elt) {
3046         const char *name;
3047         DeviceClass *dc = OBJECT_CLASS_CHECK(DeviceClass, elt->data,
3048                                              TYPE_DEVICE);
3049         name = object_class_get_name(OBJECT_CLASS(dc));
3050
3051         if (!dc->cannot_instantiate_with_device_add_yet
3052             && !strncmp(name, str, len)) {
3053             readline_add_completion(rs, name);
3054         }
3055         elt = elt->next;
3056     }
3057     g_slist_free(list);
3058 }
3059
3060 void object_add_completion(ReadLineState *rs, int nb_args, const char *str)
3061 {
3062     GSList *list, *elt;
3063     size_t len;
3064
3065     if (nb_args != 2) {
3066         return;
3067     }
3068
3069     len = strlen(str);
3070     readline_set_completion_index(rs, len);
3071     list = elt = object_class_get_list(TYPE_USER_CREATABLE, false);
3072     while (elt) {
3073         const char *name;
3074
3075         name = object_class_get_name(OBJECT_CLASS(elt->data));
3076         if (!strncmp(name, str, len) && strcmp(name, TYPE_USER_CREATABLE)) {
3077             readline_add_completion(rs, name);
3078         }
3079         elt = elt->next;
3080     }
3081     g_slist_free(list);
3082 }
3083
3084 static void peripheral_device_del_completion(ReadLineState *rs,
3085                                              const char *str, size_t len)
3086 {
3087     Object *peripheral = container_get(qdev_get_machine(), "/peripheral");
3088     GSList *list, *item;
3089
3090     list = qdev_build_hotpluggable_device_list(peripheral);
3091     if (!list) {
3092         return;
3093     }
3094
3095     for (item = list; item; item = g_slist_next(item)) {
3096         DeviceState *dev = item->data;
3097
3098         if (dev->id && !strncmp(str, dev->id, len)) {
3099             readline_add_completion(rs, dev->id);
3100         }
3101     }
3102
3103     g_slist_free(list);
3104 }
3105
3106 void chardev_remove_completion(ReadLineState *rs, int nb_args, const char *str)
3107 {
3108     size_t len;
3109     ChardevInfoList *list, *start;
3110
3111     if (nb_args != 2) {
3112         return;
3113     }
3114     len = strlen(str);
3115     readline_set_completion_index(rs, len);
3116
3117     start = list = qmp_query_chardev(NULL);
3118     while (list) {
3119         ChardevInfo *chr = list->value;
3120
3121         if (!strncmp(chr->label, str, len)) {
3122             readline_add_completion(rs, chr->label);
3123         }
3124         list = list->next;
3125     }
3126     qapi_free_ChardevInfoList(start);
3127 }
3128
3129 static void ringbuf_completion(ReadLineState *rs, const char *str)
3130 {
3131     size_t len;
3132     ChardevInfoList *list, *start;
3133
3134     len = strlen(str);
3135     readline_set_completion_index(rs, len);
3136
3137     start = list = qmp_query_chardev(NULL);
3138     while (list) {
3139         ChardevInfo *chr_info = list->value;
3140
3141         if (!strncmp(chr_info->label, str, len)) {
3142             CharDriverState *chr = qemu_chr_find(chr_info->label);
3143             if (chr && chr_is_ringbuf(chr)) {
3144                 readline_add_completion(rs, chr_info->label);
3145             }
3146         }
3147         list = list->next;
3148     }
3149     qapi_free_ChardevInfoList(start);
3150 }
3151
3152 void ringbuf_write_completion(ReadLineState *rs, int nb_args, const char *str)
3153 {
3154     if (nb_args != 2) {
3155         return;
3156     }
3157     ringbuf_completion(rs, str);
3158 }
3159
3160 void device_del_completion(ReadLineState *rs, int nb_args, const char *str)
3161 {
3162     size_t len;
3163
3164     if (nb_args != 2) {
3165         return;
3166     }
3167
3168     len = strlen(str);
3169     readline_set_completion_index(rs, len);
3170     peripheral_device_del_completion(rs, str, len);
3171 }
3172
3173 void object_del_completion(ReadLineState *rs, int nb_args, const char *str)
3174 {
3175     ObjectPropertyInfoList *list, *start;
3176     size_t len;
3177
3178     if (nb_args != 2) {
3179         return;
3180     }
3181     len = strlen(str);
3182     readline_set_completion_index(rs, len);
3183
3184     start = list = qmp_qom_list("/objects", NULL);
3185     while (list) {
3186         ObjectPropertyInfo *info = list->value;
3187
3188         if (!strncmp(info->type, "child<", 5)
3189             && !strncmp(info->name, str, len)) {
3190             readline_add_completion(rs, info->name);
3191         }
3192         list = list->next;
3193     }
3194     qapi_free_ObjectPropertyInfoList(start);
3195 }
3196
3197 void sendkey_completion(ReadLineState *rs, int nb_args, const char *str)
3198 {
3199     int i;
3200     char *sep;
3201     size_t len;
3202
3203     if (nb_args != 2) {
3204         return;
3205     }
3206     sep = strrchr(str, '-');
3207     if (sep) {
3208         str = sep + 1;
3209     }
3210     len = strlen(str);
3211     readline_set_completion_index(rs, len);
3212     for (i = 0; i < Q_KEY_CODE_MAX; i++) {
3213         if (!strncmp(str, QKeyCode_lookup[i], len)) {
3214             readline_add_completion(rs, QKeyCode_lookup[i]);
3215         }
3216     }
3217 }
3218
3219 void set_link_completion(ReadLineState *rs, int nb_args, const char *str)
3220 {
3221     size_t len;
3222
3223     len = strlen(str);
3224     readline_set_completion_index(rs, len);
3225     if (nb_args == 2) {
3226         NetClientState *ncs[MAX_QUEUE_NUM];
3227         int count, i;
3228         count = qemu_find_net_clients_except(NULL, ncs,
3229                                              NET_CLIENT_OPTIONS_KIND_NONE,
3230                                              MAX_QUEUE_NUM);
3231         for (i = 0; i < MIN(count, MAX_QUEUE_NUM); i++) {
3232             const char *name = ncs[i]->name;
3233             if (!strncmp(str, name, len)) {
3234                 readline_add_completion(rs, name);
3235             }
3236         }
3237     } else if (nb_args == 3) {
3238         add_completion_option(rs, str, "on");
3239         add_completion_option(rs, str, "off");
3240     }
3241 }
3242
3243 void netdev_del_completion(ReadLineState *rs, int nb_args, const char *str)
3244 {
3245     int len, count, i;
3246     NetClientState *ncs[MAX_QUEUE_NUM];
3247
3248     if (nb_args != 2) {
3249         return;
3250     }
3251
3252     len = strlen(str);
3253     readline_set_completion_index(rs, len);
3254     count = qemu_find_net_clients_except(NULL, ncs, NET_CLIENT_OPTIONS_KIND_NIC,
3255                                          MAX_QUEUE_NUM);
3256     for (i = 0; i < MIN(count, MAX_QUEUE_NUM); i++) {
3257         QemuOpts *opts;
3258         const char *name = ncs[i]->name;
3259         if (strncmp(str, name, len)) {
3260             continue;
3261         }
3262         opts = qemu_opts_find(qemu_find_opts_err("netdev", NULL), name);
3263         if (opts) {
3264             readline_add_completion(rs, name);
3265         }
3266     }
3267 }
3268
3269 void trace_event_completion(ReadLineState *rs, int nb_args, const char *str)
3270 {
3271     size_t len;
3272
3273     len = strlen(str);
3274     readline_set_completion_index(rs, len);
3275     if (nb_args == 2) {
3276         TraceEventID id;
3277         for (id = 0; id < trace_event_count(); id++) {
3278             const char *event_name = trace_event_get_name(trace_event_id(id));
3279             if (!strncmp(str, event_name, len)) {
3280                 readline_add_completion(rs, event_name);
3281             }
3282         }
3283     } else if (nb_args == 3) {
3284         add_completion_option(rs, str, "on");
3285         add_completion_option(rs, str, "off");
3286     }
3287 }
3288
3289 void watchdog_action_completion(ReadLineState *rs, int nb_args, const char *str)
3290 {
3291     int i;
3292
3293     if (nb_args != 2) {
3294         return;
3295     }
3296     readline_set_completion_index(rs, strlen(str));
3297     for (i = 0; WatchdogExpirationAction_lookup[i]; i++) {
3298         add_completion_option(rs, str, WatchdogExpirationAction_lookup[i]);
3299     }
3300 }
3301
3302 void migrate_set_capability_completion(ReadLineState *rs, int nb_args,
3303                                        const char *str)
3304 {
3305     size_t len;
3306
3307     len = strlen(str);
3308     readline_set_completion_index(rs, len);
3309     if (nb_args == 2) {
3310         int i;
3311         for (i = 0; i < MIGRATION_CAPABILITY_MAX; i++) {
3312             const char *name = MigrationCapability_lookup[i];
3313             if (!strncmp(str, name, len)) {
3314                 readline_add_completion(rs, name);
3315             }
3316         }
3317     } else if (nb_args == 3) {
3318         add_completion_option(rs, str, "on");
3319         add_completion_option(rs, str, "off");
3320     }
3321 }
3322
3323 void migrate_set_parameter_completion(ReadLineState *rs, int nb_args,
3324                                       const char *str)
3325 {
3326     size_t len;
3327
3328     len = strlen(str);
3329     readline_set_completion_index(rs, len);
3330     if (nb_args == 2) {
3331         int i;
3332         for (i = 0; i < MIGRATION_PARAMETER_MAX; i++) {
3333             const char *name = MigrationParameter_lookup[i];
3334             if (!strncmp(str, name, len)) {
3335                 readline_add_completion(rs, name);
3336             }
3337         }
3338     }
3339 }
3340
3341 void host_net_add_completion(ReadLineState *rs, int nb_args, const char *str)
3342 {
3343     int i;
3344     size_t len;
3345     if (nb_args != 2) {
3346         return;
3347     }
3348     len = strlen(str);
3349     readline_set_completion_index(rs, len);
3350     for (i = 0; host_net_devices[i]; i++) {
3351         if (!strncmp(host_net_devices[i], str, len)) {
3352             readline_add_completion(rs, host_net_devices[i]);
3353         }
3354     }
3355 }
3356
3357 void host_net_remove_completion(ReadLineState *rs, int nb_args, const char *str)
3358 {
3359     NetClientState *ncs[MAX_QUEUE_NUM];
3360     int count, i, len;
3361
3362     len = strlen(str);
3363     readline_set_completion_index(rs, len);
3364     if (nb_args == 2) {
3365         count = qemu_find_net_clients_except(NULL, ncs,
3366                                              NET_CLIENT_OPTIONS_KIND_NONE,
3367                                              MAX_QUEUE_NUM);
3368         for (i = 0; i < MIN(count, MAX_QUEUE_NUM); i++) {
3369             int id;
3370             char name[16];
3371
3372             if (net_hub_id_for_client(ncs[i], &id)) {
3373                 continue;
3374             }
3375             snprintf(name, sizeof(name), "%d", id);
3376             if (!strncmp(str, name, len)) {
3377                 readline_add_completion(rs, name);
3378             }
3379         }
3380         return;
3381     } else if (nb_args == 3) {
3382         count = qemu_find_net_clients_except(NULL, ncs,
3383                                              NET_CLIENT_OPTIONS_KIND_NIC,
3384                                              MAX_QUEUE_NUM);
3385         for (i = 0; i < MIN(count, MAX_QUEUE_NUM); i++) {
3386             int id;
3387             const char *name;
3388
3389             if (ncs[i]->info->type == NET_CLIENT_OPTIONS_KIND_HUBPORT ||
3390                 net_hub_id_for_client(ncs[i], &id)) {
3391                 continue;
3392             }
3393             name = ncs[i]->name;
3394             if (!strncmp(str, name, len)) {
3395                 readline_add_completion(rs, name);
3396             }
3397         }
3398         return;
3399     }
3400 }
3401
3402 static void vm_completion(ReadLineState *rs, const char *str)
3403 {
3404     size_t len;
3405     BlockDriverState *bs = NULL;
3406
3407     len = strlen(str);
3408     readline_set_completion_index(rs, len);
3409     while ((bs = bdrv_next(bs))) {
3410         SnapshotInfoList *snapshots, *snapshot;
3411
3412         if (!bdrv_can_snapshot(bs)) {
3413             continue;
3414         }
3415         if (bdrv_query_snapshot_info_list(bs, &snapshots, NULL)) {
3416             continue;
3417         }
3418         snapshot = snapshots;
3419         while (snapshot) {
3420             char *completion = snapshot->value->name;
3421             if (!strncmp(str, completion, len)) {
3422                 readline_add_completion(rs, completion);
3423             }
3424             completion = snapshot->value->id;
3425             if (!strncmp(str, completion, len)) {
3426                 readline_add_completion(rs, completion);
3427             }
3428             snapshot = snapshot->next;
3429         }
3430         qapi_free_SnapshotInfoList(snapshots);
3431     }
3432
3433 }
3434
3435 void delvm_completion(ReadLineState *rs, int nb_args, const char *str)
3436 {
3437     if (nb_args == 2) {
3438         vm_completion(rs, str);
3439     }
3440 }
3441
3442 void loadvm_completion(ReadLineState *rs, int nb_args, const char *str)
3443 {
3444     if (nb_args == 2) {
3445         vm_completion(rs, str);
3446     }
3447 }
3448
3449 static void monitor_find_completion_by_table(Monitor *mon,
3450                                              const mon_cmd_t *cmd_table,
3451                                              char **args,
3452                                              int nb_args)
3453 {
3454     const char *cmdname;
3455     int i;
3456     const char *ptype, *str, *name;
3457     const mon_cmd_t *cmd;
3458     BlockDriverState *bs;
3459
3460     if (nb_args <= 1) {
3461         /* command completion */
3462         if (nb_args == 0)
3463             cmdname = "";
3464         else
3465             cmdname = args[0];
3466         readline_set_completion_index(mon->rs, strlen(cmdname));
3467         for (cmd = cmd_table; cmd->name != NULL; cmd++) {
3468             cmd_completion(mon, cmdname, cmd->name);
3469         }
3470     } else {
3471         /* find the command */
3472         for (cmd = cmd_table; cmd->name != NULL; cmd++) {
3473             if (compare_cmd(args[0], cmd->name)) {
3474                 break;
3475             }
3476         }
3477         if (!cmd->name) {
3478             return;
3479         }
3480
3481         if (cmd->sub_table) {
3482             /* do the job again */
3483             monitor_find_completion_by_table(mon, cmd->sub_table,
3484                                              &args[1], nb_args - 1);
3485             return;
3486         }
3487         if (cmd->command_completion) {
3488             cmd->command_completion(mon->rs, nb_args, args[nb_args - 1]);
3489             return;
3490         }
3491
3492         ptype = next_arg_type(cmd->args_type);
3493         for(i = 0; i < nb_args - 2; i++) {
3494             if (*ptype != '\0') {
3495                 ptype = next_arg_type(ptype);
3496                 while (*ptype == '?')
3497                     ptype = next_arg_type(ptype);
3498             }
3499         }
3500         str = args[nb_args - 1];
3501         while (*ptype == '-' && ptype[1] != '\0') {
3502             ptype = next_arg_type(ptype);
3503         }
3504         switch(*ptype) {
3505         case 'F':
3506             /* file completion */
3507             readline_set_completion_index(mon->rs, strlen(str));
3508             file_completion(mon, str);
3509             break;
3510         case 'B':
3511             /* block device name completion */
3512             readline_set_completion_index(mon->rs, strlen(str));
3513             for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) {
3514                 name = bdrv_get_device_name(bs);
3515                 if (str[0] == '\0' ||
3516                     !strncmp(name, str, strlen(str))) {
3517                     readline_add_completion(mon->rs, name);
3518                 }
3519             }
3520             break;
3521         case 's':
3522         case 'S':
3523             if (!strcmp(cmd->name, "help|?")) {
3524                 monitor_find_completion_by_table(mon, cmd_table,
3525                                                  &args[1], nb_args - 1);
3526             }
3527             break;
3528         default:
3529             break;
3530         }
3531     }
3532 }
3533
3534 static void monitor_find_completion(void *opaque,
3535                                     const char *cmdline)
3536 {
3537     Monitor *mon = opaque;
3538     char *args[MAX_ARGS];
3539     int nb_args, len;
3540
3541     /* 1. parse the cmdline */
3542     if (parse_cmdline(cmdline, &nb_args, args) < 0) {
3543         return;
3544     }
3545
3546     /* if the line ends with a space, it means we want to complete the
3547        next arg */
3548     len = strlen(cmdline);
3549     if (len > 0 && qemu_isspace(cmdline[len - 1])) {
3550         if (nb_args >= MAX_ARGS) {
3551             goto cleanup;
3552         }
3553         args[nb_args++] = g_strdup("");
3554     }
3555
3556     /* 2. auto complete according to args */
3557     monitor_find_completion_by_table(mon, mon->cmd_table, args, nb_args);
3558
3559 cleanup:
3560     free_cmdline_args(args, nb_args);
3561 }
3562
3563 static int monitor_can_read(void *opaque)
3564 {
3565     Monitor *mon = opaque;
3566
3567     return (mon->suspend_cnt == 0) ? 1 : 0;
3568 }
3569
3570 static bool invalid_qmp_mode(const Monitor *mon, const mon_cmd_t *cmd,
3571                              Error **errp)
3572 {
3573     bool is_cap = cmd->mhandler.cmd_new == qmp_capabilities;
3574
3575     if (is_cap && mon->qmp.in_command_mode) {
3576         error_set(errp, ERROR_CLASS_COMMAND_NOT_FOUND,
3577                   "Capabilities negotiation is already complete, command "
3578                   "'%s' ignored", cmd->name);
3579         return true;
3580     }
3581     if (!is_cap && !mon->qmp.in_command_mode) {
3582         error_set(errp, ERROR_CLASS_COMMAND_NOT_FOUND,
3583                   "Expecting capabilities negotiation with "
3584                   "'qmp_capabilities' before command '%s'", cmd->name);
3585         return true;
3586     }
3587     return false;
3588 }
3589
3590 /*
3591  * Argument validation rules:
3592  *
3593  * 1. The argument must exist in cmd_args qdict
3594  * 2. The argument type must be the expected one
3595  *
3596  * Special case: If the argument doesn't exist in cmd_args and
3597  *               the QMP_ACCEPT_UNKNOWNS flag is set, then the
3598  *               checking is skipped for it.
3599  */
3600 static void check_client_args_type(const QDict *client_args,
3601                                    const QDict *cmd_args, int flags,
3602                                    Error **errp)
3603 {
3604     const QDictEntry *ent;
3605
3606     for (ent = qdict_first(client_args); ent;ent = qdict_next(client_args,ent)){
3607         QObject *obj;
3608         QString *arg_type;
3609         const QObject *client_arg = qdict_entry_value(ent);
3610         const char *client_arg_name = qdict_entry_key(ent);
3611
3612         obj = qdict_get(cmd_args, client_arg_name);
3613         if (!obj) {
3614             if (flags & QMP_ACCEPT_UNKNOWNS) {
3615                 /* handler accepts unknowns */
3616                 continue;
3617             }
3618             /* client arg doesn't exist */
3619             error_setg(errp, QERR_INVALID_PARAMETER, client_arg_name);
3620             return;
3621         }
3622
3623         arg_type = qobject_to_qstring(obj);
3624         assert(arg_type != NULL);
3625
3626         /* check if argument's type is correct */
3627         switch (qstring_get_str(arg_type)[0]) {
3628         case 'F':
3629         case 'B':
3630         case 's':
3631             if (qobject_type(client_arg) != QTYPE_QSTRING) {
3632                 error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
3633                            client_arg_name, "string");
3634                 return;
3635             }
3636         break;
3637         case 'i':
3638         case 'l':
3639         case 'M':
3640         case 'o':
3641             if (qobject_type(client_arg) != QTYPE_QINT) {
3642                 error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
3643                            client_arg_name, "int");
3644                 return;
3645             }
3646             break;
3647         case 'T':
3648             if (qobject_type(client_arg) != QTYPE_QINT &&
3649                 qobject_type(client_arg) != QTYPE_QFLOAT) {
3650                 error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
3651                            client_arg_name, "number");
3652                 return;
3653             }
3654             break;
3655         case 'b':
3656         case '-':
3657             if (qobject_type(client_arg) != QTYPE_QBOOL) {
3658                 error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
3659                            client_arg_name, "bool");
3660                 return;
3661             }
3662             break;
3663         case 'O':
3664             assert(flags & QMP_ACCEPT_UNKNOWNS);
3665             break;
3666         case 'q':
3667             /* Any QObject can be passed.  */
3668             break;
3669         case '/':
3670         case '.':
3671             /*
3672              * These types are not supported by QMP and thus are not
3673              * handled here. Fall through.
3674              */
3675         default:
3676             abort();
3677         }
3678     }
3679 }
3680
3681 /*
3682  * - Check if the client has passed all mandatory args
3683  * - Set special flags for argument validation
3684  */
3685 static void check_mandatory_args(const QDict *cmd_args,
3686                                  const QDict *client_args, int *flags,
3687                                  Error **errp)
3688 {
3689     const QDictEntry *ent;
3690
3691     for (ent = qdict_first(cmd_args); ent; ent = qdict_next(cmd_args, ent)) {
3692         const char *cmd_arg_name = qdict_entry_key(ent);
3693         QString *type = qobject_to_qstring(qdict_entry_value(ent));
3694         assert(type != NULL);
3695
3696         if (qstring_get_str(type)[0] == 'O') {
3697             assert((*flags & QMP_ACCEPT_UNKNOWNS) == 0);
3698             *flags |= QMP_ACCEPT_UNKNOWNS;
3699         } else if (qstring_get_str(type)[0] != '-' &&
3700                    qstring_get_str(type)[1] != '?' &&
3701                    !qdict_haskey(client_args, cmd_arg_name)) {
3702             error_setg(errp, QERR_MISSING_PARAMETER, cmd_arg_name);
3703             return;
3704         }
3705     }
3706 }
3707
3708 static QDict *qdict_from_args_type(const char *args_type)
3709 {
3710     int i;
3711     QDict *qdict;
3712     QString *key, *type, *cur_qs;
3713
3714     assert(args_type != NULL);
3715
3716     qdict = qdict_new();
3717
3718     if (args_type == NULL || args_type[0] == '\0') {
3719         /* no args, empty qdict */
3720         goto out;
3721     }
3722
3723     key = qstring_new();
3724     type = qstring_new();
3725
3726     cur_qs = key;
3727
3728     for (i = 0;; i++) {
3729         switch (args_type[i]) {
3730             case ',':
3731             case '\0':
3732                 qdict_put(qdict, qstring_get_str(key), type);
3733                 QDECREF(key);
3734                 if (args_type[i] == '\0') {
3735                     goto out;
3736                 }
3737                 type = qstring_new(); /* qdict has ref */
3738                 cur_qs = key = qstring_new();
3739                 break;
3740             case ':':
3741                 cur_qs = type;
3742                 break;
3743             default:
3744                 qstring_append_chr(cur_qs, args_type[i]);
3745                 break;
3746         }
3747     }
3748
3749 out:
3750     return qdict;
3751 }
3752
3753 /*
3754  * Client argument checking rules:
3755  *
3756  * 1. Client must provide all mandatory arguments
3757  * 2. Each argument provided by the client must be expected
3758  * 3. Each argument provided by the client must have the type expected
3759  *    by the command
3760  */
3761 static void qmp_check_client_args(const mon_cmd_t *cmd, QDict *client_args,
3762                                   Error **errp)
3763 {
3764     Error *err = NULL;
3765     int flags;
3766     QDict *cmd_args;
3767
3768     cmd_args = qdict_from_args_type(cmd->args_type);
3769
3770     flags = 0;
3771     check_mandatory_args(cmd_args, client_args, &flags, &err);
3772     if (err) {
3773         goto out;
3774     }
3775
3776     check_client_args_type(client_args, cmd_args, flags, &err);
3777
3778 out:
3779     error_propagate(errp, err);
3780     QDECREF(cmd_args);
3781 }
3782
3783 /*
3784  * Input object checking rules
3785  *
3786  * 1. Input object must be a dict
3787  * 2. The "execute" key must exist
3788  * 3. The "execute" key must be a string
3789  * 4. If the "arguments" key exists, it must be a dict
3790  * 5. If the "id" key exists, it can be anything (ie. json-value)
3791  * 6. Any argument not listed above is considered invalid
3792  */
3793 static QDict *qmp_check_input_obj(QObject *input_obj, Error **errp)
3794 {
3795     const QDictEntry *ent;
3796     int has_exec_key = 0;
3797     QDict *input_dict;
3798
3799     if (qobject_type(input_obj) != QTYPE_QDICT) {
3800         error_setg(errp, QERR_QMP_BAD_INPUT_OBJECT, "object");
3801         return NULL;
3802     }
3803
3804     input_dict = qobject_to_qdict(input_obj);
3805
3806     for (ent = qdict_first(input_dict); ent; ent = qdict_next(input_dict, ent)){
3807         const char *arg_name = qdict_entry_key(ent);
3808         const QObject *arg_obj = qdict_entry_value(ent);
3809
3810         if (!strcmp(arg_name, "execute")) {
3811             if (qobject_type(arg_obj) != QTYPE_QSTRING) {
3812                 error_setg(errp, QERR_QMP_BAD_INPUT_OBJECT_MEMBER,
3813                            "execute", "string");
3814                 return NULL;
3815             }
3816             has_exec_key = 1;
3817         } else if (!strcmp(arg_name, "arguments")) {
3818             if (qobject_type(arg_obj) != QTYPE_QDICT) {
3819                 error_setg(errp, QERR_QMP_BAD_INPUT_OBJECT_MEMBER,
3820                            "arguments", "object");
3821                 return NULL;
3822             }
3823         } else if (!strcmp(arg_name, "id")) {
3824             /* Any string is acceptable as "id", so nothing to check */
3825         } else {
3826             error_setg(errp, QERR_QMP_EXTRA_MEMBER, arg_name);
3827             return NULL;
3828         }
3829     }
3830
3831     if (!has_exec_key) {
3832         error_setg(errp, QERR_QMP_BAD_INPUT_OBJECT, "execute");
3833         return NULL;
3834     }
3835
3836     return input_dict;
3837 }
3838
3839 static void handle_qmp_command(JSONMessageParser *parser, QList *tokens)
3840 {
3841     Error *local_err = NULL;
3842     QObject *obj, *data;
3843     QDict *input, *args;
3844     const mon_cmd_t *cmd;
3845     const char *cmd_name;
3846     Monitor *mon = cur_mon;
3847
3848     args = input = NULL;
3849     data = NULL;
3850
3851     obj = json_parser_parse(tokens, NULL);
3852     if (!obj) {
3853         // FIXME: should be triggered in json_parser_parse()
3854         error_setg(&local_err, QERR_JSON_PARSING);
3855         goto err_out;
3856     }
3857
3858     input = qmp_check_input_obj(obj, &local_err);
3859     if (!input) {
3860         qobject_decref(obj);
3861         goto err_out;
3862     }
3863
3864     mon->qmp.id = qdict_get(input, "id");
3865     qobject_incref(mon->qmp.id);
3866
3867     cmd_name = qdict_get_str(input, "execute");
3868     trace_handle_qmp_command(mon, cmd_name);
3869     cmd = qmp_find_cmd(cmd_name);
3870     if (!cmd) {
3871         error_set(&local_err, ERROR_CLASS_COMMAND_NOT_FOUND,
3872                   "The command %s has not been found", cmd_name);
3873         goto err_out;
3874     }
3875     if (invalid_qmp_mode(mon, cmd, &local_err)) {
3876         goto err_out;
3877     }
3878
3879     obj = qdict_get(input, "arguments");
3880     if (!obj) {
3881         args = qdict_new();
3882     } else {
3883         args = qobject_to_qdict(obj);
3884         QINCREF(args);
3885     }
3886
3887     qmp_check_client_args(cmd, args, &local_err);
3888     if (local_err) {
3889         goto err_out;
3890     }
3891
3892     cmd->mhandler.cmd_new(args, &data, &local_err);
3893
3894 err_out:
3895     monitor_protocol_emitter(mon, data, local_err);
3896     qobject_decref(data);
3897     QDECREF(input);
3898     QDECREF(args);
3899 }
3900
3901 static void monitor_qmp_read(void *opaque, const uint8_t *buf, int size)
3902 {
3903     Monitor *old_mon = cur_mon;
3904
3905     cur_mon = opaque;
3906
3907     json_message_parser_feed(&cur_mon->qmp.parser, (const char *) buf, size);
3908
3909     cur_mon = old_mon;
3910 }
3911
3912 static void monitor_read(void *opaque, const uint8_t *buf, int size)
3913 {
3914     Monitor *old_mon = cur_mon;
3915     int i;
3916
3917     cur_mon = opaque;
3918
3919     if (cur_mon->rs) {
3920         for (i = 0; i < size; i++)
3921             readline_handle_byte(cur_mon->rs, buf[i]);
3922     } else {
3923         if (size == 0 || buf[size - 1] != 0)
3924             monitor_printf(cur_mon, "corrupted command\n");
3925         else
3926             handle_hmp_command(cur_mon, (char *)buf);
3927     }
3928
3929     cur_mon = old_mon;
3930 }
3931
3932 static void monitor_command_cb(void *opaque, const char *cmdline,
3933                                void *readline_opaque)
3934 {
3935     Monitor *mon = opaque;
3936
3937     monitor_suspend(mon);
3938     handle_hmp_command(mon, cmdline);
3939     monitor_resume(mon);
3940 }
3941
3942 int monitor_suspend(Monitor *mon)
3943 {
3944     if (!mon->rs)
3945         return -ENOTTY;
3946     mon->suspend_cnt++;
3947     return 0;
3948 }
3949
3950 void monitor_resume(Monitor *mon)
3951 {
3952     if (!mon->rs)
3953         return;
3954     if (--mon->suspend_cnt == 0)
3955         readline_show_prompt(mon->rs);
3956 }
3957
3958 static QObject *get_qmp_greeting(void)
3959 {
3960     QObject *ver = NULL;
3961
3962     qmp_marshal_query_version(NULL, &ver, NULL);
3963     return qobject_from_jsonf("{'QMP':{'version': %p,'capabilities': []}}",ver);
3964 }
3965
3966 static void monitor_qmp_event(void *opaque, int event)
3967 {
3968     QObject *data;
3969     Monitor *mon = opaque;
3970
3971     switch (event) {
3972     case CHR_EVENT_OPENED:
3973         mon->qmp.in_command_mode = false;
3974         data = get_qmp_greeting();
3975         monitor_json_emitter(mon, data);
3976         qobject_decref(data);
3977         mon_refcount++;
3978         break;
3979     case CHR_EVENT_CLOSED:
3980         json_message_parser_destroy(&mon->qmp.parser);
3981         json_message_parser_init(&mon->qmp.parser, handle_qmp_command);
3982         mon_refcount--;
3983         monitor_fdsets_cleanup();
3984         break;
3985     }
3986 }
3987
3988 static void monitor_event(void *opaque, int event)
3989 {
3990     Monitor *mon = opaque;
3991
3992     switch (event) {
3993     case CHR_EVENT_MUX_IN:
3994         qemu_mutex_lock(&mon->out_lock);
3995         mon->mux_out = 0;
3996         qemu_mutex_unlock(&mon->out_lock);
3997         if (mon->reset_seen) {
3998             readline_restart(mon->rs);
3999             monitor_resume(mon);
4000             monitor_flush(mon);
4001         } else {
4002             mon->suspend_cnt = 0;
4003         }
4004         break;
4005
4006     case CHR_EVENT_MUX_OUT:
4007         if (mon->reset_seen) {
4008             if (mon->suspend_cnt == 0) {
4009                 monitor_printf(mon, "\n");
4010             }
4011             monitor_flush(mon);
4012             monitor_suspend(mon);
4013         } else {
4014             mon->suspend_cnt++;
4015         }
4016         qemu_mutex_lock(&mon->out_lock);
4017         mon->mux_out = 1;
4018         qemu_mutex_unlock(&mon->out_lock);
4019         break;
4020
4021     case CHR_EVENT_OPENED:
4022         monitor_printf(mon, "QEMU %s monitor - type 'help' for more "
4023                        "information\n", QEMU_VERSION);
4024         if (!mon->mux_out) {
4025             readline_restart(mon->rs);
4026             readline_show_prompt(mon->rs);
4027         }
4028         mon->reset_seen = 1;
4029         mon_refcount++;
4030         break;
4031
4032     case CHR_EVENT_CLOSED:
4033         mon_refcount--;
4034         monitor_fdsets_cleanup();
4035         break;
4036     }
4037 }
4038
4039 static int
4040 compare_mon_cmd(const void *a, const void *b)
4041 {
4042     return strcmp(((const mon_cmd_t *)a)->name,
4043             ((const mon_cmd_t *)b)->name);
4044 }
4045
4046 static void sortcmdlist(void)
4047 {
4048     int array_num;
4049     int elem_size = sizeof(mon_cmd_t);
4050
4051     array_num = sizeof(mon_cmds)/elem_size-1;
4052     qsort((void *)mon_cmds, array_num, elem_size, compare_mon_cmd);
4053
4054     array_num = sizeof(info_cmds)/elem_size-1;
4055     qsort((void *)info_cmds, array_num, elem_size, compare_mon_cmd);
4056 }
4057
4058
4059 /*
4060  * Local variables:
4061  *  c-indent-level: 4
4062  *  c-basic-offset: 4
4063  *  tab-width: 8
4064  * End:
4065  */
4066
4067 /* These functions just adapt the readline interface in a typesafe way.  We
4068  * could cast function pointers but that discards compiler checks.
4069  */
4070 static void GCC_FMT_ATTR(2, 3) monitor_readline_printf(void *opaque,
4071                                                        const char *fmt, ...)
4072 {
4073     va_list ap;
4074     va_start(ap, fmt);
4075     monitor_vprintf(opaque, fmt, ap);
4076     va_end(ap);
4077 }
4078
4079 static void monitor_readline_flush(void *opaque)
4080 {
4081     monitor_flush(opaque);
4082 }
4083
4084 static void __attribute__((constructor)) monitor_lock_init(void)
4085 {
4086     qemu_mutex_init(&monitor_lock);
4087 }
4088
4089 void monitor_init(CharDriverState *chr, int flags)
4090 {
4091     static int is_first_init = 1;
4092     Monitor *mon;
4093
4094     if (is_first_init) {
4095         monitor_qapi_event_init();
4096         sortcmdlist();
4097         is_first_init = 0;
4098     }
4099
4100     mon = g_malloc(sizeof(*mon));
4101     monitor_data_init(mon);
4102
4103     mon->chr = chr;
4104     mon->flags = flags;
4105     if (flags & MONITOR_USE_READLINE) {
4106         mon->rs = readline_init(monitor_readline_printf,
4107                                 monitor_readline_flush,
4108                                 mon,
4109                                 monitor_find_completion);
4110         monitor_read_command(mon, 0);
4111     }
4112
4113     if (monitor_is_qmp(mon)) {
4114         qemu_chr_add_handlers(chr, monitor_can_read, monitor_qmp_read,
4115                               monitor_qmp_event, mon);
4116         qemu_chr_fe_set_echo(chr, true);
4117         json_message_parser_init(&mon->qmp.parser, handle_qmp_command);
4118     } else {
4119         qemu_chr_add_handlers(chr, monitor_can_read, monitor_read,
4120                               monitor_event, mon);
4121     }
4122
4123     qemu_mutex_lock(&monitor_lock);
4124     QLIST_INSERT_HEAD(&mon_list, mon, entry);
4125     qemu_mutex_unlock(&monitor_lock);
4126 }
4127
4128 static void bdrv_password_cb(void *opaque, const char *password,
4129                              void *readline_opaque)
4130 {
4131     Monitor *mon = opaque;
4132     BlockDriverState *bs = readline_opaque;
4133     int ret = 0;
4134     Error *local_err = NULL;
4135
4136     bdrv_add_key(bs, password, &local_err);
4137     if (local_err) {
4138         monitor_printf(mon, "%s\n", error_get_pretty(local_err));
4139         error_free(local_err);
4140         ret = -EPERM;
4141     }
4142     if (mon->password_completion_cb)
4143         mon->password_completion_cb(mon->password_opaque, ret);
4144
4145     monitor_read_command(mon, 1);
4146 }
4147
4148 int monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs,
4149                                 BlockCompletionFunc *completion_cb,
4150                                 void *opaque)
4151 {
4152     int err;
4153
4154     monitor_printf(mon, "%s (%s) is encrypted.\n", bdrv_get_device_name(bs),
4155                    bdrv_get_encrypted_filename(bs));
4156
4157     mon->password_completion_cb = completion_cb;
4158     mon->password_opaque = opaque;
4159
4160     err = monitor_read_password(mon, bdrv_password_cb, bs);
4161
4162     if (err && completion_cb)
4163         completion_cb(opaque, err);
4164
4165     return err;
4166 }
4167
4168 int monitor_read_block_device_key(Monitor *mon, const char *device,
4169                                   BlockCompletionFunc *completion_cb,
4170                                   void *opaque)
4171 {
4172     Error *err = NULL;
4173     BlockBackend *blk;
4174
4175     blk = blk_by_name(device);
4176     if (!blk) {
4177         monitor_printf(mon, "Device not found %s\n", device);
4178         return -1;
4179     }
4180     if (!blk_bs(blk)) {
4181         monitor_printf(mon, "Device '%s' has no medium\n", device);
4182         return -1;
4183     }
4184
4185     bdrv_add_key(blk_bs(blk), NULL, &err);
4186     if (err) {
4187         error_free(err);
4188         return monitor_read_bdrv_key_start(mon, blk_bs(blk), completion_cb, opaque);
4189     }
4190
4191     if (completion_cb) {
4192         completion_cb(opaque, 0);
4193     }
4194     return 0;
4195 }
4196
4197 QemuOptsList qemu_mon_opts = {
4198     .name = "mon",
4199     .implied_opt_name = "chardev",
4200     .head = QTAILQ_HEAD_INITIALIZER(qemu_mon_opts.head),
4201     .desc = {
4202         {
4203             .name = "mode",
4204             .type = QEMU_OPT_STRING,
4205         },{
4206             .name = "chardev",
4207             .type = QEMU_OPT_STRING,
4208         },{
4209             .name = "default",
4210             .type = QEMU_OPT_BOOL,
4211         },{
4212             .name = "pretty",
4213             .type = QEMU_OPT_BOOL,
4214         },
4215         { /* end of list */ }
4216     },
4217 };
4218
4219 #ifndef TARGET_I386
4220 void qmp_rtc_reset_reinjection(Error **errp)
4221 {
4222     error_setg(errp, QERR_FEATURE_DISABLED, "rtc-reset-reinjection");
4223 }
4224 #endif
4225
4226 #ifndef TARGET_S390X
4227 void qmp_dump_skeys(const char *filename, Error **errp)
4228 {
4229     error_setg(errp, QERR_FEATURE_DISABLED, "dump-skeys");
4230 }
4231 #endif