sync with latest
[sdk/emulator/qemu.git] / hmp.c
1 /*
2  * Human Monitor Interface
3  *
4  * Copyright IBM, Corp. 2011
5  *
6  * Authors:
7  *  Anthony Liguori   <aliguori@us.ibm.com>
8  *
9  * This work is licensed under the terms of the GNU GPL, version 2.  See
10  * the COPYING file in the top-level directory.
11  *
12  * Contributions after 2012-01-13 are licensed under the terms of the
13  * GNU GPL, version 2 or (at your option) any later version.
14  */
15
16 #include "hmp.h"
17 #include "net.h"
18 #include "qemu-option.h"
19 #include "qemu-timer.h"
20 #include "qmp-commands.h"
21 #include "monitor.h"
22
23 static void hmp_handle_error(Monitor *mon, Error **errp)
24 {
25     if (error_is_set(errp)) {
26         monitor_printf(mon, "%s\n", error_get_pretty(*errp));
27         error_free(*errp);
28     }
29 }
30
31 void hmp_info_name(Monitor *mon)
32 {
33     NameInfo *info;
34
35     info = qmp_query_name(NULL);
36     if (info->has_name) {
37         monitor_printf(mon, "%s\n", info->name);
38     }
39     qapi_free_NameInfo(info);
40 }
41
42 void hmp_info_version(Monitor *mon)
43 {
44     VersionInfo *info;
45
46     info = qmp_query_version(NULL);
47
48     monitor_printf(mon, "%" PRId64 ".%" PRId64 ".%" PRId64 "%s\n",
49                    info->qemu.major, info->qemu.minor, info->qemu.micro,
50                    info->package);
51
52     qapi_free_VersionInfo(info);
53 }
54
55 void hmp_info_kvm(Monitor *mon)
56 {
57     KvmInfo *info;
58
59     info = qmp_query_kvm(NULL);
60     monitor_printf(mon, "kvm support: ");
61     if (info->present) {
62         monitor_printf(mon, "%s\n", info->enabled ? "enabled" : "disabled");
63     } else {
64         monitor_printf(mon, "not compiled\n");
65     }
66
67     qapi_free_KvmInfo(info);
68 }
69
70 void hmp_info_status(Monitor *mon)
71 {
72     StatusInfo *info;
73
74     info = qmp_query_status(NULL);
75
76     monitor_printf(mon, "VM status: %s%s",
77                    info->running ? "running" : "paused",
78                    info->singlestep ? " (single step mode)" : "");
79
80     if (!info->running && info->status != RUN_STATE_PAUSED) {
81         monitor_printf(mon, " (%s)", RunState_lookup[info->status]);
82     }
83
84     monitor_printf(mon, "\n");
85
86     qapi_free_StatusInfo(info);
87 }
88
89 void hmp_info_uuid(Monitor *mon)
90 {
91     UuidInfo *info;
92
93     info = qmp_query_uuid(NULL);
94     monitor_printf(mon, "%s\n", info->UUID);
95     qapi_free_UuidInfo(info);
96 }
97
98 void hmp_info_chardev(Monitor *mon)
99 {
100     ChardevInfoList *char_info, *info;
101
102     char_info = qmp_query_chardev(NULL);
103     for (info = char_info; info; info = info->next) {
104         monitor_printf(mon, "%s: filename=%s\n", info->value->label,
105                                                  info->value->filename);
106     }
107
108     qapi_free_ChardevInfoList(char_info);
109 }
110
111 void hmp_info_mice(Monitor *mon)
112 {
113     MouseInfoList *mice_list, *mouse;
114
115     mice_list = qmp_query_mice(NULL);
116     if (!mice_list) {
117         monitor_printf(mon, "No mouse devices connected\n");
118         return;
119     }
120
121     for (mouse = mice_list; mouse; mouse = mouse->next) {
122         monitor_printf(mon, "%c Mouse #%" PRId64 ": %s%s\n",
123                        mouse->value->current ? '*' : ' ',
124                        mouse->value->index, mouse->value->name,
125                        mouse->value->absolute ? " (absolute)" : "");
126     }
127
128     qapi_free_MouseInfoList(mice_list);
129 }
130
131 void hmp_info_migrate(Monitor *mon)
132 {
133     MigrationInfo *info;
134     MigrationCapabilityStatusList *caps, *cap;
135
136     info = qmp_query_migrate(NULL);
137     caps = qmp_query_migrate_capabilities(NULL);
138
139     /* do not display parameters during setup */
140     if (info->has_status && caps) {
141         monitor_printf(mon, "capabilities: ");
142         for (cap = caps; cap; cap = cap->next) {
143             monitor_printf(mon, "%s: %s ",
144                            MigrationCapability_lookup[cap->value->capability],
145                            cap->value->state ? "on" : "off");
146         }
147         monitor_printf(mon, "\n");
148     }
149
150     if (info->has_status) {
151         monitor_printf(mon, "Migration status: %s\n", info->status);
152         monitor_printf(mon, "total time: %" PRIu64 " milliseconds\n",
153                        info->total_time);
154     }
155
156     if (info->has_ram) {
157         monitor_printf(mon, "transferred ram: %" PRIu64 " kbytes\n",
158                        info->ram->transferred >> 10);
159         monitor_printf(mon, "remaining ram: %" PRIu64 " kbytes\n",
160                        info->ram->remaining >> 10);
161         monitor_printf(mon, "total ram: %" PRIu64 " kbytes\n",
162                        info->ram->total >> 10);
163         monitor_printf(mon, "duplicate: %" PRIu64 " pages\n",
164                        info->ram->duplicate);
165         monitor_printf(mon, "normal: %" PRIu64 " pages\n",
166                        info->ram->normal);
167         monitor_printf(mon, "normal bytes: %" PRIu64 " kbytes\n",
168                        info->ram->normal_bytes >> 10);
169     }
170
171     if (info->has_disk) {
172         monitor_printf(mon, "transferred disk: %" PRIu64 " kbytes\n",
173                        info->disk->transferred >> 10);
174         monitor_printf(mon, "remaining disk: %" PRIu64 " kbytes\n",
175                        info->disk->remaining >> 10);
176         monitor_printf(mon, "total disk: %" PRIu64 " kbytes\n",
177                        info->disk->total >> 10);
178     }
179
180     if (info->has_xbzrle_cache) {
181         monitor_printf(mon, "cache size: %" PRIu64 " bytes\n",
182                        info->xbzrle_cache->cache_size);
183         monitor_printf(mon, "xbzrle transferred: %" PRIu64 " kbytes\n",
184                        info->xbzrle_cache->bytes >> 10);
185         monitor_printf(mon, "xbzrle pages: %" PRIu64 " pages\n",
186                        info->xbzrle_cache->pages);
187         monitor_printf(mon, "xbzrle cache miss: %" PRIu64 "\n",
188                        info->xbzrle_cache->cache_miss);
189         monitor_printf(mon, "xbzrle overflow : %" PRIu64 "\n",
190                        info->xbzrle_cache->overflow);
191     }
192
193     qapi_free_MigrationInfo(info);
194     qapi_free_MigrationCapabilityStatusList(caps);
195 }
196
197 void hmp_info_migrate_capabilities(Monitor *mon)
198 {
199     MigrationCapabilityStatusList *caps, *cap;
200
201     caps = qmp_query_migrate_capabilities(NULL);
202
203     if (caps) {
204         monitor_printf(mon, "capabilities: ");
205         for (cap = caps; cap; cap = cap->next) {
206             monitor_printf(mon, "%s: %s ",
207                            MigrationCapability_lookup[cap->value->capability],
208                            cap->value->state ? "on" : "off");
209         }
210         monitor_printf(mon, "\n");
211     }
212
213     qapi_free_MigrationCapabilityStatusList(caps);
214 }
215
216 void hmp_info_migrate_cache_size(Monitor *mon)
217 {
218     monitor_printf(mon, "xbzrel cache size: %" PRId64 " kbytes\n",
219                    qmp_query_migrate_cache_size(NULL) >> 10);
220 }
221
222 void hmp_info_cpus(Monitor *mon)
223 {
224     CpuInfoList *cpu_list, *cpu;
225
226     cpu_list = qmp_query_cpus(NULL);
227
228     for (cpu = cpu_list; cpu; cpu = cpu->next) {
229         int active = ' ';
230
231         if (cpu->value->CPU == monitor_get_cpu_index()) {
232             active = '*';
233         }
234
235         monitor_printf(mon, "%c CPU #%" PRId64 ": ", active, cpu->value->CPU);
236
237         if (cpu->value->has_pc) {
238             monitor_printf(mon, "pc=0x%016" PRIx64, cpu->value->pc);
239         }
240         if (cpu->value->has_nip) {
241             monitor_printf(mon, "nip=0x%016" PRIx64, cpu->value->nip);
242         }
243         if (cpu->value->has_npc) {
244             monitor_printf(mon, "pc=0x%016" PRIx64, cpu->value->pc);
245             monitor_printf(mon, "npc=0x%016" PRIx64, cpu->value->npc);
246         }
247         if (cpu->value->has_PC) {
248             monitor_printf(mon, "PC=0x%016" PRIx64, cpu->value->PC);
249         }
250
251         if (cpu->value->halted) {
252             monitor_printf(mon, " (halted)");
253         }
254
255         monitor_printf(mon, " thread_id=%" PRId64 "\n", cpu->value->thread_id);
256     }
257
258     qapi_free_CpuInfoList(cpu_list);
259 }
260
261 void hmp_info_block(Monitor *mon)
262 {
263     BlockInfoList *block_list, *info;
264
265     block_list = qmp_query_block(NULL);
266
267     for (info = block_list; info; info = info->next) {
268         monitor_printf(mon, "%s: removable=%d",
269                        info->value->device, info->value->removable);
270
271         if (info->value->removable) {
272             monitor_printf(mon, " locked=%d", info->value->locked);
273             monitor_printf(mon, " tray-open=%d", info->value->tray_open);
274         }
275
276         if (info->value->has_io_status) {
277             monitor_printf(mon, " io-status=%s",
278                            BlockDeviceIoStatus_lookup[info->value->io_status]);
279         }
280
281         if (info->value->has_inserted) {
282             monitor_printf(mon, " file=");
283             monitor_print_filename(mon, info->value->inserted->file);
284
285             if (info->value->inserted->has_backing_file) {
286                 monitor_printf(mon, " backing_file=");
287                 monitor_print_filename(mon, info->value->inserted->backing_file);
288                 monitor_printf(mon, " backing_file_depth=%" PRId64,
289                     info->value->inserted->backing_file_depth);
290             }
291             monitor_printf(mon, " ro=%d drv=%s encrypted=%d",
292                            info->value->inserted->ro,
293                            info->value->inserted->drv,
294                            info->value->inserted->encrypted);
295
296             monitor_printf(mon, " bps=%" PRId64 " bps_rd=%" PRId64
297                             " bps_wr=%" PRId64 " iops=%" PRId64
298                             " iops_rd=%" PRId64 " iops_wr=%" PRId64,
299                             info->value->inserted->bps,
300                             info->value->inserted->bps_rd,
301                             info->value->inserted->bps_wr,
302                             info->value->inserted->iops,
303                             info->value->inserted->iops_rd,
304                             info->value->inserted->iops_wr);
305         } else {
306             monitor_printf(mon, " [not inserted]");
307         }
308
309         monitor_printf(mon, "\n");
310     }
311
312     qapi_free_BlockInfoList(block_list);
313 }
314
315 void hmp_info_blockstats(Monitor *mon)
316 {
317     BlockStatsList *stats_list, *stats;
318
319     stats_list = qmp_query_blockstats(NULL);
320
321     for (stats = stats_list; stats; stats = stats->next) {
322         if (!stats->value->has_device) {
323             continue;
324         }
325
326         monitor_printf(mon, "%s:", stats->value->device);
327         monitor_printf(mon, " rd_bytes=%" PRId64
328                        " wr_bytes=%" PRId64
329                        " rd_operations=%" PRId64
330                        " wr_operations=%" PRId64
331                        " flush_operations=%" PRId64
332                        " wr_total_time_ns=%" PRId64
333                        " rd_total_time_ns=%" PRId64
334                        " flush_total_time_ns=%" PRId64
335                        "\n",
336                        stats->value->stats->rd_bytes,
337                        stats->value->stats->wr_bytes,
338                        stats->value->stats->rd_operations,
339                        stats->value->stats->wr_operations,
340                        stats->value->stats->flush_operations,
341                        stats->value->stats->wr_total_time_ns,
342                        stats->value->stats->rd_total_time_ns,
343                        stats->value->stats->flush_total_time_ns);
344     }
345
346     qapi_free_BlockStatsList(stats_list);
347 }
348
349 void hmp_info_vnc(Monitor *mon)
350 {
351     VncInfo *info;
352     Error *err = NULL;
353     VncClientInfoList *client;
354
355     info = qmp_query_vnc(&err);
356     if (err) {
357         monitor_printf(mon, "%s\n", error_get_pretty(err));
358         error_free(err);
359         return;
360     }
361
362     if (!info->enabled) {
363         monitor_printf(mon, "Server: disabled\n");
364         goto out;
365     }
366
367     monitor_printf(mon, "Server:\n");
368     if (info->has_host && info->has_service) {
369         monitor_printf(mon, "     address: %s:%s\n", info->host, info->service);
370     }
371     if (info->has_auth) {
372         monitor_printf(mon, "        auth: %s\n", info->auth);
373     }
374
375     if (!info->has_clients || info->clients == NULL) {
376         monitor_printf(mon, "Client: none\n");
377     } else {
378         for (client = info->clients; client; client = client->next) {
379             monitor_printf(mon, "Client:\n");
380             monitor_printf(mon, "     address: %s:%s\n",
381                            client->value->host, client->value->service);
382             monitor_printf(mon, "  x509_dname: %s\n",
383                            client->value->x509_dname ?
384                            client->value->x509_dname : "none");
385             monitor_printf(mon, "    username: %s\n",
386                            client->value->has_sasl_username ?
387                            client->value->sasl_username : "none");
388         }
389     }
390
391 out:
392     qapi_free_VncInfo(info);
393 }
394
395 void hmp_info_spice(Monitor *mon)
396 {
397     SpiceChannelList *chan;
398     SpiceInfo *info;
399
400     info = qmp_query_spice(NULL);
401
402     if (!info->enabled) {
403         monitor_printf(mon, "Server: disabled\n");
404         goto out;
405     }
406
407     monitor_printf(mon, "Server:\n");
408     if (info->has_port) {
409         monitor_printf(mon, "     address: %s:%" PRId64 "\n",
410                        info->host, info->port);
411     }
412     if (info->has_tls_port) {
413         monitor_printf(mon, "     address: %s:%" PRId64 " [tls]\n",
414                        info->host, info->tls_port);
415     }
416     monitor_printf(mon, "        auth: %s\n", info->auth);
417     monitor_printf(mon, "    compiled: %s\n", info->compiled_version);
418     monitor_printf(mon, "  mouse-mode: %s\n",
419                    SpiceQueryMouseMode_lookup[info->mouse_mode]);
420
421     if (!info->has_channels || info->channels == NULL) {
422         monitor_printf(mon, "Channels: none\n");
423     } else {
424         for (chan = info->channels; chan; chan = chan->next) {
425             monitor_printf(mon, "Channel:\n");
426             monitor_printf(mon, "     address: %s:%s%s\n",
427                            chan->value->host, chan->value->port,
428                            chan->value->tls ? " [tls]" : "");
429             monitor_printf(mon, "     session: %" PRId64 "\n",
430                            chan->value->connection_id);
431             monitor_printf(mon, "     channel: %" PRId64 ":%" PRId64 "\n",
432                            chan->value->channel_type, chan->value->channel_id);
433         }
434     }
435
436 out:
437     qapi_free_SpiceInfo(info);
438 }
439
440 void hmp_info_balloon(Monitor *mon)
441 {
442     BalloonInfo *info;
443     Error *err = NULL;
444
445     info = qmp_query_balloon(&err);
446     if (err) {
447         monitor_printf(mon, "%s\n", error_get_pretty(err));
448         error_free(err);
449         return;
450     }
451
452     monitor_printf(mon, "balloon: actual=%" PRId64, info->actual >> 20);
453     if (info->has_mem_swapped_in) {
454         monitor_printf(mon, " mem_swapped_in=%" PRId64, info->mem_swapped_in);
455     }
456     if (info->has_mem_swapped_out) {
457         monitor_printf(mon, " mem_swapped_out=%" PRId64, info->mem_swapped_out);
458     }
459     if (info->has_major_page_faults) {
460         monitor_printf(mon, " major_page_faults=%" PRId64,
461                        info->major_page_faults);
462     }
463     if (info->has_minor_page_faults) {
464         monitor_printf(mon, " minor_page_faults=%" PRId64,
465                        info->minor_page_faults);
466     }
467     if (info->has_free_mem) {
468         monitor_printf(mon, " free_mem=%" PRId64, info->free_mem);
469     }
470     if (info->has_total_mem) {
471         monitor_printf(mon, " total_mem=%" PRId64, info->total_mem);
472     }
473
474     monitor_printf(mon, "\n");
475
476     qapi_free_BalloonInfo(info);
477 }
478
479 static void hmp_info_pci_device(Monitor *mon, const PciDeviceInfo *dev)
480 {
481     PciMemoryRegionList *region;
482
483     monitor_printf(mon, "  Bus %2" PRId64 ", ", dev->bus);
484     monitor_printf(mon, "device %3" PRId64 ", function %" PRId64 ":\n",
485                    dev->slot, dev->function);
486     monitor_printf(mon, "    ");
487
488     if (dev->class_info.has_desc) {
489         monitor_printf(mon, "%s", dev->class_info.desc);
490     } else {
491         monitor_printf(mon, "Class %04" PRId64, dev->class_info.class);
492     }
493
494     monitor_printf(mon, ": PCI device %04" PRIx64 ":%04" PRIx64 "\n",
495                    dev->id.vendor, dev->id.device);
496
497     if (dev->has_irq) {
498         monitor_printf(mon, "      IRQ %" PRId64 ".\n", dev->irq);
499     }
500
501     if (dev->has_pci_bridge) {
502         monitor_printf(mon, "      BUS %" PRId64 ".\n",
503                        dev->pci_bridge->bus.number);
504         monitor_printf(mon, "      secondary bus %" PRId64 ".\n",
505                        dev->pci_bridge->bus.secondary);
506         monitor_printf(mon, "      subordinate bus %" PRId64 ".\n",
507                        dev->pci_bridge->bus.subordinate);
508
509         monitor_printf(mon, "      IO range [0x%04"PRIx64", 0x%04"PRIx64"]\n",
510                        dev->pci_bridge->bus.io_range->base,
511                        dev->pci_bridge->bus.io_range->limit);
512
513         monitor_printf(mon,
514                        "      memory range [0x%08"PRIx64", 0x%08"PRIx64"]\n",
515                        dev->pci_bridge->bus.memory_range->base,
516                        dev->pci_bridge->bus.memory_range->limit);
517
518         monitor_printf(mon, "      prefetchable memory range "
519                        "[0x%08"PRIx64", 0x%08"PRIx64"]\n",
520                        dev->pci_bridge->bus.prefetchable_range->base,
521                        dev->pci_bridge->bus.prefetchable_range->limit);
522     }
523
524     for (region = dev->regions; region; region = region->next) {
525         uint64_t addr, size;
526
527         addr = region->value->address;
528         size = region->value->size;
529
530         monitor_printf(mon, "      BAR%" PRId64 ": ", region->value->bar);
531
532         if (!strcmp(region->value->type, "io")) {
533             monitor_printf(mon, "I/O at 0x%04" PRIx64
534                                 " [0x%04" PRIx64 "].\n",
535                            addr, addr + size - 1);
536         } else {
537             monitor_printf(mon, "%d bit%s memory at 0x%08" PRIx64
538                                " [0x%08" PRIx64 "].\n",
539                            region->value->mem_type_64 ? 64 : 32,
540                            region->value->prefetch ? " prefetchable" : "",
541                            addr, addr + size - 1);
542         }
543     }
544
545     monitor_printf(mon, "      id \"%s\"\n", dev->qdev_id);
546
547     if (dev->has_pci_bridge) {
548         if (dev->pci_bridge->has_devices) {
549             PciDeviceInfoList *cdev;
550             for (cdev = dev->pci_bridge->devices; cdev; cdev = cdev->next) {
551                 hmp_info_pci_device(mon, cdev->value);
552             }
553         }
554     }
555 }
556
557 void hmp_info_pci(Monitor *mon)
558 {
559     PciInfoList *info_list, *info;
560     Error *err = NULL;
561
562     info_list = qmp_query_pci(&err);
563     if (err) {
564         monitor_printf(mon, "PCI devices not supported\n");
565         error_free(err);
566         return;
567     }
568
569     for (info = info_list; info; info = info->next) {
570         PciDeviceInfoList *dev;
571
572         for (dev = info->value->devices; dev; dev = dev->next) {
573             hmp_info_pci_device(mon, dev->value);
574         }
575     }
576
577     qapi_free_PciInfoList(info_list);
578 }
579
580 void hmp_info_block_jobs(Monitor *mon)
581 {
582     BlockJobInfoList *list;
583     Error *err = NULL;
584
585     list = qmp_query_block_jobs(&err);
586     assert(!err);
587
588     if (!list) {
589         monitor_printf(mon, "No active jobs\n");
590         return;
591     }
592
593     while (list) {
594         if (strcmp(list->value->type, "stream") == 0) {
595             monitor_printf(mon, "Streaming device %s: Completed %" PRId64
596                            " of %" PRId64 " bytes, speed limit %" PRId64
597                            " bytes/s\n",
598                            list->value->device,
599                            list->value->offset,
600                            list->value->len,
601                            list->value->speed);
602         } else {
603             monitor_printf(mon, "Type %s, device %s: Completed %" PRId64
604                            " of %" PRId64 " bytes, speed limit %" PRId64
605                            " bytes/s\n",
606                            list->value->type,
607                            list->value->device,
608                            list->value->offset,
609                            list->value->len,
610                            list->value->speed);
611         }
612         list = list->next;
613     }
614 }
615
616 void hmp_quit(Monitor *mon, const QDict *qdict)
617 {
618     monitor_suspend(mon);
619     qmp_quit(NULL);
620 }
621
622 void hmp_stop(Monitor *mon, const QDict *qdict)
623 {
624     qmp_stop(NULL);
625 }
626
627 void hmp_system_reset(Monitor *mon, const QDict *qdict)
628 {
629     qmp_system_reset(NULL);
630 }
631
632 void hmp_system_powerdown(Monitor *mon, const QDict *qdict)
633 {
634     qmp_system_powerdown(NULL);
635 }
636
637 void hmp_cpu(Monitor *mon, const QDict *qdict)
638 {
639     int64_t cpu_index;
640
641     /* XXX: drop the monitor_set_cpu() usage when all HMP commands that
642             use it are converted to the QAPI */
643     cpu_index = qdict_get_int(qdict, "index");
644     if (monitor_set_cpu(cpu_index) < 0) {
645         monitor_printf(mon, "invalid CPU index\n");
646     }
647 }
648
649 void hmp_memsave(Monitor *mon, const QDict *qdict)
650 {
651     uint32_t size = qdict_get_int(qdict, "size");
652     const char *filename = qdict_get_str(qdict, "filename");
653     uint64_t addr = qdict_get_int(qdict, "val");
654     Error *errp = NULL;
655
656     qmp_memsave(addr, size, filename, true, monitor_get_cpu_index(), &errp);
657     hmp_handle_error(mon, &errp);
658 }
659
660 void hmp_pmemsave(Monitor *mon, const QDict *qdict)
661 {
662     uint32_t size = qdict_get_int(qdict, "size");
663     const char *filename = qdict_get_str(qdict, "filename");
664     uint64_t addr = qdict_get_int(qdict, "val");
665     Error *errp = NULL;
666
667     qmp_pmemsave(addr, size, filename, &errp);
668     hmp_handle_error(mon, &errp);
669 }
670
671 static void hmp_cont_cb(void *opaque, int err)
672 {
673     if (!err) {
674         qmp_cont(NULL);
675     }
676 }
677
678 static bool key_is_missing(const BlockInfo *bdev)
679 {
680     return (bdev->inserted && bdev->inserted->encryption_key_missing);
681 }
682
683 void hmp_cont(Monitor *mon, const QDict *qdict)
684 {
685     BlockInfoList *bdev_list, *bdev;
686     Error *errp = NULL;
687
688     bdev_list = qmp_query_block(NULL);
689     for (bdev = bdev_list; bdev; bdev = bdev->next) {
690         if (key_is_missing(bdev->value)) {
691             monitor_read_block_device_key(mon, bdev->value->device,
692                                           hmp_cont_cb, NULL);
693             goto out;
694         }
695     }
696
697     qmp_cont(&errp);
698     hmp_handle_error(mon, &errp);
699
700 out:
701     qapi_free_BlockInfoList(bdev_list);
702 }
703
704 void hmp_system_wakeup(Monitor *mon, const QDict *qdict)
705 {
706     qmp_system_wakeup(NULL);
707 }
708
709 void hmp_inject_nmi(Monitor *mon, const QDict *qdict)
710 {
711     Error *errp = NULL;
712
713     qmp_inject_nmi(&errp);
714     hmp_handle_error(mon, &errp);
715 }
716
717 void hmp_set_link(Monitor *mon, const QDict *qdict)
718 {
719     const char *name = qdict_get_str(qdict, "name");
720     int up = qdict_get_bool(qdict, "up");
721     Error *errp = NULL;
722
723     qmp_set_link(name, up, &errp);
724     hmp_handle_error(mon, &errp);
725 }
726
727 void hmp_block_passwd(Monitor *mon, const QDict *qdict)
728 {
729     const char *device = qdict_get_str(qdict, "device");
730     const char *password = qdict_get_str(qdict, "password");
731     Error *errp = NULL;
732
733     qmp_block_passwd(device, password, &errp);
734     hmp_handle_error(mon, &errp);
735 }
736
737 void hmp_balloon(Monitor *mon, const QDict *qdict)
738 {
739     int64_t value = qdict_get_int(qdict, "value");
740     Error *errp = NULL;
741
742     qmp_balloon(value, &errp);
743     if (error_is_set(&errp)) {
744         monitor_printf(mon, "balloon: %s\n", error_get_pretty(errp));
745         error_free(errp);
746     }
747 }
748
749 void hmp_block_resize(Monitor *mon, const QDict *qdict)
750 {
751     const char *device = qdict_get_str(qdict, "device");
752     int64_t size = qdict_get_int(qdict, "size");
753     Error *errp = NULL;
754
755     qmp_block_resize(device, size, &errp);
756     hmp_handle_error(mon, &errp);
757 }
758
759 void hmp_snapshot_blkdev(Monitor *mon, const QDict *qdict)
760 {
761     const char *device = qdict_get_str(qdict, "device");
762     const char *filename = qdict_get_try_str(qdict, "snapshot-file");
763     const char *format = qdict_get_try_str(qdict, "format");
764     int reuse = qdict_get_try_bool(qdict, "reuse", 0);
765     enum NewImageMode mode;
766     Error *errp = NULL;
767
768     if (!filename) {
769         /* In the future, if 'snapshot-file' is not specified, the snapshot
770            will be taken internally. Today it's actually required. */
771         error_set(&errp, QERR_MISSING_PARAMETER, "snapshot-file");
772         hmp_handle_error(mon, &errp);
773         return;
774     }
775
776     mode = reuse ? NEW_IMAGE_MODE_EXISTING : NEW_IMAGE_MODE_ABSOLUTE_PATHS;
777     qmp_blockdev_snapshot_sync(device, filename, !!format, format,
778                                true, mode, &errp);
779     hmp_handle_error(mon, &errp);
780 }
781
782 void hmp_migrate_cancel(Monitor *mon, const QDict *qdict)
783 {
784     qmp_migrate_cancel(NULL);
785 }
786
787 void hmp_migrate_set_downtime(Monitor *mon, const QDict *qdict)
788 {
789     double value = qdict_get_double(qdict, "value");
790     qmp_migrate_set_downtime(value, NULL);
791 }
792
793 void hmp_migrate_set_cache_size(Monitor *mon, const QDict *qdict)
794 {
795     int64_t value = qdict_get_int(qdict, "value");
796     Error *err = NULL;
797
798     qmp_migrate_set_cache_size(value, &err);
799     if (err) {
800         monitor_printf(mon, "%s\n", error_get_pretty(err));
801         error_free(err);
802         return;
803     }
804 }
805
806 void hmp_migrate_set_speed(Monitor *mon, const QDict *qdict)
807 {
808     int64_t value = qdict_get_int(qdict, "value");
809     qmp_migrate_set_speed(value, NULL);
810 }
811
812 void hmp_migrate_set_capability(Monitor *mon, const QDict *qdict)
813 {
814     const char *cap = qdict_get_str(qdict, "capability");
815     bool state = qdict_get_bool(qdict, "state");
816     Error *err = NULL;
817     MigrationCapabilityStatusList *caps = g_malloc0(sizeof(*caps));
818     int i;
819
820     for (i = 0; i < MIGRATION_CAPABILITY_MAX; i++) {
821         if (strcmp(cap, MigrationCapability_lookup[i]) == 0) {
822             caps->value = g_malloc0(sizeof(*caps->value));
823             caps->value->capability = i;
824             caps->value->state = state;
825             caps->next = NULL;
826             qmp_migrate_set_capabilities(caps, &err);
827             break;
828         }
829     }
830
831     if (i == MIGRATION_CAPABILITY_MAX) {
832         error_set(&err, QERR_INVALID_PARAMETER, cap);
833     }
834
835     qapi_free_MigrationCapabilityStatusList(caps);
836
837     if (err) {
838         monitor_printf(mon, "migrate_set_parameter: %s\n",
839                        error_get_pretty(err));
840         error_free(err);
841     }
842 }
843
844 void hmp_set_password(Monitor *mon, const QDict *qdict)
845 {
846     const char *protocol  = qdict_get_str(qdict, "protocol");
847     const char *password  = qdict_get_str(qdict, "password");
848     const char *connected = qdict_get_try_str(qdict, "connected");
849     Error *err = NULL;
850
851     qmp_set_password(protocol, password, !!connected, connected, &err);
852     hmp_handle_error(mon, &err);
853 }
854
855 void hmp_expire_password(Monitor *mon, const QDict *qdict)
856 {
857     const char *protocol  = qdict_get_str(qdict, "protocol");
858     const char *whenstr = qdict_get_str(qdict, "time");
859     Error *err = NULL;
860
861     qmp_expire_password(protocol, whenstr, &err);
862     hmp_handle_error(mon, &err);
863 }
864
865 void hmp_eject(Monitor *mon, const QDict *qdict)
866 {
867     int force = qdict_get_try_bool(qdict, "force", 0);
868     const char *device = qdict_get_str(qdict, "device");
869     Error *err = NULL;
870
871     qmp_eject(device, true, force, &err);
872     hmp_handle_error(mon, &err);
873 }
874
875 static void hmp_change_read_arg(Monitor *mon, const char *password,
876                                 void *opaque)
877 {
878     qmp_change_vnc_password(password, NULL);
879     monitor_read_command(mon, 1);
880 }
881
882 void hmp_change(Monitor *mon, const QDict *qdict)
883 {
884     const char *device = qdict_get_str(qdict, "device");
885     const char *target = qdict_get_str(qdict, "target");
886     const char *arg = qdict_get_try_str(qdict, "arg");
887     Error *err = NULL;
888
889     if (strcmp(device, "vnc") == 0 &&
890             (strcmp(target, "passwd") == 0 ||
891              strcmp(target, "password") == 0)) {
892         if (!arg) {
893             monitor_read_password(mon, hmp_change_read_arg, NULL);
894             return;
895         }
896     }
897
898     qmp_change(device, target, !!arg, arg, &err);
899     if (error_is_set(&err) &&
900         error_get_class(err) == ERROR_CLASS_DEVICE_ENCRYPTED) {
901         error_free(err);
902         monitor_read_block_device_key(mon, device, NULL, NULL);
903         return;
904     }
905     hmp_handle_error(mon, &err);
906 }
907
908 void hmp_block_set_io_throttle(Monitor *mon, const QDict *qdict)
909 {
910     Error *err = NULL;
911
912     qmp_block_set_io_throttle(qdict_get_str(qdict, "device"),
913                               qdict_get_int(qdict, "bps"),
914                               qdict_get_int(qdict, "bps_rd"),
915                               qdict_get_int(qdict, "bps_wr"),
916                               qdict_get_int(qdict, "iops"),
917                               qdict_get_int(qdict, "iops_rd"),
918                               qdict_get_int(qdict, "iops_wr"), &err);
919     hmp_handle_error(mon, &err);
920 }
921
922 void hmp_block_stream(Monitor *mon, const QDict *qdict)
923 {
924     Error *error = NULL;
925     const char *device = qdict_get_str(qdict, "device");
926     const char *base = qdict_get_try_str(qdict, "base");
927     int64_t speed = qdict_get_try_int(qdict, "speed", 0);
928
929     qmp_block_stream(device, base != NULL, base,
930                      qdict_haskey(qdict, "speed"), speed, &error);
931
932     hmp_handle_error(mon, &error);
933 }
934
935 void hmp_block_job_set_speed(Monitor *mon, const QDict *qdict)
936 {
937     Error *error = NULL;
938     const char *device = qdict_get_str(qdict, "device");
939     int64_t value = qdict_get_int(qdict, "speed");
940
941     qmp_block_job_set_speed(device, value, &error);
942
943     hmp_handle_error(mon, &error);
944 }
945
946 void hmp_block_job_cancel(Monitor *mon, const QDict *qdict)
947 {
948     Error *error = NULL;
949     const char *device = qdict_get_str(qdict, "device");
950
951     qmp_block_job_cancel(device, &error);
952
953     hmp_handle_error(mon, &error);
954 }
955
956 typedef struct MigrationStatus
957 {
958     QEMUTimer *timer;
959     Monitor *mon;
960     bool is_block_migration;
961 } MigrationStatus;
962
963 static void hmp_migrate_status_cb(void *opaque)
964 {
965     MigrationStatus *status = opaque;
966     MigrationInfo *info;
967
968     info = qmp_query_migrate(NULL);
969     if (!info->has_status || strcmp(info->status, "active") == 0) {
970         if (info->has_disk) {
971             int progress;
972
973             if (info->disk->remaining) {
974                 progress = info->disk->transferred * 100 / info->disk->total;
975             } else {
976                 progress = 100;
977             }
978
979             monitor_printf(status->mon, "Completed %d %%\r", progress);
980             monitor_flush(status->mon);
981         }
982
983         qemu_mod_timer(status->timer, qemu_get_clock_ms(rt_clock) + 1000);
984     } else {
985         if (status->is_block_migration) {
986             monitor_printf(status->mon, "\n");
987         }
988         monitor_resume(status->mon);
989         qemu_del_timer(status->timer);
990         g_free(status);
991     }
992
993     qapi_free_MigrationInfo(info);
994 }
995
996 void hmp_migrate(Monitor *mon, const QDict *qdict)
997 {
998     int detach = qdict_get_try_bool(qdict, "detach", 0);
999     int blk = qdict_get_try_bool(qdict, "blk", 0);
1000     int inc = qdict_get_try_bool(qdict, "inc", 0);
1001     const char *uri = qdict_get_str(qdict, "uri");
1002     Error *err = NULL;
1003
1004     qmp_migrate(uri, !!blk, blk, !!inc, inc, false, false, &err);
1005     if (err) {
1006         monitor_printf(mon, "migrate: %s\n", error_get_pretty(err));
1007         error_free(err);
1008         return;
1009     }
1010
1011     if (!detach) {
1012         MigrationStatus *status;
1013
1014         if (monitor_suspend(mon) < 0) {
1015             monitor_printf(mon, "terminal does not allow synchronous "
1016                            "migration, continuing detached\n");
1017             return;
1018         }
1019
1020         status = g_malloc0(sizeof(*status));
1021         status->mon = mon;
1022         status->is_block_migration = blk || inc;
1023         status->timer = qemu_new_timer_ms(rt_clock, hmp_migrate_status_cb,
1024                                           status);
1025         qemu_mod_timer(status->timer, qemu_get_clock_ms(rt_clock));
1026     }
1027 }
1028
1029 void hmp_device_del(Monitor *mon, const QDict *qdict)
1030 {
1031     const char *id = qdict_get_str(qdict, "id");
1032     Error *err = NULL;
1033
1034     qmp_device_del(id, &err);
1035     hmp_handle_error(mon, &err);
1036 }
1037
1038 void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict)
1039 {
1040     Error *errp = NULL;
1041     int paging = qdict_get_try_bool(qdict, "paging", 0);
1042     const char *file = qdict_get_str(qdict, "protocol");
1043     bool has_begin = qdict_haskey(qdict, "begin");
1044     bool has_length = qdict_haskey(qdict, "length");
1045     int64_t begin = 0;
1046     int64_t length = 0;
1047
1048     if (has_begin) {
1049         begin = qdict_get_int(qdict, "begin");
1050     }
1051     if (has_length) {
1052         length = qdict_get_int(qdict, "length");
1053     }
1054
1055     qmp_dump_guest_memory(paging, file, has_begin, begin, has_length, length,
1056                           &errp);
1057     hmp_handle_error(mon, &errp);
1058 }
1059
1060 void hmp_netdev_add(Monitor *mon, const QDict *qdict)
1061 {
1062     Error *err = NULL;
1063     QemuOpts *opts;
1064
1065     opts = qemu_opts_from_qdict(qemu_find_opts("netdev"), qdict, &err);
1066     if (error_is_set(&err)) {
1067         goto out;
1068     }
1069
1070     netdev_add(opts, &err);
1071     if (error_is_set(&err)) {
1072         qemu_opts_del(opts);
1073     }
1074
1075 out:
1076     hmp_handle_error(mon, &err);
1077 }
1078
1079 void hmp_netdev_del(Monitor *mon, const QDict *qdict)
1080 {
1081     const char *id = qdict_get_str(qdict, "id");
1082     Error *err = NULL;
1083
1084     qmp_netdev_del(id, &err);
1085     hmp_handle_error(mon, &err);
1086 }
1087
1088 void hmp_getfd(Monitor *mon, const QDict *qdict)
1089 {
1090     const char *fdname = qdict_get_str(qdict, "fdname");
1091     Error *errp = NULL;
1092
1093     qmp_getfd(fdname, &errp);
1094     hmp_handle_error(mon, &errp);
1095 }
1096
1097 void hmp_closefd(Monitor *mon, const QDict *qdict)
1098 {
1099     const char *fdname = qdict_get_str(qdict, "fdname");
1100     Error *errp = NULL;
1101
1102     qmp_closefd(fdname, &errp);
1103     hmp_handle_error(mon, &errp);
1104 }