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