]> Git Repo - qemu.git/blob - monitor/misc.c
qcow2.py: move qcow2 format classes to separate module
[qemu.git] / monitor / misc.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
25 #include "qemu/osdep.h"
26 #include "monitor-internal.h"
27 #include "cpu.h"
28 #include "monitor/qdev.h"
29 #include "hw/usb.h"
30 #include "hw/pci/pci.h"
31 #include "sysemu/watchdog.h"
32 #include "hw/loader.h"
33 #include "exec/gdbstub.h"
34 #include "net/net.h"
35 #include "net/slirp.h"
36 #include "chardev/char-mux.h"
37 #include "ui/qemu-spice.h"
38 #include "qemu/config-file.h"
39 #include "qemu/ctype.h"
40 #include "ui/console.h"
41 #include "ui/input.h"
42 #include "audio/audio.h"
43 #include "disas/disas.h"
44 #include "sysemu/balloon.h"
45 #include "qemu/timer.h"
46 #include "sysemu/hw_accel.h"
47 #include "sysemu/runstate.h"
48 #include "authz/list.h"
49 #include "qapi/util.h"
50 #include "sysemu/blockdev.h"
51 #include "sysemu/sysemu.h"
52 #include "sysemu/tcg.h"
53 #include "sysemu/tpm.h"
54 #include "qapi/qmp/qdict.h"
55 #include "qapi/qmp/qerror.h"
56 #include "qapi/qmp/qstring.h"
57 #include "qom/object_interfaces.h"
58 #include "trace/control.h"
59 #include "monitor/hmp-target.h"
60 #include "monitor/hmp.h"
61 #ifdef CONFIG_TRACE_SIMPLE
62 #include "trace/simple.h"
63 #endif
64 #include "exec/memory.h"
65 #include "exec/exec-all.h"
66 #include "qemu/option.h"
67 #include "qemu/thread.h"
68 #include "block/qapi.h"
69 #include "block/block-hmp-cmds.h"
70 #include "qapi/qapi-commands-char.h"
71 #include "qapi/qapi-commands-control.h"
72 #include "qapi/qapi-commands-migration.h"
73 #include "qapi/qapi-commands-misc.h"
74 #include "qapi/qapi-commands-qom.h"
75 #include "qapi/qapi-commands-trace.h"
76 #include "qapi/qapi-init-commands.h"
77 #include "qapi/error.h"
78 #include "qapi/qmp-event.h"
79 #include "sysemu/cpus.h"
80 #include "qemu/cutils.h"
81 #include "tcg/tcg.h"
82
83 #if defined(TARGET_S390X)
84 #include "hw/s390x/storage-keys.h"
85 #include "hw/s390x/storage-attributes.h"
86 #endif
87
88 /* file descriptors passed via SCM_RIGHTS */
89 typedef struct mon_fd_t mon_fd_t;
90 struct mon_fd_t {
91     char *name;
92     int fd;
93     QLIST_ENTRY(mon_fd_t) next;
94 };
95
96 /* file descriptor associated with a file descriptor set */
97 typedef struct MonFdsetFd MonFdsetFd;
98 struct MonFdsetFd {
99     int fd;
100     bool removed;
101     char *opaque;
102     QLIST_ENTRY(MonFdsetFd) next;
103 };
104
105 /* file descriptor set containing fds passed via SCM_RIGHTS */
106 typedef struct MonFdset MonFdset;
107 struct MonFdset {
108     int64_t id;
109     QLIST_HEAD(, MonFdsetFd) fds;
110     QLIST_HEAD(, MonFdsetFd) dup_fds;
111     QLIST_ENTRY(MonFdset) next;
112 };
113
114 /* Protects mon_fdsets */
115 static QemuMutex mon_fdsets_lock;
116 static QLIST_HEAD(, MonFdset) mon_fdsets;
117
118 static HMPCommand hmp_info_cmds[];
119
120 char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index,
121                                 int64_t cpu_index, Error **errp)
122 {
123     char *output = NULL;
124     Monitor *old_mon;
125     MonitorHMP hmp = {};
126
127     monitor_data_init(&hmp.common, false, true, false);
128
129     old_mon = cur_mon;
130     cur_mon = &hmp.common;
131
132     if (has_cpu_index) {
133         int ret = monitor_set_cpu(cpu_index);
134         if (ret < 0) {
135             cur_mon = old_mon;
136             error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index",
137                        "a CPU number");
138             goto out;
139         }
140     }
141
142     handle_hmp_command(&hmp, command_line);
143     cur_mon = old_mon;
144
145     qemu_mutex_lock(&hmp.common.mon_lock);
146     if (qstring_get_length(hmp.common.outbuf) > 0) {
147         output = g_strdup(qstring_get_str(hmp.common.outbuf));
148     } else {
149         output = g_strdup("");
150     }
151     qemu_mutex_unlock(&hmp.common.mon_lock);
152
153 out:
154     monitor_data_destroy(&hmp.common);
155     return output;
156 }
157
158 /**
159  * Is @name in the '|' separated list of names @list?
160  */
161 int hmp_compare_cmd(const char *name, const char *list)
162 {
163     const char *p, *pstart;
164     int len;
165     len = strlen(name);
166     p = list;
167     for (;;) {
168         pstart = p;
169         p = qemu_strchrnul(p, '|');
170         if ((p - pstart) == len && !memcmp(pstart, name, len)) {
171             return 1;
172         }
173         if (*p == '\0') {
174             break;
175         }
176         p++;
177     }
178     return 0;
179 }
180
181 static void do_help_cmd(Monitor *mon, const QDict *qdict)
182 {
183     help_cmd(mon, qdict_get_try_str(qdict, "name"));
184 }
185
186 static void hmp_trace_event(Monitor *mon, const QDict *qdict)
187 {
188     const char *tp_name = qdict_get_str(qdict, "name");
189     bool new_state = qdict_get_bool(qdict, "option");
190     bool has_vcpu = qdict_haskey(qdict, "vcpu");
191     int vcpu = qdict_get_try_int(qdict, "vcpu", 0);
192     Error *local_err = NULL;
193
194     if (vcpu < 0) {
195         monitor_printf(mon, "argument vcpu must be positive");
196         return;
197     }
198
199     qmp_trace_event_set_state(tp_name, new_state, true, true, has_vcpu, vcpu, &local_err);
200     if (local_err) {
201         error_report_err(local_err);
202     }
203 }
204
205 #ifdef CONFIG_TRACE_SIMPLE
206 static void hmp_trace_file(Monitor *mon, const QDict *qdict)
207 {
208     const char *op = qdict_get_try_str(qdict, "op");
209     const char *arg = qdict_get_try_str(qdict, "arg");
210
211     if (!op) {
212         st_print_trace_file_status();
213     } else if (!strcmp(op, "on")) {
214         st_set_trace_file_enabled(true);
215     } else if (!strcmp(op, "off")) {
216         st_set_trace_file_enabled(false);
217     } else if (!strcmp(op, "flush")) {
218         st_flush_trace_buffer();
219     } else if (!strcmp(op, "set")) {
220         if (arg) {
221             st_set_trace_file(arg);
222         }
223     } else {
224         monitor_printf(mon, "unexpected argument \"%s\"\n", op);
225         help_cmd(mon, "trace-file");
226     }
227 }
228 #endif
229
230 static void hmp_info_help(Monitor *mon, const QDict *qdict)
231 {
232     help_cmd(mon, "info");
233 }
234
235 static void monitor_init_qmp_commands(void)
236 {
237     /*
238      * Two command lists:
239      * - qmp_commands contains all QMP commands
240      * - qmp_cap_negotiation_commands contains just
241      *   "qmp_capabilities", to enforce capability negotiation
242      */
243
244     qmp_init_marshal(&qmp_commands);
245
246     qmp_register_command(&qmp_commands, "query-qmp-schema",
247                          qmp_query_qmp_schema, QCO_ALLOW_PRECONFIG);
248     qmp_register_command(&qmp_commands, "device_add", qmp_device_add,
249                          QCO_NO_OPTIONS);
250     qmp_register_command(&qmp_commands, "object-add", qmp_object_add,
251                          QCO_NO_OPTIONS);
252
253     QTAILQ_INIT(&qmp_cap_negotiation_commands);
254     qmp_register_command(&qmp_cap_negotiation_commands, "qmp_capabilities",
255                          qmp_marshal_qmp_capabilities, QCO_ALLOW_PRECONFIG);
256 }
257
258 /* Set the current CPU defined by the user. Callers must hold BQL. */
259 int monitor_set_cpu(int cpu_index)
260 {
261     CPUState *cpu;
262
263     cpu = qemu_get_cpu(cpu_index);
264     if (cpu == NULL) {
265         return -1;
266     }
267     g_free(cur_mon->mon_cpu_path);
268     cur_mon->mon_cpu_path = object_get_canonical_path(OBJECT(cpu));
269     return 0;
270 }
271
272 /* Callers must hold BQL. */
273 static CPUState *mon_get_cpu_sync(bool synchronize)
274 {
275     CPUState *cpu = NULL;
276
277     if (cur_mon->mon_cpu_path) {
278         cpu = (CPUState *) object_resolve_path_type(cur_mon->mon_cpu_path,
279                                                     TYPE_CPU, NULL);
280         if (!cpu) {
281             g_free(cur_mon->mon_cpu_path);
282             cur_mon->mon_cpu_path = NULL;
283         }
284     }
285     if (!cur_mon->mon_cpu_path) {
286         if (!first_cpu) {
287             return NULL;
288         }
289         monitor_set_cpu(first_cpu->cpu_index);
290         cpu = first_cpu;
291     }
292     assert(cpu != NULL);
293     if (synchronize) {
294         cpu_synchronize_state(cpu);
295     }
296     return cpu;
297 }
298
299 CPUState *mon_get_cpu(void)
300 {
301     return mon_get_cpu_sync(true);
302 }
303
304 CPUArchState *mon_get_cpu_env(void)
305 {
306     CPUState *cs = mon_get_cpu();
307
308     return cs ? cs->env_ptr : NULL;
309 }
310
311 int monitor_get_cpu_index(void)
312 {
313     CPUState *cs = mon_get_cpu_sync(false);
314
315     return cs ? cs->cpu_index : UNASSIGNED_CPU_INDEX;
316 }
317
318 static void hmp_info_registers(Monitor *mon, const QDict *qdict)
319 {
320     bool all_cpus = qdict_get_try_bool(qdict, "cpustate_all", false);
321     CPUState *cs;
322
323     if (all_cpus) {
324         CPU_FOREACH(cs) {
325             monitor_printf(mon, "\nCPU#%d\n", cs->cpu_index);
326             cpu_dump_state(cs, NULL, CPU_DUMP_FPU);
327         }
328     } else {
329         cs = mon_get_cpu();
330
331         if (!cs) {
332             monitor_printf(mon, "No CPU available\n");
333             return;
334         }
335
336         cpu_dump_state(cs, NULL, CPU_DUMP_FPU);
337     }
338 }
339
340 #ifdef CONFIG_TCG
341 static void hmp_info_jit(Monitor *mon, const QDict *qdict)
342 {
343     if (!tcg_enabled()) {
344         error_report("JIT information is only available with accel=tcg");
345         return;
346     }
347
348     dump_exec_info();
349     dump_drift_info();
350 }
351
352 static void hmp_info_opcount(Monitor *mon, const QDict *qdict)
353 {
354     dump_opcount_info();
355 }
356 #endif
357
358 static void hmp_info_sync_profile(Monitor *mon, const QDict *qdict)
359 {
360     int64_t max = qdict_get_try_int(qdict, "max", 10);
361     bool mean = qdict_get_try_bool(qdict, "mean", false);
362     bool coalesce = !qdict_get_try_bool(qdict, "no_coalesce", false);
363     enum QSPSortBy sort_by;
364
365     sort_by = mean ? QSP_SORT_BY_AVG_WAIT_TIME : QSP_SORT_BY_TOTAL_WAIT_TIME;
366     qsp_report(max, sort_by, coalesce);
367 }
368
369 static void hmp_info_history(Monitor *mon, const QDict *qdict)
370 {
371     MonitorHMP *hmp_mon = container_of(mon, MonitorHMP, common);
372     int i;
373     const char *str;
374
375     if (!hmp_mon->rs) {
376         return;
377     }
378     i = 0;
379     for(;;) {
380         str = readline_get_history(hmp_mon->rs, i);
381         if (!str) {
382             break;
383         }
384         monitor_printf(mon, "%d: '%s'\n", i, str);
385         i++;
386     }
387 }
388
389 static void hmp_info_cpustats(Monitor *mon, const QDict *qdict)
390 {
391     CPUState *cs = mon_get_cpu();
392
393     if (!cs) {
394         monitor_printf(mon, "No CPU available\n");
395         return;
396     }
397     cpu_dump_statistics(cs, 0);
398 }
399
400 static void hmp_info_trace_events(Monitor *mon, const QDict *qdict)
401 {
402     const char *name = qdict_get_try_str(qdict, "name");
403     bool has_vcpu = qdict_haskey(qdict, "vcpu");
404     int vcpu = qdict_get_try_int(qdict, "vcpu", 0);
405     TraceEventInfoList *events;
406     TraceEventInfoList *elem;
407     Error *local_err = NULL;
408
409     if (name == NULL) {
410         name = "*";
411     }
412     if (vcpu < 0) {
413         monitor_printf(mon, "argument vcpu must be positive");
414         return;
415     }
416
417     events = qmp_trace_event_get_state(name, has_vcpu, vcpu, &local_err);
418     if (local_err) {
419         error_report_err(local_err);
420         return;
421     }
422
423     for (elem = events; elem != NULL; elem = elem->next) {
424         monitor_printf(mon, "%s : state %u\n",
425                        elem->value->name,
426                        elem->value->state == TRACE_EVENT_STATE_ENABLED ? 1 : 0);
427     }
428     qapi_free_TraceEventInfoList(events);
429 }
430
431 void qmp_client_migrate_info(const char *protocol, const char *hostname,
432                              bool has_port, int64_t port,
433                              bool has_tls_port, int64_t tls_port,
434                              bool has_cert_subject, const char *cert_subject,
435                              Error **errp)
436 {
437     if (strcmp(protocol, "spice") == 0) {
438         if (!qemu_using_spice(errp)) {
439             return;
440         }
441
442         if (!has_port && !has_tls_port) {
443             error_setg(errp, QERR_MISSING_PARAMETER, "port/tls-port");
444             return;
445         }
446
447         if (qemu_spice_migrate_info(hostname,
448                                     has_port ? port : -1,
449                                     has_tls_port ? tls_port : -1,
450                                     cert_subject)) {
451             error_setg(errp, QERR_UNDEFINED_ERROR);
452             return;
453         }
454         return;
455     }
456
457     error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "protocol", "spice");
458 }
459
460 static void hmp_logfile(Monitor *mon, const QDict *qdict)
461 {
462     Error *err = NULL;
463
464     qemu_set_log_filename(qdict_get_str(qdict, "filename"), &err);
465     if (err) {
466         error_report_err(err);
467     }
468 }
469
470 static void hmp_log(Monitor *mon, const QDict *qdict)
471 {
472     int mask;
473     const char *items = qdict_get_str(qdict, "items");
474
475     if (!strcmp(items, "none")) {
476         mask = 0;
477     } else {
478         mask = qemu_str_to_log_mask(items);
479         if (!mask) {
480             help_cmd(mon, "log");
481             return;
482         }
483     }
484     qemu_set_log(mask);
485 }
486
487 static void hmp_singlestep(Monitor *mon, const QDict *qdict)
488 {
489     const char *option = qdict_get_try_str(qdict, "option");
490     if (!option || !strcmp(option, "on")) {
491         singlestep = 1;
492     } else if (!strcmp(option, "off")) {
493         singlestep = 0;
494     } else {
495         monitor_printf(mon, "unexpected option %s\n", option);
496     }
497 }
498
499 static void hmp_gdbserver(Monitor *mon, const QDict *qdict)
500 {
501     const char *device = qdict_get_try_str(qdict, "device");
502     if (!device)
503         device = "tcp::" DEFAULT_GDBSTUB_PORT;
504     if (gdbserver_start(device) < 0) {
505         monitor_printf(mon, "Could not open gdbserver on device '%s'\n",
506                        device);
507     } else if (strcmp(device, "none") == 0) {
508         monitor_printf(mon, "Disabled gdbserver\n");
509     } else {
510         monitor_printf(mon, "Waiting for gdb connection on device '%s'\n",
511                        device);
512     }
513 }
514
515 static void hmp_watchdog_action(Monitor *mon, const QDict *qdict)
516 {
517     const char *action = qdict_get_str(qdict, "action");
518     if (select_watchdog_action(action) == -1) {
519         monitor_printf(mon, "Unknown watchdog action '%s'\n", action);
520     }
521 }
522
523 static void monitor_printc(Monitor *mon, int c)
524 {
525     monitor_printf(mon, "'");
526     switch(c) {
527     case '\'':
528         monitor_printf(mon, "\\'");
529         break;
530     case '\\':
531         monitor_printf(mon, "\\\\");
532         break;
533     case '\n':
534         monitor_printf(mon, "\\n");
535         break;
536     case '\r':
537         monitor_printf(mon, "\\r");
538         break;
539     default:
540         if (c >= 32 && c <= 126) {
541             monitor_printf(mon, "%c", c);
542         } else {
543             monitor_printf(mon, "\\x%02x", c);
544         }
545         break;
546     }
547     monitor_printf(mon, "'");
548 }
549
550 static void memory_dump(Monitor *mon, int count, int format, int wsize,
551                         hwaddr addr, int is_physical)
552 {
553     int l, line_size, i, max_digits, len;
554     uint8_t buf[16];
555     uint64_t v;
556     CPUState *cs = mon_get_cpu();
557
558     if (!cs && (format == 'i' || !is_physical)) {
559         monitor_printf(mon, "Can not dump without CPU\n");
560         return;
561     }
562
563     if (format == 'i') {
564         monitor_disas(mon, cs, addr, count, is_physical);
565         return;
566     }
567
568     len = wsize * count;
569     if (wsize == 1)
570         line_size = 8;
571     else
572         line_size = 16;
573     max_digits = 0;
574
575     switch(format) {
576     case 'o':
577         max_digits = DIV_ROUND_UP(wsize * 8, 3);
578         break;
579     default:
580     case 'x':
581         max_digits = (wsize * 8) / 4;
582         break;
583     case 'u':
584     case 'd':
585         max_digits = DIV_ROUND_UP(wsize * 8 * 10, 33);
586         break;
587     case 'c':
588         wsize = 1;
589         break;
590     }
591
592     while (len > 0) {
593         if (is_physical)
594             monitor_printf(mon, TARGET_FMT_plx ":", addr);
595         else
596             monitor_printf(mon, TARGET_FMT_lx ":", (target_ulong)addr);
597         l = len;
598         if (l > line_size)
599             l = line_size;
600         if (is_physical) {
601             AddressSpace *as = cs ? cs->as : &address_space_memory;
602             MemTxResult r = address_space_read(as, addr,
603                                                MEMTXATTRS_UNSPECIFIED, buf, l);
604             if (r != MEMTX_OK) {
605                 monitor_printf(mon, " Cannot access memory\n");
606                 break;
607             }
608         } else {
609             if (cpu_memory_rw_debug(cs, addr, buf, l, 0) < 0) {
610                 monitor_printf(mon, " Cannot access memory\n");
611                 break;
612             }
613         }
614         i = 0;
615         while (i < l) {
616             switch(wsize) {
617             default:
618             case 1:
619                 v = ldub_p(buf + i);
620                 break;
621             case 2:
622                 v = lduw_p(buf + i);
623                 break;
624             case 4:
625                 v = (uint32_t)ldl_p(buf + i);
626                 break;
627             case 8:
628                 v = ldq_p(buf + i);
629                 break;
630             }
631             monitor_printf(mon, " ");
632             switch(format) {
633             case 'o':
634                 monitor_printf(mon, "%#*" PRIo64, max_digits, v);
635                 break;
636             case 'x':
637                 monitor_printf(mon, "0x%0*" PRIx64, max_digits, v);
638                 break;
639             case 'u':
640                 monitor_printf(mon, "%*" PRIu64, max_digits, v);
641                 break;
642             case 'd':
643                 monitor_printf(mon, "%*" PRId64, max_digits, v);
644                 break;
645             case 'c':
646                 monitor_printc(mon, v);
647                 break;
648             }
649             i += wsize;
650         }
651         monitor_printf(mon, "\n");
652         addr += l;
653         len -= l;
654     }
655 }
656
657 static void hmp_memory_dump(Monitor *mon, const QDict *qdict)
658 {
659     int count = qdict_get_int(qdict, "count");
660     int format = qdict_get_int(qdict, "format");
661     int size = qdict_get_int(qdict, "size");
662     target_long addr = qdict_get_int(qdict, "addr");
663
664     memory_dump(mon, count, format, size, addr, 0);
665 }
666
667 static void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
668 {
669     int count = qdict_get_int(qdict, "count");
670     int format = qdict_get_int(qdict, "format");
671     int size = qdict_get_int(qdict, "size");
672     hwaddr addr = qdict_get_int(qdict, "addr");
673
674     memory_dump(mon, count, format, size, addr, 1);
675 }
676
677 static void *gpa2hva(MemoryRegion **p_mr, hwaddr addr, Error **errp)
678 {
679     MemoryRegionSection mrs = memory_region_find(get_system_memory(),
680                                                  addr, 1);
681
682     if (!mrs.mr) {
683         error_setg(errp, "No memory is mapped at address 0x%" HWADDR_PRIx, addr);
684         return NULL;
685     }
686
687     if (!memory_region_is_ram(mrs.mr) && !memory_region_is_romd(mrs.mr)) {
688         error_setg(errp, "Memory at address 0x%" HWADDR_PRIx "is not RAM", addr);
689         memory_region_unref(mrs.mr);
690         return NULL;
691     }
692
693     *p_mr = mrs.mr;
694     return qemu_map_ram_ptr(mrs.mr->ram_block, mrs.offset_within_region);
695 }
696
697 static void hmp_gpa2hva(Monitor *mon, const QDict *qdict)
698 {
699     hwaddr addr = qdict_get_int(qdict, "addr");
700     Error *local_err = NULL;
701     MemoryRegion *mr = NULL;
702     void *ptr;
703
704     ptr = gpa2hva(&mr, addr, &local_err);
705     if (local_err) {
706         error_report_err(local_err);
707         return;
708     }
709
710     monitor_printf(mon, "Host virtual address for 0x%" HWADDR_PRIx
711                    " (%s) is %p\n",
712                    addr, mr->name, ptr);
713
714     memory_region_unref(mr);
715 }
716
717 static void hmp_gva2gpa(Monitor *mon, const QDict *qdict)
718 {
719     target_ulong addr = qdict_get_int(qdict, "addr");
720     MemTxAttrs attrs;
721     CPUState *cs = mon_get_cpu();
722     hwaddr gpa;
723
724     if (!cs) {
725         monitor_printf(mon, "No cpu\n");
726         return;
727     }
728
729     gpa  = cpu_get_phys_page_attrs_debug(cs, addr & TARGET_PAGE_MASK, &attrs);
730     if (gpa == -1) {
731         monitor_printf(mon, "Unmapped\n");
732     } else {
733         monitor_printf(mon, "gpa: %#" HWADDR_PRIx "\n",
734                        gpa + (addr & ~TARGET_PAGE_MASK));
735     }
736 }
737
738 #ifdef CONFIG_LINUX
739 static uint64_t vtop(void *ptr, Error **errp)
740 {
741     uint64_t pinfo;
742     uint64_t ret = -1;
743     uintptr_t addr = (uintptr_t) ptr;
744     uintptr_t pagesize = qemu_real_host_page_size;
745     off_t offset = addr / pagesize * sizeof(pinfo);
746     int fd;
747
748     fd = open("/proc/self/pagemap", O_RDONLY);
749     if (fd == -1) {
750         error_setg_errno(errp, errno, "Cannot open /proc/self/pagemap");
751         return -1;
752     }
753
754     /* Force copy-on-write if necessary.  */
755     atomic_add((uint8_t *)ptr, 0);
756
757     if (pread(fd, &pinfo, sizeof(pinfo), offset) != sizeof(pinfo)) {
758         error_setg_errno(errp, errno, "Cannot read pagemap");
759         goto out;
760     }
761     if ((pinfo & (1ull << 63)) == 0) {
762         error_setg(errp, "Page not present");
763         goto out;
764     }
765     ret = ((pinfo & 0x007fffffffffffffull) * pagesize) | (addr & (pagesize - 1));
766
767 out:
768     close(fd);
769     return ret;
770 }
771
772 static void hmp_gpa2hpa(Monitor *mon, const QDict *qdict)
773 {
774     hwaddr addr = qdict_get_int(qdict, "addr");
775     Error *local_err = NULL;
776     MemoryRegion *mr = NULL;
777     void *ptr;
778     uint64_t physaddr;
779
780     ptr = gpa2hva(&mr, addr, &local_err);
781     if (local_err) {
782         error_report_err(local_err);
783         return;
784     }
785
786     physaddr = vtop(ptr, &local_err);
787     if (local_err) {
788         error_report_err(local_err);
789     } else {
790         monitor_printf(mon, "Host physical address for 0x%" HWADDR_PRIx
791                        " (%s) is 0x%" PRIx64 "\n",
792                        addr, mr->name, (uint64_t) physaddr);
793     }
794
795     memory_region_unref(mr);
796 }
797 #endif
798
799 static void do_print(Monitor *mon, const QDict *qdict)
800 {
801     int format = qdict_get_int(qdict, "format");
802     hwaddr val = qdict_get_int(qdict, "val");
803
804     switch(format) {
805     case 'o':
806         monitor_printf(mon, "%#" HWADDR_PRIo, val);
807         break;
808     case 'x':
809         monitor_printf(mon, "%#" HWADDR_PRIx, val);
810         break;
811     case 'u':
812         monitor_printf(mon, "%" HWADDR_PRIu, val);
813         break;
814     default:
815     case 'd':
816         monitor_printf(mon, "%" HWADDR_PRId, val);
817         break;
818     case 'c':
819         monitor_printc(mon, val);
820         break;
821     }
822     monitor_printf(mon, "\n");
823 }
824
825 static void hmp_sum(Monitor *mon, const QDict *qdict)
826 {
827     uint32_t addr;
828     uint16_t sum;
829     uint32_t start = qdict_get_int(qdict, "start");
830     uint32_t size = qdict_get_int(qdict, "size");
831
832     sum = 0;
833     for(addr = start; addr < (start + size); addr++) {
834         uint8_t val = address_space_ldub(&address_space_memory, addr,
835                                          MEMTXATTRS_UNSPECIFIED, NULL);
836         /* BSD sum algorithm ('sum' Unix command) */
837         sum = (sum >> 1) | (sum << 15);
838         sum += val;
839     }
840     monitor_printf(mon, "%05d\n", sum);
841 }
842
843 static int mouse_button_state;
844
845 static void hmp_mouse_move(Monitor *mon, const QDict *qdict)
846 {
847     int dx, dy, dz, button;
848     const char *dx_str = qdict_get_str(qdict, "dx_str");
849     const char *dy_str = qdict_get_str(qdict, "dy_str");
850     const char *dz_str = qdict_get_try_str(qdict, "dz_str");
851
852     dx = strtol(dx_str, NULL, 0);
853     dy = strtol(dy_str, NULL, 0);
854     qemu_input_queue_rel(NULL, INPUT_AXIS_X, dx);
855     qemu_input_queue_rel(NULL, INPUT_AXIS_Y, dy);
856
857     if (dz_str) {
858         dz = strtol(dz_str, NULL, 0);
859         if (dz != 0) {
860             button = (dz > 0) ? INPUT_BUTTON_WHEEL_UP : INPUT_BUTTON_WHEEL_DOWN;
861             qemu_input_queue_btn(NULL, button, true);
862             qemu_input_event_sync();
863             qemu_input_queue_btn(NULL, button, false);
864         }
865     }
866     qemu_input_event_sync();
867 }
868
869 static void hmp_mouse_button(Monitor *mon, const QDict *qdict)
870 {
871     static uint32_t bmap[INPUT_BUTTON__MAX] = {
872         [INPUT_BUTTON_LEFT]       = MOUSE_EVENT_LBUTTON,
873         [INPUT_BUTTON_MIDDLE]     = MOUSE_EVENT_MBUTTON,
874         [INPUT_BUTTON_RIGHT]      = MOUSE_EVENT_RBUTTON,
875     };
876     int button_state = qdict_get_int(qdict, "button_state");
877
878     if (mouse_button_state == button_state) {
879         return;
880     }
881     qemu_input_update_buttons(NULL, bmap, mouse_button_state, button_state);
882     qemu_input_event_sync();
883     mouse_button_state = button_state;
884 }
885
886 static void hmp_ioport_read(Monitor *mon, const QDict *qdict)
887 {
888     int size = qdict_get_int(qdict, "size");
889     int addr = qdict_get_int(qdict, "addr");
890     int has_index = qdict_haskey(qdict, "index");
891     uint32_t val;
892     int suffix;
893
894     if (has_index) {
895         int index = qdict_get_int(qdict, "index");
896         cpu_outb(addr & IOPORTS_MASK, index & 0xff);
897         addr++;
898     }
899     addr &= 0xffff;
900
901     switch(size) {
902     default:
903     case 1:
904         val = cpu_inb(addr);
905         suffix = 'b';
906         break;
907     case 2:
908         val = cpu_inw(addr);
909         suffix = 'w';
910         break;
911     case 4:
912         val = cpu_inl(addr);
913         suffix = 'l';
914         break;
915     }
916     monitor_printf(mon, "port%c[0x%04x] = %#0*x\n",
917                    suffix, addr, size * 2, val);
918 }
919
920 static void hmp_ioport_write(Monitor *mon, const QDict *qdict)
921 {
922     int size = qdict_get_int(qdict, "size");
923     int addr = qdict_get_int(qdict, "addr");
924     int val = qdict_get_int(qdict, "val");
925
926     addr &= IOPORTS_MASK;
927
928     switch (size) {
929     default:
930     case 1:
931         cpu_outb(addr, val);
932         break;
933     case 2:
934         cpu_outw(addr, val);
935         break;
936     case 4:
937         cpu_outl(addr, val);
938         break;
939     }
940 }
941
942 static void hmp_boot_set(Monitor *mon, const QDict *qdict)
943 {
944     Error *local_err = NULL;
945     const char *bootdevice = qdict_get_str(qdict, "bootdevice");
946
947     qemu_boot_set(bootdevice, &local_err);
948     if (local_err) {
949         error_report_err(local_err);
950     } else {
951         monitor_printf(mon, "boot device list now set to %s\n", bootdevice);
952     }
953 }
954
955 static void hmp_info_mtree(Monitor *mon, const QDict *qdict)
956 {
957     bool flatview = qdict_get_try_bool(qdict, "flatview", false);
958     bool dispatch_tree = qdict_get_try_bool(qdict, "dispatch_tree", false);
959     bool owner = qdict_get_try_bool(qdict, "owner", false);
960
961     mtree_info(flatview, dispatch_tree, owner);
962 }
963
964 #ifdef CONFIG_PROFILER
965
966 int64_t dev_time;
967
968 static void hmp_info_profile(Monitor *mon, const QDict *qdict)
969 {
970     static int64_t last_cpu_exec_time;
971     int64_t cpu_exec_time;
972     int64_t delta;
973
974     cpu_exec_time = tcg_cpu_exec_time();
975     delta = cpu_exec_time - last_cpu_exec_time;
976
977     monitor_printf(mon, "async time  %" PRId64 " (%0.3f)\n",
978                    dev_time, dev_time / (double)NANOSECONDS_PER_SECOND);
979     monitor_printf(mon, "qemu time   %" PRId64 " (%0.3f)\n",
980                    delta, delta / (double)NANOSECONDS_PER_SECOND);
981     last_cpu_exec_time = cpu_exec_time;
982     dev_time = 0;
983 }
984 #else
985 static void hmp_info_profile(Monitor *mon, const QDict *qdict)
986 {
987     monitor_printf(mon, "Internal profiler not compiled\n");
988 }
989 #endif
990
991 /* Capture support */
992 static QLIST_HEAD (capture_list_head, CaptureState) capture_head;
993
994 static void hmp_info_capture(Monitor *mon, const QDict *qdict)
995 {
996     int i;
997     CaptureState *s;
998
999     for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1000         monitor_printf(mon, "[%d]: ", i);
1001         s->ops.info (s->opaque);
1002     }
1003 }
1004
1005 static void hmp_stopcapture(Monitor *mon, const QDict *qdict)
1006 {
1007     int i;
1008     int n = qdict_get_int(qdict, "n");
1009     CaptureState *s;
1010
1011     for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1012         if (i == n) {
1013             s->ops.destroy (s->opaque);
1014             QLIST_REMOVE (s, entries);
1015             g_free (s);
1016             return;
1017         }
1018     }
1019 }
1020
1021 static void hmp_wavcapture(Monitor *mon, const QDict *qdict)
1022 {
1023     const char *path = qdict_get_str(qdict, "path");
1024     int freq = qdict_get_try_int(qdict, "freq", 44100);
1025     int bits = qdict_get_try_int(qdict, "bits", 16);
1026     int nchannels = qdict_get_try_int(qdict, "nchannels", 2);
1027     const char *audiodev = qdict_get_str(qdict, "audiodev");
1028     CaptureState *s;
1029     AudioState *as = audio_state_by_name(audiodev);
1030
1031     if (!as) {
1032         monitor_printf(mon, "Audiodev '%s' not found\n", audiodev);
1033         return;
1034     }
1035
1036     s = g_malloc0 (sizeof (*s));
1037
1038     if (wav_start_capture(as, s, path, freq, bits, nchannels)) {
1039         monitor_printf(mon, "Failed to add wave capture\n");
1040         g_free (s);
1041         return;
1042     }
1043     QLIST_INSERT_HEAD (&capture_head, s, entries);
1044 }
1045
1046 static QAuthZList *find_auth(Monitor *mon, const char *name)
1047 {
1048     Object *obj;
1049     Object *container;
1050
1051     container = object_get_objects_root();
1052     obj = object_resolve_path_component(container, name);
1053     if (!obj) {
1054         monitor_printf(mon, "acl: unknown list '%s'\n", name);
1055         return NULL;
1056     }
1057
1058     return QAUTHZ_LIST(obj);
1059 }
1060
1061 static bool warn_acl;
1062 static void hmp_warn_acl(void)
1063 {
1064     if (warn_acl) {
1065         return;
1066     }
1067     error_report("The acl_show, acl_reset, acl_policy, acl_add, acl_remove "
1068                  "commands are deprecated with no replacement. Authorization "
1069                  "for VNC should be performed using the pluggable QAuthZ "
1070                  "objects");
1071     warn_acl = true;
1072 }
1073
1074 static void hmp_acl_show(Monitor *mon, const QDict *qdict)
1075 {
1076     const char *aclname = qdict_get_str(qdict, "aclname");
1077     QAuthZList *auth = find_auth(mon, aclname);
1078     QAuthZListRuleList *rules;
1079     size_t i = 0;
1080
1081     hmp_warn_acl();
1082
1083     if (!auth) {
1084         return;
1085     }
1086
1087     monitor_printf(mon, "policy: %s\n",
1088                    QAuthZListPolicy_str(auth->policy));
1089
1090     rules = auth->rules;
1091     while (rules) {
1092         QAuthZListRule *rule = rules->value;
1093         i++;
1094         monitor_printf(mon, "%zu: %s %s\n", i,
1095                        QAuthZListPolicy_str(rule->policy),
1096                        rule->match);
1097         rules = rules->next;
1098     }
1099 }
1100
1101 static void hmp_acl_reset(Monitor *mon, const QDict *qdict)
1102 {
1103     const char *aclname = qdict_get_str(qdict, "aclname");
1104     QAuthZList *auth = find_auth(mon, aclname);
1105
1106     hmp_warn_acl();
1107
1108     if (!auth) {
1109         return;
1110     }
1111
1112     auth->policy = QAUTHZ_LIST_POLICY_DENY;
1113     qapi_free_QAuthZListRuleList(auth->rules);
1114     auth->rules = NULL;
1115     monitor_printf(mon, "acl: removed all rules\n");
1116 }
1117
1118 static void hmp_acl_policy(Monitor *mon, const QDict *qdict)
1119 {
1120     const char *aclname = qdict_get_str(qdict, "aclname");
1121     const char *policy = qdict_get_str(qdict, "policy");
1122     QAuthZList *auth = find_auth(mon, aclname);
1123     int val;
1124     Error *err = NULL;
1125
1126     hmp_warn_acl();
1127
1128     if (!auth) {
1129         return;
1130     }
1131
1132     val = qapi_enum_parse(&QAuthZListPolicy_lookup,
1133                           policy,
1134                           QAUTHZ_LIST_POLICY_DENY,
1135                           &err);
1136     if (err) {
1137         error_free(err);
1138         monitor_printf(mon, "acl: unknown policy '%s', "
1139                        "expected 'deny' or 'allow'\n", policy);
1140     } else {
1141         auth->policy = val;
1142         if (auth->policy == QAUTHZ_LIST_POLICY_ALLOW) {
1143             monitor_printf(mon, "acl: policy set to 'allow'\n");
1144         } else {
1145             monitor_printf(mon, "acl: policy set to 'deny'\n");
1146         }
1147     }
1148 }
1149
1150 static QAuthZListFormat hmp_acl_get_format(const char *match)
1151 {
1152     if (strchr(match, '*')) {
1153         return QAUTHZ_LIST_FORMAT_GLOB;
1154     } else {
1155         return QAUTHZ_LIST_FORMAT_EXACT;
1156     }
1157 }
1158
1159 static void hmp_acl_add(Monitor *mon, const QDict *qdict)
1160 {
1161     const char *aclname = qdict_get_str(qdict, "aclname");
1162     const char *match = qdict_get_str(qdict, "match");
1163     const char *policystr = qdict_get_str(qdict, "policy");
1164     int has_index = qdict_haskey(qdict, "index");
1165     int index = qdict_get_try_int(qdict, "index", -1);
1166     QAuthZList *auth = find_auth(mon, aclname);
1167     Error *err = NULL;
1168     QAuthZListPolicy policy;
1169     QAuthZListFormat format;
1170     size_t i = 0;
1171
1172     hmp_warn_acl();
1173
1174     if (!auth) {
1175         return;
1176     }
1177
1178     policy = qapi_enum_parse(&QAuthZListPolicy_lookup,
1179                              policystr,
1180                              QAUTHZ_LIST_POLICY_DENY,
1181                              &err);
1182     if (err) {
1183         error_free(err);
1184         monitor_printf(mon, "acl: unknown policy '%s', "
1185                        "expected 'deny' or 'allow'\n", policystr);
1186         return;
1187     }
1188
1189     format = hmp_acl_get_format(match);
1190
1191     if (has_index && index == 0) {
1192         monitor_printf(mon, "acl: unable to add acl entry\n");
1193         return;
1194     }
1195
1196     if (has_index) {
1197         i = qauthz_list_insert_rule(auth, match, policy,
1198                                     format, index - 1, &err);
1199     } else {
1200         i = qauthz_list_append_rule(auth, match, policy,
1201                                     format, &err);
1202     }
1203     if (err) {
1204         monitor_printf(mon, "acl: unable to add rule: %s",
1205                        error_get_pretty(err));
1206         error_free(err);
1207     } else {
1208         monitor_printf(mon, "acl: added rule at position %zu\n", i + 1);
1209     }
1210 }
1211
1212 static void hmp_acl_remove(Monitor *mon, const QDict *qdict)
1213 {
1214     const char *aclname = qdict_get_str(qdict, "aclname");
1215     const char *match = qdict_get_str(qdict, "match");
1216     QAuthZList *auth = find_auth(mon, aclname);
1217     ssize_t i = 0;
1218
1219     hmp_warn_acl();
1220
1221     if (!auth) {
1222         return;
1223     }
1224
1225     i = qauthz_list_delete_rule(auth, match);
1226     if (i >= 0) {
1227         monitor_printf(mon, "acl: removed rule at position %zu\n", i + 1);
1228     } else {
1229         monitor_printf(mon, "acl: no matching acl entry\n");
1230     }
1231 }
1232
1233 void qmp_getfd(const char *fdname, Error **errp)
1234 {
1235     mon_fd_t *monfd;
1236     int fd, tmp_fd;
1237
1238     fd = qemu_chr_fe_get_msgfd(&cur_mon->chr);
1239     if (fd == -1) {
1240         error_setg(errp, QERR_FD_NOT_SUPPLIED);
1241         return;
1242     }
1243
1244     if (qemu_isdigit(fdname[0])) {
1245         close(fd);
1246         error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "fdname",
1247                    "a name not starting with a digit");
1248         return;
1249     }
1250
1251     qemu_mutex_lock(&cur_mon->mon_lock);
1252     QLIST_FOREACH(monfd, &cur_mon->fds, next) {
1253         if (strcmp(monfd->name, fdname) != 0) {
1254             continue;
1255         }
1256
1257         tmp_fd = monfd->fd;
1258         monfd->fd = fd;
1259         qemu_mutex_unlock(&cur_mon->mon_lock);
1260         /* Make sure close() is outside critical section */
1261         close(tmp_fd);
1262         return;
1263     }
1264
1265     monfd = g_malloc0(sizeof(mon_fd_t));
1266     monfd->name = g_strdup(fdname);
1267     monfd->fd = fd;
1268
1269     QLIST_INSERT_HEAD(&cur_mon->fds, monfd, next);
1270     qemu_mutex_unlock(&cur_mon->mon_lock);
1271 }
1272
1273 void qmp_closefd(const char *fdname, Error **errp)
1274 {
1275     mon_fd_t *monfd;
1276     int tmp_fd;
1277
1278     qemu_mutex_lock(&cur_mon->mon_lock);
1279     QLIST_FOREACH(monfd, &cur_mon->fds, next) {
1280         if (strcmp(monfd->name, fdname) != 0) {
1281             continue;
1282         }
1283
1284         QLIST_REMOVE(monfd, next);
1285         tmp_fd = monfd->fd;
1286         g_free(monfd->name);
1287         g_free(monfd);
1288         qemu_mutex_unlock(&cur_mon->mon_lock);
1289         /* Make sure close() is outside critical section */
1290         close(tmp_fd);
1291         return;
1292     }
1293
1294     qemu_mutex_unlock(&cur_mon->mon_lock);
1295     error_setg(errp, QERR_FD_NOT_FOUND, fdname);
1296 }
1297
1298 int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp)
1299 {
1300     mon_fd_t *monfd;
1301
1302     qemu_mutex_lock(&mon->mon_lock);
1303     QLIST_FOREACH(monfd, &mon->fds, next) {
1304         int fd;
1305
1306         if (strcmp(monfd->name, fdname) != 0) {
1307             continue;
1308         }
1309
1310         fd = monfd->fd;
1311
1312         /* caller takes ownership of fd */
1313         QLIST_REMOVE(monfd, next);
1314         g_free(monfd->name);
1315         g_free(monfd);
1316         qemu_mutex_unlock(&mon->mon_lock);
1317
1318         return fd;
1319     }
1320
1321     qemu_mutex_unlock(&mon->mon_lock);
1322     error_setg(errp, "File descriptor named '%s' has not been found", fdname);
1323     return -1;
1324 }
1325
1326 static void monitor_fdset_cleanup(MonFdset *mon_fdset)
1327 {
1328     MonFdsetFd *mon_fdset_fd;
1329     MonFdsetFd *mon_fdset_fd_next;
1330
1331     QLIST_FOREACH_SAFE(mon_fdset_fd, &mon_fdset->fds, next, mon_fdset_fd_next) {
1332         if ((mon_fdset_fd->removed ||
1333                 (QLIST_EMPTY(&mon_fdset->dup_fds) && mon_refcount == 0)) &&
1334                 runstate_is_running()) {
1335             close(mon_fdset_fd->fd);
1336             g_free(mon_fdset_fd->opaque);
1337             QLIST_REMOVE(mon_fdset_fd, next);
1338             g_free(mon_fdset_fd);
1339         }
1340     }
1341
1342     if (QLIST_EMPTY(&mon_fdset->fds) && QLIST_EMPTY(&mon_fdset->dup_fds)) {
1343         QLIST_REMOVE(mon_fdset, next);
1344         g_free(mon_fdset);
1345     }
1346 }
1347
1348 void monitor_fdsets_cleanup(void)
1349 {
1350     MonFdset *mon_fdset;
1351     MonFdset *mon_fdset_next;
1352
1353     qemu_mutex_lock(&mon_fdsets_lock);
1354     QLIST_FOREACH_SAFE(mon_fdset, &mon_fdsets, next, mon_fdset_next) {
1355         monitor_fdset_cleanup(mon_fdset);
1356     }
1357     qemu_mutex_unlock(&mon_fdsets_lock);
1358 }
1359
1360 AddfdInfo *qmp_add_fd(bool has_fdset_id, int64_t fdset_id, bool has_opaque,
1361                       const char *opaque, Error **errp)
1362 {
1363     int fd;
1364     Monitor *mon = cur_mon;
1365     AddfdInfo *fdinfo;
1366
1367     fd = qemu_chr_fe_get_msgfd(&mon->chr);
1368     if (fd == -1) {
1369         error_setg(errp, QERR_FD_NOT_SUPPLIED);
1370         goto error;
1371     }
1372
1373     fdinfo = monitor_fdset_add_fd(fd, has_fdset_id, fdset_id,
1374                                   has_opaque, opaque, errp);
1375     if (fdinfo) {
1376         return fdinfo;
1377     }
1378
1379 error:
1380     if (fd != -1) {
1381         close(fd);
1382     }
1383     return NULL;
1384 }
1385
1386 void qmp_remove_fd(int64_t fdset_id, bool has_fd, int64_t fd, Error **errp)
1387 {
1388     MonFdset *mon_fdset;
1389     MonFdsetFd *mon_fdset_fd;
1390     char fd_str[60];
1391
1392     qemu_mutex_lock(&mon_fdsets_lock);
1393     QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
1394         if (mon_fdset->id != fdset_id) {
1395             continue;
1396         }
1397         QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
1398             if (has_fd) {
1399                 if (mon_fdset_fd->fd != fd) {
1400                     continue;
1401                 }
1402                 mon_fdset_fd->removed = true;
1403                 break;
1404             } else {
1405                 mon_fdset_fd->removed = true;
1406             }
1407         }
1408         if (has_fd && !mon_fdset_fd) {
1409             goto error;
1410         }
1411         monitor_fdset_cleanup(mon_fdset);
1412         qemu_mutex_unlock(&mon_fdsets_lock);
1413         return;
1414     }
1415
1416 error:
1417     qemu_mutex_unlock(&mon_fdsets_lock);
1418     if (has_fd) {
1419         snprintf(fd_str, sizeof(fd_str), "fdset-id:%" PRId64 ", fd:%" PRId64,
1420                  fdset_id, fd);
1421     } else {
1422         snprintf(fd_str, sizeof(fd_str), "fdset-id:%" PRId64, fdset_id);
1423     }
1424     error_setg(errp, QERR_FD_NOT_FOUND, fd_str);
1425 }
1426
1427 FdsetInfoList *qmp_query_fdsets(Error **errp)
1428 {
1429     MonFdset *mon_fdset;
1430     MonFdsetFd *mon_fdset_fd;
1431     FdsetInfoList *fdset_list = NULL;
1432
1433     qemu_mutex_lock(&mon_fdsets_lock);
1434     QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
1435         FdsetInfoList *fdset_info = g_malloc0(sizeof(*fdset_info));
1436         FdsetFdInfoList *fdsetfd_list = NULL;
1437
1438         fdset_info->value = g_malloc0(sizeof(*fdset_info->value));
1439         fdset_info->value->fdset_id = mon_fdset->id;
1440
1441         QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
1442             FdsetFdInfoList *fdsetfd_info;
1443
1444             fdsetfd_info = g_malloc0(sizeof(*fdsetfd_info));
1445             fdsetfd_info->value = g_malloc0(sizeof(*fdsetfd_info->value));
1446             fdsetfd_info->value->fd = mon_fdset_fd->fd;
1447             if (mon_fdset_fd->opaque) {
1448                 fdsetfd_info->value->has_opaque = true;
1449                 fdsetfd_info->value->opaque = g_strdup(mon_fdset_fd->opaque);
1450             } else {
1451                 fdsetfd_info->value->has_opaque = false;
1452             }
1453
1454             fdsetfd_info->next = fdsetfd_list;
1455             fdsetfd_list = fdsetfd_info;
1456         }
1457
1458         fdset_info->value->fds = fdsetfd_list;
1459
1460         fdset_info->next = fdset_list;
1461         fdset_list = fdset_info;
1462     }
1463     qemu_mutex_unlock(&mon_fdsets_lock);
1464
1465     return fdset_list;
1466 }
1467
1468 AddfdInfo *monitor_fdset_add_fd(int fd, bool has_fdset_id, int64_t fdset_id,
1469                                 bool has_opaque, const char *opaque,
1470                                 Error **errp)
1471 {
1472     MonFdset *mon_fdset = NULL;
1473     MonFdsetFd *mon_fdset_fd;
1474     AddfdInfo *fdinfo;
1475
1476     QEMU_LOCK_GUARD(&mon_fdsets_lock);
1477     if (has_fdset_id) {
1478         QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
1479             /* Break if match found or match impossible due to ordering by ID */
1480             if (fdset_id <= mon_fdset->id) {
1481                 if (fdset_id < mon_fdset->id) {
1482                     mon_fdset = NULL;
1483                 }
1484                 break;
1485             }
1486         }
1487     }
1488
1489     if (mon_fdset == NULL) {
1490         int64_t fdset_id_prev = -1;
1491         MonFdset *mon_fdset_cur = QLIST_FIRST(&mon_fdsets);
1492
1493         if (has_fdset_id) {
1494             if (fdset_id < 0) {
1495                 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "fdset-id",
1496                            "a non-negative value");
1497                 return NULL;
1498             }
1499             /* Use specified fdset ID */
1500             QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
1501                 mon_fdset_cur = mon_fdset;
1502                 if (fdset_id < mon_fdset_cur->id) {
1503                     break;
1504                 }
1505             }
1506         } else {
1507             /* Use first available fdset ID */
1508             QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
1509                 mon_fdset_cur = mon_fdset;
1510                 if (fdset_id_prev == mon_fdset_cur->id - 1) {
1511                     fdset_id_prev = mon_fdset_cur->id;
1512                     continue;
1513                 }
1514                 break;
1515             }
1516         }
1517
1518         mon_fdset = g_malloc0(sizeof(*mon_fdset));
1519         if (has_fdset_id) {
1520             mon_fdset->id = fdset_id;
1521         } else {
1522             mon_fdset->id = fdset_id_prev + 1;
1523         }
1524
1525         /* The fdset list is ordered by fdset ID */
1526         if (!mon_fdset_cur) {
1527             QLIST_INSERT_HEAD(&mon_fdsets, mon_fdset, next);
1528         } else if (mon_fdset->id < mon_fdset_cur->id) {
1529             QLIST_INSERT_BEFORE(mon_fdset_cur, mon_fdset, next);
1530         } else {
1531             QLIST_INSERT_AFTER(mon_fdset_cur, mon_fdset, next);
1532         }
1533     }
1534
1535     mon_fdset_fd = g_malloc0(sizeof(*mon_fdset_fd));
1536     mon_fdset_fd->fd = fd;
1537     mon_fdset_fd->removed = false;
1538     if (has_opaque) {
1539         mon_fdset_fd->opaque = g_strdup(opaque);
1540     }
1541     QLIST_INSERT_HEAD(&mon_fdset->fds, mon_fdset_fd, next);
1542
1543     fdinfo = g_malloc0(sizeof(*fdinfo));
1544     fdinfo->fdset_id = mon_fdset->id;
1545     fdinfo->fd = mon_fdset_fd->fd;
1546
1547     return fdinfo;
1548 }
1549
1550 int monitor_fdset_get_fd(int64_t fdset_id, int flags)
1551 {
1552 #ifdef _WIN32
1553     return -ENOENT;
1554 #else
1555     MonFdset *mon_fdset;
1556     MonFdsetFd *mon_fdset_fd;
1557     int mon_fd_flags;
1558     int ret;
1559
1560     qemu_mutex_lock(&mon_fdsets_lock);
1561     QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
1562         if (mon_fdset->id != fdset_id) {
1563             continue;
1564         }
1565         QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
1566             mon_fd_flags = fcntl(mon_fdset_fd->fd, F_GETFL);
1567             if (mon_fd_flags == -1) {
1568                 ret = -errno;
1569                 goto out;
1570             }
1571
1572             if ((flags & O_ACCMODE) == (mon_fd_flags & O_ACCMODE)) {
1573                 ret = mon_fdset_fd->fd;
1574                 goto out;
1575             }
1576         }
1577         ret = -EACCES;
1578         goto out;
1579     }
1580     ret = -ENOENT;
1581
1582 out:
1583     qemu_mutex_unlock(&mon_fdsets_lock);
1584     return ret;
1585 #endif
1586 }
1587
1588 int monitor_fdset_dup_fd_add(int64_t fdset_id, int dup_fd)
1589 {
1590     MonFdset *mon_fdset;
1591     MonFdsetFd *mon_fdset_fd_dup;
1592
1593     qemu_mutex_lock(&mon_fdsets_lock);
1594     QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
1595         if (mon_fdset->id != fdset_id) {
1596             continue;
1597         }
1598         QLIST_FOREACH(mon_fdset_fd_dup, &mon_fdset->dup_fds, next) {
1599             if (mon_fdset_fd_dup->fd == dup_fd) {
1600                 goto err;
1601             }
1602         }
1603         mon_fdset_fd_dup = g_malloc0(sizeof(*mon_fdset_fd_dup));
1604         mon_fdset_fd_dup->fd = dup_fd;
1605         QLIST_INSERT_HEAD(&mon_fdset->dup_fds, mon_fdset_fd_dup, next);
1606         qemu_mutex_unlock(&mon_fdsets_lock);
1607         return 0;
1608     }
1609
1610 err:
1611     qemu_mutex_unlock(&mon_fdsets_lock);
1612     return -1;
1613 }
1614
1615 static int64_t monitor_fdset_dup_fd_find_remove(int dup_fd, bool remove)
1616 {
1617     MonFdset *mon_fdset;
1618     MonFdsetFd *mon_fdset_fd_dup;
1619
1620     qemu_mutex_lock(&mon_fdsets_lock);
1621     QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
1622         QLIST_FOREACH(mon_fdset_fd_dup, &mon_fdset->dup_fds, next) {
1623             if (mon_fdset_fd_dup->fd == dup_fd) {
1624                 if (remove) {
1625                     QLIST_REMOVE(mon_fdset_fd_dup, next);
1626                     g_free(mon_fdset_fd_dup);
1627                     if (QLIST_EMPTY(&mon_fdset->dup_fds)) {
1628                         monitor_fdset_cleanup(mon_fdset);
1629                     }
1630                     goto err;
1631                 } else {
1632                     qemu_mutex_unlock(&mon_fdsets_lock);
1633                     return mon_fdset->id;
1634                 }
1635             }
1636         }
1637     }
1638
1639 err:
1640     qemu_mutex_unlock(&mon_fdsets_lock);
1641     return -1;
1642 }
1643
1644 int64_t monitor_fdset_dup_fd_find(int dup_fd)
1645 {
1646     return monitor_fdset_dup_fd_find_remove(dup_fd, false);
1647 }
1648
1649 void monitor_fdset_dup_fd_remove(int dup_fd)
1650 {
1651     monitor_fdset_dup_fd_find_remove(dup_fd, true);
1652 }
1653
1654 int monitor_fd_param(Monitor *mon, const char *fdname, Error **errp)
1655 {
1656     int fd;
1657     Error *local_err = NULL;
1658
1659     if (!qemu_isdigit(fdname[0]) && mon) {
1660         fd = monitor_get_fd(mon, fdname, &local_err);
1661     } else {
1662         fd = qemu_parse_fd(fdname);
1663         if (fd == -1) {
1664             error_setg(&local_err, "Invalid file descriptor number '%s'",
1665                        fdname);
1666         }
1667     }
1668     if (local_err) {
1669         error_propagate(errp, local_err);
1670         assert(fd == -1);
1671     } else {
1672         assert(fd != -1);
1673     }
1674
1675     return fd;
1676 }
1677
1678 /* Please update hmp-commands.hx when adding or changing commands */
1679 static HMPCommand hmp_info_cmds[] = {
1680 #include "hmp-commands-info.h"
1681     { NULL, NULL, },
1682 };
1683
1684 /* hmp_cmds and hmp_info_cmds would be sorted at runtime */
1685 HMPCommand hmp_cmds[] = {
1686 #include "hmp-commands.h"
1687     { NULL, NULL, },
1688 };
1689
1690 /*
1691  * Set @pval to the value in the register identified by @name.
1692  * return 0 if OK, -1 if not found
1693  */
1694 int get_monitor_def(int64_t *pval, const char *name)
1695 {
1696     const MonitorDef *md = target_monitor_defs();
1697     CPUState *cs = mon_get_cpu();
1698     void *ptr;
1699     uint64_t tmp = 0;
1700     int ret;
1701
1702     if (cs == NULL || md == NULL) {
1703         return -1;
1704     }
1705
1706     for(; md->name != NULL; md++) {
1707         if (hmp_compare_cmd(name, md->name)) {
1708             if (md->get_value) {
1709                 *pval = md->get_value(md, md->offset);
1710             } else {
1711                 CPUArchState *env = mon_get_cpu_env();
1712                 ptr = (uint8_t *)env + md->offset;
1713                 switch(md->type) {
1714                 case MD_I32:
1715                     *pval = *(int32_t *)ptr;
1716                     break;
1717                 case MD_TLONG:
1718                     *pval = *(target_long *)ptr;
1719                     break;
1720                 default:
1721                     *pval = 0;
1722                     break;
1723                 }
1724             }
1725             return 0;
1726         }
1727     }
1728
1729     ret = target_get_monitor_def(cs, name, &tmp);
1730     if (!ret) {
1731         *pval = (target_long) tmp;
1732     }
1733
1734     return ret;
1735 }
1736
1737 static void add_completion_option(ReadLineState *rs, const char *str,
1738                                   const char *option)
1739 {
1740     if (!str || !option) {
1741         return;
1742     }
1743     if (!strncmp(option, str, strlen(str))) {
1744         readline_add_completion(rs, option);
1745     }
1746 }
1747
1748 void chardev_add_completion(ReadLineState *rs, int nb_args, const char *str)
1749 {
1750     size_t len;
1751     ChardevBackendInfoList *list, *start;
1752
1753     if (nb_args != 2) {
1754         return;
1755     }
1756     len = strlen(str);
1757     readline_set_completion_index(rs, len);
1758
1759     start = list = qmp_query_chardev_backends(NULL);
1760     while (list) {
1761         const char *chr_name = list->value->name;
1762
1763         if (!strncmp(chr_name, str, len)) {
1764             readline_add_completion(rs, chr_name);
1765         }
1766         list = list->next;
1767     }
1768     qapi_free_ChardevBackendInfoList(start);
1769 }
1770
1771 void netdev_add_completion(ReadLineState *rs, int nb_args, const char *str)
1772 {
1773     size_t len;
1774     int i;
1775
1776     if (nb_args != 2) {
1777         return;
1778     }
1779     len = strlen(str);
1780     readline_set_completion_index(rs, len);
1781     for (i = 0; i < NET_CLIENT_DRIVER__MAX; i++) {
1782         add_completion_option(rs, str, NetClientDriver_str(i));
1783     }
1784 }
1785
1786 void device_add_completion(ReadLineState *rs, int nb_args, const char *str)
1787 {
1788     GSList *list, *elt;
1789     size_t len;
1790
1791     if (nb_args != 2) {
1792         return;
1793     }
1794
1795     len = strlen(str);
1796     readline_set_completion_index(rs, len);
1797     list = elt = object_class_get_list(TYPE_DEVICE, false);
1798     while (elt) {
1799         const char *name;
1800         DeviceClass *dc = OBJECT_CLASS_CHECK(DeviceClass, elt->data,
1801                                              TYPE_DEVICE);
1802         name = object_class_get_name(OBJECT_CLASS(dc));
1803
1804         if (dc->user_creatable
1805             && !strncmp(name, str, len)) {
1806             readline_add_completion(rs, name);
1807         }
1808         elt = elt->next;
1809     }
1810     g_slist_free(list);
1811 }
1812
1813 void object_add_completion(ReadLineState *rs, int nb_args, const char *str)
1814 {
1815     GSList *list, *elt;
1816     size_t len;
1817
1818     if (nb_args != 2) {
1819         return;
1820     }
1821
1822     len = strlen(str);
1823     readline_set_completion_index(rs, len);
1824     list = elt = object_class_get_list(TYPE_USER_CREATABLE, false);
1825     while (elt) {
1826         const char *name;
1827
1828         name = object_class_get_name(OBJECT_CLASS(elt->data));
1829         if (!strncmp(name, str, len) && strcmp(name, TYPE_USER_CREATABLE)) {
1830             readline_add_completion(rs, name);
1831         }
1832         elt = elt->next;
1833     }
1834     g_slist_free(list);
1835 }
1836
1837 static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
1838 {
1839     GSList **list = opaque;
1840     DeviceState *dev = (DeviceState *)object_dynamic_cast(obj, TYPE_DEVICE);
1841
1842     if (dev == NULL) {
1843         return 0;
1844     }
1845
1846     if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
1847         *list = g_slist_append(*list, dev);
1848     }
1849
1850     return 0;
1851 }
1852
1853 static GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
1854 {
1855     GSList *list = NULL;
1856
1857     object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
1858
1859     return list;
1860 }
1861
1862 static void peripheral_device_del_completion(ReadLineState *rs,
1863                                              const char *str, size_t len)
1864 {
1865     Object *peripheral = container_get(qdev_get_machine(), "/peripheral");
1866     GSList *list, *item;
1867
1868     list = qdev_build_hotpluggable_device_list(peripheral);
1869     if (!list) {
1870         return;
1871     }
1872
1873     for (item = list; item; item = g_slist_next(item)) {
1874         DeviceState *dev = item->data;
1875
1876         if (dev->id && !strncmp(str, dev->id, len)) {
1877             readline_add_completion(rs, dev->id);
1878         }
1879     }
1880
1881     g_slist_free(list);
1882 }
1883
1884 void chardev_remove_completion(ReadLineState *rs, int nb_args, const char *str)
1885 {
1886     size_t len;
1887     ChardevInfoList *list, *start;
1888
1889     if (nb_args != 2) {
1890         return;
1891     }
1892     len = strlen(str);
1893     readline_set_completion_index(rs, len);
1894
1895     start = list = qmp_query_chardev(NULL);
1896     while (list) {
1897         ChardevInfo *chr = list->value;
1898
1899         if (!strncmp(chr->label, str, len)) {
1900             readline_add_completion(rs, chr->label);
1901         }
1902         list = list->next;
1903     }
1904     qapi_free_ChardevInfoList(start);
1905 }
1906
1907 static void ringbuf_completion(ReadLineState *rs, const char *str)
1908 {
1909     size_t len;
1910     ChardevInfoList *list, *start;
1911
1912     len = strlen(str);
1913     readline_set_completion_index(rs, len);
1914
1915     start = list = qmp_query_chardev(NULL);
1916     while (list) {
1917         ChardevInfo *chr_info = list->value;
1918
1919         if (!strncmp(chr_info->label, str, len)) {
1920             Chardev *chr = qemu_chr_find(chr_info->label);
1921             if (chr && CHARDEV_IS_RINGBUF(chr)) {
1922                 readline_add_completion(rs, chr_info->label);
1923             }
1924         }
1925         list = list->next;
1926     }
1927     qapi_free_ChardevInfoList(start);
1928 }
1929
1930 void ringbuf_write_completion(ReadLineState *rs, int nb_args, const char *str)
1931 {
1932     if (nb_args != 2) {
1933         return;
1934     }
1935     ringbuf_completion(rs, str);
1936 }
1937
1938 void device_del_completion(ReadLineState *rs, int nb_args, const char *str)
1939 {
1940     size_t len;
1941
1942     if (nb_args != 2) {
1943         return;
1944     }
1945
1946     len = strlen(str);
1947     readline_set_completion_index(rs, len);
1948     peripheral_device_del_completion(rs, str, len);
1949 }
1950
1951 void object_del_completion(ReadLineState *rs, int nb_args, const char *str)
1952 {
1953     ObjectPropertyInfoList *list, *start;
1954     size_t len;
1955
1956     if (nb_args != 2) {
1957         return;
1958     }
1959     len = strlen(str);
1960     readline_set_completion_index(rs, len);
1961
1962     start = list = qmp_qom_list("/objects", NULL);
1963     while (list) {
1964         ObjectPropertyInfo *info = list->value;
1965
1966         if (!strncmp(info->type, "child<", 5)
1967             && !strncmp(info->name, str, len)) {
1968             readline_add_completion(rs, info->name);
1969         }
1970         list = list->next;
1971     }
1972     qapi_free_ObjectPropertyInfoList(start);
1973 }
1974
1975 void sendkey_completion(ReadLineState *rs, int nb_args, const char *str)
1976 {
1977     int i;
1978     char *sep;
1979     size_t len;
1980
1981     if (nb_args != 2) {
1982         return;
1983     }
1984     sep = strrchr(str, '-');
1985     if (sep) {
1986         str = sep + 1;
1987     }
1988     len = strlen(str);
1989     readline_set_completion_index(rs, len);
1990     for (i = 0; i < Q_KEY_CODE__MAX; i++) {
1991         if (!strncmp(str, QKeyCode_str(i), len)) {
1992             readline_add_completion(rs, QKeyCode_str(i));
1993         }
1994     }
1995 }
1996
1997 void set_link_completion(ReadLineState *rs, int nb_args, const char *str)
1998 {
1999     size_t len;
2000
2001     len = strlen(str);
2002     readline_set_completion_index(rs, len);
2003     if (nb_args == 2) {
2004         NetClientState *ncs[MAX_QUEUE_NUM];
2005         int count, i;
2006         count = qemu_find_net_clients_except(NULL, ncs,
2007                                              NET_CLIENT_DRIVER_NONE,
2008                                              MAX_QUEUE_NUM);
2009         for (i = 0; i < MIN(count, MAX_QUEUE_NUM); i++) {
2010             const char *name = ncs[i]->name;
2011             if (!strncmp(str, name, len)) {
2012                 readline_add_completion(rs, name);
2013             }
2014         }
2015     } else if (nb_args == 3) {
2016         add_completion_option(rs, str, "on");
2017         add_completion_option(rs, str, "off");
2018     }
2019 }
2020
2021 void netdev_del_completion(ReadLineState *rs, int nb_args, const char *str)
2022 {
2023     int len, count, i;
2024     NetClientState *ncs[MAX_QUEUE_NUM];
2025
2026     if (nb_args != 2) {
2027         return;
2028     }
2029
2030     len = strlen(str);
2031     readline_set_completion_index(rs, len);
2032     count = qemu_find_net_clients_except(NULL, ncs, NET_CLIENT_DRIVER_NIC,
2033                                          MAX_QUEUE_NUM);
2034     for (i = 0; i < MIN(count, MAX_QUEUE_NUM); i++) {
2035         const char *name = ncs[i]->name;
2036         if (strncmp(str, name, len)) {
2037             continue;
2038         }
2039         if (ncs[i]->is_netdev) {
2040             readline_add_completion(rs, name);
2041         }
2042     }
2043 }
2044
2045 void info_trace_events_completion(ReadLineState *rs, int nb_args, const char *str)
2046 {
2047     size_t len;
2048
2049     len = strlen(str);
2050     readline_set_completion_index(rs, len);
2051     if (nb_args == 2) {
2052         TraceEventIter iter;
2053         TraceEvent *ev;
2054         char *pattern = g_strdup_printf("%s*", str);
2055         trace_event_iter_init(&iter, pattern);
2056         while ((ev = trace_event_iter_next(&iter)) != NULL) {
2057             readline_add_completion(rs, trace_event_get_name(ev));
2058         }
2059         g_free(pattern);
2060     }
2061 }
2062
2063 void trace_event_completion(ReadLineState *rs, int nb_args, const char *str)
2064 {
2065     size_t len;
2066
2067     len = strlen(str);
2068     readline_set_completion_index(rs, len);
2069     if (nb_args == 2) {
2070         TraceEventIter iter;
2071         TraceEvent *ev;
2072         char *pattern = g_strdup_printf("%s*", str);
2073         trace_event_iter_init(&iter, pattern);
2074         while ((ev = trace_event_iter_next(&iter)) != NULL) {
2075             readline_add_completion(rs, trace_event_get_name(ev));
2076         }
2077         g_free(pattern);
2078     } else if (nb_args == 3) {
2079         add_completion_option(rs, str, "on");
2080         add_completion_option(rs, str, "off");
2081     }
2082 }
2083
2084 void watchdog_action_completion(ReadLineState *rs, int nb_args, const char *str)
2085 {
2086     int i;
2087
2088     if (nb_args != 2) {
2089         return;
2090     }
2091     readline_set_completion_index(rs, strlen(str));
2092     for (i = 0; i < WATCHDOG_ACTION__MAX; i++) {
2093         add_completion_option(rs, str, WatchdogAction_str(i));
2094     }
2095 }
2096
2097 void migrate_set_capability_completion(ReadLineState *rs, int nb_args,
2098                                        const char *str)
2099 {
2100     size_t len;
2101
2102     len = strlen(str);
2103     readline_set_completion_index(rs, len);
2104     if (nb_args == 2) {
2105         int i;
2106         for (i = 0; i < MIGRATION_CAPABILITY__MAX; i++) {
2107             const char *name = MigrationCapability_str(i);
2108             if (!strncmp(str, name, len)) {
2109                 readline_add_completion(rs, name);
2110             }
2111         }
2112     } else if (nb_args == 3) {
2113         add_completion_option(rs, str, "on");
2114         add_completion_option(rs, str, "off");
2115     }
2116 }
2117
2118 void migrate_set_parameter_completion(ReadLineState *rs, int nb_args,
2119                                       const char *str)
2120 {
2121     size_t len;
2122
2123     len = strlen(str);
2124     readline_set_completion_index(rs, len);
2125     if (nb_args == 2) {
2126         int i;
2127         for (i = 0; i < MIGRATION_PARAMETER__MAX; i++) {
2128             const char *name = MigrationParameter_str(i);
2129             if (!strncmp(str, name, len)) {
2130                 readline_add_completion(rs, name);
2131             }
2132         }
2133     }
2134 }
2135
2136 static void vm_completion(ReadLineState *rs, const char *str)
2137 {
2138     size_t len;
2139     BlockDriverState *bs;
2140     BdrvNextIterator it;
2141
2142     len = strlen(str);
2143     readline_set_completion_index(rs, len);
2144
2145     for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
2146         SnapshotInfoList *snapshots, *snapshot;
2147         AioContext *ctx = bdrv_get_aio_context(bs);
2148         bool ok = false;
2149
2150         aio_context_acquire(ctx);
2151         if (bdrv_can_snapshot(bs)) {
2152             ok = bdrv_query_snapshot_info_list(bs, &snapshots, NULL) == 0;
2153         }
2154         aio_context_release(ctx);
2155         if (!ok) {
2156             continue;
2157         }
2158
2159         snapshot = snapshots;
2160         while (snapshot) {
2161             char *completion = snapshot->value->name;
2162             if (!strncmp(str, completion, len)) {
2163                 readline_add_completion(rs, completion);
2164             }
2165             completion = snapshot->value->id;
2166             if (!strncmp(str, completion, len)) {
2167                 readline_add_completion(rs, completion);
2168             }
2169             snapshot = snapshot->next;
2170         }
2171         qapi_free_SnapshotInfoList(snapshots);
2172     }
2173
2174 }
2175
2176 void delvm_completion(ReadLineState *rs, int nb_args, const char *str)
2177 {
2178     if (nb_args == 2) {
2179         vm_completion(rs, str);
2180     }
2181 }
2182
2183 void loadvm_completion(ReadLineState *rs, int nb_args, const char *str)
2184 {
2185     if (nb_args == 2) {
2186         vm_completion(rs, str);
2187     }
2188 }
2189
2190 static int
2191 compare_mon_cmd(const void *a, const void *b)
2192 {
2193     return strcmp(((const HMPCommand *)a)->name,
2194             ((const HMPCommand *)b)->name);
2195 }
2196
2197 static void sortcmdlist(void)
2198 {
2199     qsort(hmp_cmds, ARRAY_SIZE(hmp_cmds) - 1,
2200           sizeof(*hmp_cmds),
2201           compare_mon_cmd);
2202     qsort(hmp_info_cmds, ARRAY_SIZE(hmp_info_cmds) - 1,
2203           sizeof(*hmp_info_cmds),
2204           compare_mon_cmd);
2205 }
2206
2207 void monitor_init_globals(void)
2208 {
2209     monitor_init_globals_core();
2210     monitor_init_qmp_commands();
2211     sortcmdlist();
2212     qemu_mutex_init(&mon_fdsets_lock);
2213 }
This page took 0.143837 seconds and 4 git commands to generate.