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