]> Git Repo - qemu.git/blob - hmp.c
tests: add file-write-read test
[qemu.git] / hmp.c
1 /*
2  * Human Monitor Interface
3  *
4  * Copyright IBM, Corp. 2011
5  *
6  * Authors:
7  *  Anthony Liguori   <[email protected]>
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/net.h"
18 #include "net/eth.h"
19 #include "sysemu/char.h"
20 #include "sysemu/block-backend.h"
21 #include "qemu/option.h"
22 #include "qemu/timer.h"
23 #include "qmp-commands.h"
24 #include "qemu/sockets.h"
25 #include "monitor/monitor.h"
26 #include "monitor/qdev.h"
27 #include "qapi/opts-visitor.h"
28 #include "qapi/qmp/qerror.h"
29 #include "qapi/string-output-visitor.h"
30 #include "qapi/util.h"
31 #include "qapi-visit.h"
32 #include "ui/console.h"
33 #include "block/qapi.h"
34 #include "qemu-io.h"
35
36 #ifdef CONFIG_SPICE
37 #include <spice/enums.h>
38 #endif
39
40 static void hmp_handle_error(Monitor *mon, Error **errp)
41 {
42     assert(errp);
43     if (*errp) {
44         monitor_printf(mon, "%s\n", error_get_pretty(*errp));
45         error_free(*errp);
46     }
47 }
48
49 void hmp_info_name(Monitor *mon, const QDict *qdict)
50 {
51     NameInfo *info;
52
53     info = qmp_query_name(NULL);
54     if (info->has_name) {
55         monitor_printf(mon, "%s\n", info->name);
56     }
57     qapi_free_NameInfo(info);
58 }
59
60 void hmp_info_version(Monitor *mon, const QDict *qdict)
61 {
62     VersionInfo *info;
63
64     info = qmp_query_version(NULL);
65
66     monitor_printf(mon, "%" PRId64 ".%" PRId64 ".%" PRId64 "%s\n",
67                    info->qemu->major, info->qemu->minor, info->qemu->micro,
68                    info->package);
69
70     qapi_free_VersionInfo(info);
71 }
72
73 void hmp_info_kvm(Monitor *mon, const QDict *qdict)
74 {
75     KvmInfo *info;
76
77     info = qmp_query_kvm(NULL);
78     monitor_printf(mon, "kvm support: ");
79     if (info->present) {
80         monitor_printf(mon, "%s\n", info->enabled ? "enabled" : "disabled");
81     } else {
82         monitor_printf(mon, "not compiled\n");
83     }
84
85     qapi_free_KvmInfo(info);
86 }
87
88 void hmp_info_status(Monitor *mon, const QDict *qdict)
89 {
90     StatusInfo *info;
91
92     info = qmp_query_status(NULL);
93
94     monitor_printf(mon, "VM status: %s%s",
95                    info->running ? "running" : "paused",
96                    info->singlestep ? " (single step mode)" : "");
97
98     if (!info->running && info->status != RUN_STATE_PAUSED) {
99         monitor_printf(mon, " (%s)", RunState_lookup[info->status]);
100     }
101
102     monitor_printf(mon, "\n");
103
104     qapi_free_StatusInfo(info);
105 }
106
107 void hmp_info_uuid(Monitor *mon, const QDict *qdict)
108 {
109     UuidInfo *info;
110
111     info = qmp_query_uuid(NULL);
112     monitor_printf(mon, "%s\n", info->UUID);
113     qapi_free_UuidInfo(info);
114 }
115
116 void hmp_info_chardev(Monitor *mon, const QDict *qdict)
117 {
118     ChardevInfoList *char_info, *info;
119
120     char_info = qmp_query_chardev(NULL);
121     for (info = char_info; info; info = info->next) {
122         monitor_printf(mon, "%s: filename=%s\n", info->value->label,
123                                                  info->value->filename);
124     }
125
126     qapi_free_ChardevInfoList(char_info);
127 }
128
129 void hmp_info_mice(Monitor *mon, const QDict *qdict)
130 {
131     MouseInfoList *mice_list, *mouse;
132
133     mice_list = qmp_query_mice(NULL);
134     if (!mice_list) {
135         monitor_printf(mon, "No mouse devices connected\n");
136         return;
137     }
138
139     for (mouse = mice_list; mouse; mouse = mouse->next) {
140         monitor_printf(mon, "%c Mouse #%" PRId64 ": %s%s\n",
141                        mouse->value->current ? '*' : ' ',
142                        mouse->value->index, mouse->value->name,
143                        mouse->value->absolute ? " (absolute)" : "");
144     }
145
146     qapi_free_MouseInfoList(mice_list);
147 }
148
149 void hmp_info_migrate(Monitor *mon, const QDict *qdict)
150 {
151     MigrationInfo *info;
152     MigrationCapabilityStatusList *caps, *cap;
153
154     info = qmp_query_migrate(NULL);
155     caps = qmp_query_migrate_capabilities(NULL);
156
157     /* do not display parameters during setup */
158     if (info->has_status && caps) {
159         monitor_printf(mon, "capabilities: ");
160         for (cap = caps; cap; cap = cap->next) {
161             monitor_printf(mon, "%s: %s ",
162                            MigrationCapability_lookup[cap->value->capability],
163                            cap->value->state ? "on" : "off");
164         }
165         monitor_printf(mon, "\n");
166     }
167
168     if (info->has_status) {
169         monitor_printf(mon, "Migration status: %s\n",
170                        MigrationStatus_lookup[info->status]);
171         monitor_printf(mon, "total time: %" PRIu64 " milliseconds\n",
172                        info->total_time);
173         if (info->has_expected_downtime) {
174             monitor_printf(mon, "expected downtime: %" PRIu64 " milliseconds\n",
175                            info->expected_downtime);
176         }
177         if (info->has_downtime) {
178             monitor_printf(mon, "downtime: %" PRIu64 " milliseconds\n",
179                            info->downtime);
180         }
181         if (info->has_setup_time) {
182             monitor_printf(mon, "setup: %" PRIu64 " milliseconds\n",
183                            info->setup_time);
184         }
185     }
186
187     if (info->has_ram) {
188         monitor_printf(mon, "transferred ram: %" PRIu64 " kbytes\n",
189                        info->ram->transferred >> 10);
190         monitor_printf(mon, "throughput: %0.2f mbps\n",
191                        info->ram->mbps);
192         monitor_printf(mon, "remaining ram: %" PRIu64 " kbytes\n",
193                        info->ram->remaining >> 10);
194         monitor_printf(mon, "total ram: %" PRIu64 " kbytes\n",
195                        info->ram->total >> 10);
196         monitor_printf(mon, "duplicate: %" PRIu64 " pages\n",
197                        info->ram->duplicate);
198         monitor_printf(mon, "skipped: %" PRIu64 " pages\n",
199                        info->ram->skipped);
200         monitor_printf(mon, "normal: %" PRIu64 " pages\n",
201                        info->ram->normal);
202         monitor_printf(mon, "normal bytes: %" PRIu64 " kbytes\n",
203                        info->ram->normal_bytes >> 10);
204         monitor_printf(mon, "dirty sync count: %" PRIu64 "\n",
205                        info->ram->dirty_sync_count);
206         if (info->ram->dirty_pages_rate) {
207             monitor_printf(mon, "dirty pages rate: %" PRIu64 " pages\n",
208                            info->ram->dirty_pages_rate);
209         }
210     }
211
212     if (info->has_disk) {
213         monitor_printf(mon, "transferred disk: %" PRIu64 " kbytes\n",
214                        info->disk->transferred >> 10);
215         monitor_printf(mon, "remaining disk: %" PRIu64 " kbytes\n",
216                        info->disk->remaining >> 10);
217         monitor_printf(mon, "total disk: %" PRIu64 " kbytes\n",
218                        info->disk->total >> 10);
219     }
220
221     if (info->has_xbzrle_cache) {
222         monitor_printf(mon, "cache size: %" PRIu64 " bytes\n",
223                        info->xbzrle_cache->cache_size);
224         monitor_printf(mon, "xbzrle transferred: %" PRIu64 " kbytes\n",
225                        info->xbzrle_cache->bytes >> 10);
226         monitor_printf(mon, "xbzrle pages: %" PRIu64 " pages\n",
227                        info->xbzrle_cache->pages);
228         monitor_printf(mon, "xbzrle cache miss: %" PRIu64 "\n",
229                        info->xbzrle_cache->cache_miss);
230         monitor_printf(mon, "xbzrle cache miss rate: %0.2f\n",
231                        info->xbzrle_cache->cache_miss_rate);
232         monitor_printf(mon, "xbzrle overflow : %" PRIu64 "\n",
233                        info->xbzrle_cache->overflow);
234     }
235
236     if (info->has_x_cpu_throttle_percentage) {
237         monitor_printf(mon, "cpu throttle percentage: %" PRIu64 "\n",
238                        info->x_cpu_throttle_percentage);
239     }
240
241     qapi_free_MigrationInfo(info);
242     qapi_free_MigrationCapabilityStatusList(caps);
243 }
244
245 void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict)
246 {
247     MigrationCapabilityStatusList *caps, *cap;
248
249     caps = qmp_query_migrate_capabilities(NULL);
250
251     if (caps) {
252         monitor_printf(mon, "capabilities: ");
253         for (cap = caps; cap; cap = cap->next) {
254             monitor_printf(mon, "%s: %s ",
255                            MigrationCapability_lookup[cap->value->capability],
256                            cap->value->state ? "on" : "off");
257         }
258         monitor_printf(mon, "\n");
259     }
260
261     qapi_free_MigrationCapabilityStatusList(caps);
262 }
263
264 void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)
265 {
266     MigrationParameters *params;
267
268     params = qmp_query_migrate_parameters(NULL);
269
270     if (params) {
271         monitor_printf(mon, "parameters:");
272         monitor_printf(mon, " %s: %" PRId64,
273             MigrationParameter_lookup[MIGRATION_PARAMETER_COMPRESS_LEVEL],
274             params->compress_level);
275         monitor_printf(mon, " %s: %" PRId64,
276             MigrationParameter_lookup[MIGRATION_PARAMETER_COMPRESS_THREADS],
277             params->compress_threads);
278         monitor_printf(mon, " %s: %" PRId64,
279             MigrationParameter_lookup[MIGRATION_PARAMETER_DECOMPRESS_THREADS],
280             params->decompress_threads);
281         monitor_printf(mon, " %s: %" PRId64,
282             MigrationParameter_lookup[MIGRATION_PARAMETER_X_CPU_THROTTLE_INITIAL],
283             params->x_cpu_throttle_initial);
284         monitor_printf(mon, " %s: %" PRId64,
285             MigrationParameter_lookup[MIGRATION_PARAMETER_X_CPU_THROTTLE_INCREMENT],
286             params->x_cpu_throttle_increment);
287         monitor_printf(mon, "\n");
288     }
289
290     qapi_free_MigrationParameters(params);
291 }
292
293 void hmp_info_migrate_cache_size(Monitor *mon, const QDict *qdict)
294 {
295     monitor_printf(mon, "xbzrel cache size: %" PRId64 " kbytes\n",
296                    qmp_query_migrate_cache_size(NULL) >> 10);
297 }
298
299 void hmp_info_cpus(Monitor *mon, const QDict *qdict)
300 {
301     CpuInfoList *cpu_list, *cpu;
302
303     cpu_list = qmp_query_cpus(NULL);
304
305     for (cpu = cpu_list; cpu; cpu = cpu->next) {
306         int active = ' ';
307
308         if (cpu->value->CPU == monitor_get_cpu_index()) {
309             active = '*';
310         }
311
312         monitor_printf(mon, "%c CPU #%" PRId64 ":", active, cpu->value->CPU);
313
314         if (cpu->value->has_pc) {
315             monitor_printf(mon, " pc=0x%016" PRIx64, cpu->value->pc);
316         }
317         if (cpu->value->has_nip) {
318             monitor_printf(mon, " nip=0x%016" PRIx64, cpu->value->nip);
319         }
320         if (cpu->value->has_npc) {
321             monitor_printf(mon, " npc=0x%016" PRIx64, cpu->value->npc);
322         }
323         if (cpu->value->has_PC) {
324             monitor_printf(mon, " PC=0x%016" PRIx64, cpu->value->PC);
325         }
326
327         if (cpu->value->halted) {
328             monitor_printf(mon, " (halted)");
329         }
330
331         monitor_printf(mon, " thread_id=%" PRId64 "\n", cpu->value->thread_id);
332     }
333
334     qapi_free_CpuInfoList(cpu_list);
335 }
336
337 static void print_block_info(Monitor *mon, BlockInfo *info,
338                              BlockDeviceInfo *inserted, bool verbose)
339 {
340     ImageInfo *image_info;
341
342     assert(!info || !info->has_inserted || info->inserted == inserted);
343
344     if (info) {
345         monitor_printf(mon, "%s", info->device);
346         if (inserted && inserted->has_node_name) {
347             monitor_printf(mon, " (%s)", inserted->node_name);
348         }
349     } else {
350         assert(inserted);
351         monitor_printf(mon, "%s",
352                        inserted->has_node_name
353                        ? inserted->node_name
354                        : "<anonymous>");
355     }
356
357     if (inserted) {
358         monitor_printf(mon, ": %s (%s%s%s)\n",
359                        inserted->file,
360                        inserted->drv,
361                        inserted->ro ? ", read-only" : "",
362                        inserted->encrypted ? ", encrypted" : "");
363     } else {
364         monitor_printf(mon, ": [not inserted]\n");
365     }
366
367     if (info) {
368         if (info->has_io_status && info->io_status != BLOCK_DEVICE_IO_STATUS_OK) {
369             monitor_printf(mon, "    I/O status:       %s\n",
370                            BlockDeviceIoStatus_lookup[info->io_status]);
371         }
372
373         if (info->removable) {
374             monitor_printf(mon, "    Removable device: %slocked, tray %s\n",
375                            info->locked ? "" : "not ",
376                            info->tray_open ? "open" : "closed");
377         }
378     }
379
380
381     if (!inserted) {
382         return;
383     }
384
385     monitor_printf(mon, "    Cache mode:       %s%s%s\n",
386                    inserted->cache->writeback ? "writeback" : "writethrough",
387                    inserted->cache->direct ? ", direct" : "",
388                    inserted->cache->no_flush ? ", ignore flushes" : "");
389
390     if (inserted->has_backing_file) {
391         monitor_printf(mon,
392                        "    Backing file:     %s "
393                        "(chain depth: %" PRId64 ")\n",
394                        inserted->backing_file,
395                        inserted->backing_file_depth);
396     }
397
398     if (inserted->detect_zeroes != BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF) {
399         monitor_printf(mon, "    Detect zeroes:    %s\n",
400                        BlockdevDetectZeroesOptions_lookup[inserted->detect_zeroes]);
401     }
402
403     if (inserted->bps  || inserted->bps_rd  || inserted->bps_wr  ||
404         inserted->iops || inserted->iops_rd || inserted->iops_wr)
405     {
406         monitor_printf(mon, "    I/O throttling:   bps=%" PRId64
407                         " bps_rd=%" PRId64  " bps_wr=%" PRId64
408                         " bps_max=%" PRId64
409                         " bps_rd_max=%" PRId64
410                         " bps_wr_max=%" PRId64
411                         " iops=%" PRId64 " iops_rd=%" PRId64
412                         " iops_wr=%" PRId64
413                         " iops_max=%" PRId64
414                         " iops_rd_max=%" PRId64
415                         " iops_wr_max=%" PRId64
416                         " iops_size=%" PRId64
417                         " group=%s\n",
418                         inserted->bps,
419                         inserted->bps_rd,
420                         inserted->bps_wr,
421                         inserted->bps_max,
422                         inserted->bps_rd_max,
423                         inserted->bps_wr_max,
424                         inserted->iops,
425                         inserted->iops_rd,
426                         inserted->iops_wr,
427                         inserted->iops_max,
428                         inserted->iops_rd_max,
429                         inserted->iops_wr_max,
430                         inserted->iops_size,
431                         inserted->group);
432     }
433
434     if (verbose) {
435         monitor_printf(mon, "\nImages:\n");
436         image_info = inserted->image;
437         while (1) {
438                 bdrv_image_info_dump((fprintf_function)monitor_printf,
439                                      mon, image_info);
440             if (image_info->has_backing_image) {
441                 image_info = image_info->backing_image;
442             } else {
443                 break;
444             }
445         }
446     }
447 }
448
449 void hmp_info_block(Monitor *mon, const QDict *qdict)
450 {
451     BlockInfoList *block_list, *info;
452     BlockDeviceInfoList *blockdev_list, *blockdev;
453     const char *device = qdict_get_try_str(qdict, "device");
454     bool verbose = qdict_get_try_bool(qdict, "verbose", false);
455     bool nodes = qdict_get_try_bool(qdict, "nodes", false);
456     bool printed = false;
457
458     /* Print BlockBackend information */
459     if (!nodes) {
460         block_list = qmp_query_block(NULL);
461     } else {
462         block_list = NULL;
463     }
464
465     for (info = block_list; info; info = info->next) {
466         if (device && strcmp(device, info->value->device)) {
467             continue;
468         }
469
470         if (info != block_list) {
471             monitor_printf(mon, "\n");
472         }
473
474         print_block_info(mon, info->value, info->value->has_inserted
475                                            ? info->value->inserted : NULL,
476                          verbose);
477         printed = true;
478     }
479
480     qapi_free_BlockInfoList(block_list);
481
482     if ((!device && !nodes) || printed) {
483         return;
484     }
485
486     /* Print node information */
487     blockdev_list = qmp_query_named_block_nodes(NULL);
488     for (blockdev = blockdev_list; blockdev; blockdev = blockdev->next) {
489         assert(blockdev->value->has_node_name);
490         if (device && strcmp(device, blockdev->value->node_name)) {
491             continue;
492         }
493
494         if (blockdev != blockdev_list) {
495             monitor_printf(mon, "\n");
496         }
497
498         print_block_info(mon, NULL, blockdev->value, verbose);
499     }
500     qapi_free_BlockDeviceInfoList(blockdev_list);
501 }
502
503 void hmp_info_blockstats(Monitor *mon, const QDict *qdict)
504 {
505     BlockStatsList *stats_list, *stats;
506
507     stats_list = qmp_query_blockstats(false, false, NULL);
508
509     for (stats = stats_list; stats; stats = stats->next) {
510         if (!stats->value->has_device) {
511             continue;
512         }
513
514         monitor_printf(mon, "%s:", stats->value->device);
515         monitor_printf(mon, " rd_bytes=%" PRId64
516                        " wr_bytes=%" PRId64
517                        " rd_operations=%" PRId64
518                        " wr_operations=%" PRId64
519                        " flush_operations=%" PRId64
520                        " wr_total_time_ns=%" PRId64
521                        " rd_total_time_ns=%" PRId64
522                        " flush_total_time_ns=%" PRId64
523                        " rd_merged=%" PRId64
524                        " wr_merged=%" PRId64
525                        " idle_time_ns=%" PRId64
526                        "\n",
527                        stats->value->stats->rd_bytes,
528                        stats->value->stats->wr_bytes,
529                        stats->value->stats->rd_operations,
530                        stats->value->stats->wr_operations,
531                        stats->value->stats->flush_operations,
532                        stats->value->stats->wr_total_time_ns,
533                        stats->value->stats->rd_total_time_ns,
534                        stats->value->stats->flush_total_time_ns,
535                        stats->value->stats->rd_merged,
536                        stats->value->stats->wr_merged,
537                        stats->value->stats->idle_time_ns);
538     }
539
540     qapi_free_BlockStatsList(stats_list);
541 }
542
543 void hmp_info_vnc(Monitor *mon, const QDict *qdict)
544 {
545     VncInfo *info;
546     Error *err = NULL;
547     VncClientInfoList *client;
548
549     info = qmp_query_vnc(&err);
550     if (err) {
551         monitor_printf(mon, "%s\n", error_get_pretty(err));
552         error_free(err);
553         return;
554     }
555
556     if (!info->enabled) {
557         monitor_printf(mon, "Server: disabled\n");
558         goto out;
559     }
560
561     monitor_printf(mon, "Server:\n");
562     if (info->has_host && info->has_service) {
563         monitor_printf(mon, "     address: %s:%s\n", info->host, info->service);
564     }
565     if (info->has_auth) {
566         monitor_printf(mon, "        auth: %s\n", info->auth);
567     }
568
569     if (!info->has_clients || info->clients == NULL) {
570         monitor_printf(mon, "Client: none\n");
571     } else {
572         for (client = info->clients; client; client = client->next) {
573             monitor_printf(mon, "Client:\n");
574             monitor_printf(mon, "     address: %s:%s\n",
575                            client->value->host,
576                            client->value->service);
577             monitor_printf(mon, "  x509_dname: %s\n",
578                            client->value->x509_dname ?
579                            client->value->x509_dname : "none");
580             monitor_printf(mon, "    username: %s\n",
581                            client->value->has_sasl_username ?
582                            client->value->sasl_username : "none");
583         }
584     }
585
586 out:
587     qapi_free_VncInfo(info);
588 }
589
590 #ifdef CONFIG_SPICE
591 void hmp_info_spice(Monitor *mon, const QDict *qdict)
592 {
593     SpiceChannelList *chan;
594     SpiceInfo *info;
595     const char *channel_name;
596     const char * const channel_names[] = {
597         [SPICE_CHANNEL_MAIN] = "main",
598         [SPICE_CHANNEL_DISPLAY] = "display",
599         [SPICE_CHANNEL_INPUTS] = "inputs",
600         [SPICE_CHANNEL_CURSOR] = "cursor",
601         [SPICE_CHANNEL_PLAYBACK] = "playback",
602         [SPICE_CHANNEL_RECORD] = "record",
603         [SPICE_CHANNEL_TUNNEL] = "tunnel",
604         [SPICE_CHANNEL_SMARTCARD] = "smartcard",
605         [SPICE_CHANNEL_USBREDIR] = "usbredir",
606         [SPICE_CHANNEL_PORT] = "port",
607 #if 0
608         /* minimum spice-protocol is 0.12.3, webdav was added in 0.12.7,
609          * no easy way to #ifdef (SPICE_CHANNEL_* is a enum).  Disable
610          * as quick fix for build failures with older versions. */
611         [SPICE_CHANNEL_WEBDAV] = "webdav",
612 #endif
613     };
614
615     info = qmp_query_spice(NULL);
616
617     if (!info->enabled) {
618         monitor_printf(mon, "Server: disabled\n");
619         goto out;
620     }
621
622     monitor_printf(mon, "Server:\n");
623     if (info->has_port) {
624         monitor_printf(mon, "     address: %s:%" PRId64 "\n",
625                        info->host, info->port);
626     }
627     if (info->has_tls_port) {
628         monitor_printf(mon, "     address: %s:%" PRId64 " [tls]\n",
629                        info->host, info->tls_port);
630     }
631     monitor_printf(mon, "    migrated: %s\n",
632                    info->migrated ? "true" : "false");
633     monitor_printf(mon, "        auth: %s\n", info->auth);
634     monitor_printf(mon, "    compiled: %s\n", info->compiled_version);
635     monitor_printf(mon, "  mouse-mode: %s\n",
636                    SpiceQueryMouseMode_lookup[info->mouse_mode]);
637
638     if (!info->has_channels || info->channels == NULL) {
639         monitor_printf(mon, "Channels: none\n");
640     } else {
641         for (chan = info->channels; chan; chan = chan->next) {
642             monitor_printf(mon, "Channel:\n");
643             monitor_printf(mon, "     address: %s:%s%s\n",
644                            chan->value->host, chan->value->port,
645                            chan->value->tls ? " [tls]" : "");
646             monitor_printf(mon, "     session: %" PRId64 "\n",
647                            chan->value->connection_id);
648             monitor_printf(mon, "     channel: %" PRId64 ":%" PRId64 "\n",
649                            chan->value->channel_type, chan->value->channel_id);
650
651             channel_name = "unknown";
652             if (chan->value->channel_type > 0 &&
653                 chan->value->channel_type < ARRAY_SIZE(channel_names) &&
654                 channel_names[chan->value->channel_type]) {
655                 channel_name = channel_names[chan->value->channel_type];
656             }
657
658             monitor_printf(mon, "     channel name: %s\n", channel_name);
659         }
660     }
661
662 out:
663     qapi_free_SpiceInfo(info);
664 }
665 #endif
666
667 void hmp_info_balloon(Monitor *mon, const QDict *qdict)
668 {
669     BalloonInfo *info;
670     Error *err = NULL;
671
672     info = qmp_query_balloon(&err);
673     if (err) {
674         monitor_printf(mon, "%s\n", error_get_pretty(err));
675         error_free(err);
676         return;
677     }
678
679     monitor_printf(mon, "balloon: actual=%" PRId64 "\n", info->actual >> 20);
680
681     qapi_free_BalloonInfo(info);
682 }
683
684 static void hmp_info_pci_device(Monitor *mon, const PciDeviceInfo *dev)
685 {
686     PciMemoryRegionList *region;
687
688     monitor_printf(mon, "  Bus %2" PRId64 ", ", dev->bus);
689     monitor_printf(mon, "device %3" PRId64 ", function %" PRId64 ":\n",
690                    dev->slot, dev->function);
691     monitor_printf(mon, "    ");
692
693     if (dev->class_info->has_desc) {
694         monitor_printf(mon, "%s", dev->class_info->desc);
695     } else {
696         monitor_printf(mon, "Class %04" PRId64, dev->class_info->q_class);
697     }
698
699     monitor_printf(mon, ": PCI device %04" PRIx64 ":%04" PRIx64 "\n",
700                    dev->id->vendor, dev->id->device);
701
702     if (dev->has_irq) {
703         monitor_printf(mon, "      IRQ %" PRId64 ".\n", dev->irq);
704     }
705
706     if (dev->has_pci_bridge) {
707         monitor_printf(mon, "      BUS %" PRId64 ".\n",
708                        dev->pci_bridge->bus->number);
709         monitor_printf(mon, "      secondary bus %" PRId64 ".\n",
710                        dev->pci_bridge->bus->secondary);
711         monitor_printf(mon, "      subordinate bus %" PRId64 ".\n",
712                        dev->pci_bridge->bus->subordinate);
713
714         monitor_printf(mon, "      IO range [0x%04"PRIx64", 0x%04"PRIx64"]\n",
715                        dev->pci_bridge->bus->io_range->base,
716                        dev->pci_bridge->bus->io_range->limit);
717
718         monitor_printf(mon,
719                        "      memory range [0x%08"PRIx64", 0x%08"PRIx64"]\n",
720                        dev->pci_bridge->bus->memory_range->base,
721                        dev->pci_bridge->bus->memory_range->limit);
722
723         monitor_printf(mon, "      prefetchable memory range "
724                        "[0x%08"PRIx64", 0x%08"PRIx64"]\n",
725                        dev->pci_bridge->bus->prefetchable_range->base,
726                        dev->pci_bridge->bus->prefetchable_range->limit);
727     }
728
729     for (region = dev->regions; region; region = region->next) {
730         uint64_t addr, size;
731
732         addr = region->value->address;
733         size = region->value->size;
734
735         monitor_printf(mon, "      BAR%" PRId64 ": ", region->value->bar);
736
737         if (!strcmp(region->value->type, "io")) {
738             monitor_printf(mon, "I/O at 0x%04" PRIx64
739                                 " [0x%04" PRIx64 "].\n",
740                            addr, addr + size - 1);
741         } else {
742             monitor_printf(mon, "%d bit%s memory at 0x%08" PRIx64
743                                " [0x%08" PRIx64 "].\n",
744                            region->value->mem_type_64 ? 64 : 32,
745                            region->value->prefetch ? " prefetchable" : "",
746                            addr, addr + size - 1);
747         }
748     }
749
750     monitor_printf(mon, "      id \"%s\"\n", dev->qdev_id);
751
752     if (dev->has_pci_bridge) {
753         if (dev->pci_bridge->has_devices) {
754             PciDeviceInfoList *cdev;
755             for (cdev = dev->pci_bridge->devices; cdev; cdev = cdev->next) {
756                 hmp_info_pci_device(mon, cdev->value);
757             }
758         }
759     }
760 }
761
762 void hmp_info_pci(Monitor *mon, const QDict *qdict)
763 {
764     PciInfoList *info_list, *info;
765     Error *err = NULL;
766
767     info_list = qmp_query_pci(&err);
768     if (err) {
769         monitor_printf(mon, "PCI devices not supported\n");
770         error_free(err);
771         return;
772     }
773
774     for (info = info_list; info; info = info->next) {
775         PciDeviceInfoList *dev;
776
777         for (dev = info->value->devices; dev; dev = dev->next) {
778             hmp_info_pci_device(mon, dev->value);
779         }
780     }
781
782     qapi_free_PciInfoList(info_list);
783 }
784
785 void hmp_info_block_jobs(Monitor *mon, const QDict *qdict)
786 {
787     BlockJobInfoList *list;
788     Error *err = NULL;
789
790     list = qmp_query_block_jobs(&err);
791     assert(!err);
792
793     if (!list) {
794         monitor_printf(mon, "No active jobs\n");
795         return;
796     }
797
798     while (list) {
799         if (strcmp(list->value->type, "stream") == 0) {
800             monitor_printf(mon, "Streaming device %s: Completed %" PRId64
801                            " of %" PRId64 " bytes, speed limit %" PRId64
802                            " bytes/s\n",
803                            list->value->device,
804                            list->value->offset,
805                            list->value->len,
806                            list->value->speed);
807         } else {
808             monitor_printf(mon, "Type %s, device %s: Completed %" PRId64
809                            " of %" PRId64 " bytes, speed limit %" PRId64
810                            " bytes/s\n",
811                            list->value->type,
812                            list->value->device,
813                            list->value->offset,
814                            list->value->len,
815                            list->value->speed);
816         }
817         list = list->next;
818     }
819
820     qapi_free_BlockJobInfoList(list);
821 }
822
823 void hmp_info_tpm(Monitor *mon, const QDict *qdict)
824 {
825     TPMInfoList *info_list, *info;
826     Error *err = NULL;
827     unsigned int c = 0;
828     TPMPassthroughOptions *tpo;
829
830     info_list = qmp_query_tpm(&err);
831     if (err) {
832         monitor_printf(mon, "TPM device not supported\n");
833         error_free(err);
834         return;
835     }
836
837     if (info_list) {
838         monitor_printf(mon, "TPM device:\n");
839     }
840
841     for (info = info_list; info; info = info->next) {
842         TPMInfo *ti = info->value;
843         monitor_printf(mon, " tpm%d: model=%s\n",
844                        c, TpmModel_lookup[ti->model]);
845
846         monitor_printf(mon, "  \\ %s: type=%s",
847                        ti->id, TpmTypeOptionsKind_lookup[ti->options->type]);
848
849         switch (ti->options->type) {
850         case TPM_TYPE_OPTIONS_KIND_PASSTHROUGH:
851             tpo = ti->options->u.passthrough;
852             monitor_printf(mon, "%s%s%s%s",
853                            tpo->has_path ? ",path=" : "",
854                            tpo->has_path ? tpo->path : "",
855                            tpo->has_cancel_path ? ",cancel-path=" : "",
856                            tpo->has_cancel_path ? tpo->cancel_path : "");
857             break;
858         case TPM_TYPE_OPTIONS_KIND_MAX:
859             break;
860         }
861         monitor_printf(mon, "\n");
862         c++;
863     }
864     qapi_free_TPMInfoList(info_list);
865 }
866
867 void hmp_quit(Monitor *mon, const QDict *qdict)
868 {
869     monitor_suspend(mon);
870     qmp_quit(NULL);
871 }
872
873 void hmp_stop(Monitor *mon, const QDict *qdict)
874 {
875     qmp_stop(NULL);
876 }
877
878 void hmp_system_reset(Monitor *mon, const QDict *qdict)
879 {
880     qmp_system_reset(NULL);
881 }
882
883 void hmp_system_powerdown(Monitor *mon, const QDict *qdict)
884 {
885     qmp_system_powerdown(NULL);
886 }
887
888 void hmp_cpu(Monitor *mon, const QDict *qdict)
889 {
890     int64_t cpu_index;
891
892     /* XXX: drop the monitor_set_cpu() usage when all HMP commands that
893             use it are converted to the QAPI */
894     cpu_index = qdict_get_int(qdict, "index");
895     if (monitor_set_cpu(cpu_index) < 0) {
896         monitor_printf(mon, "invalid CPU index\n");
897     }
898 }
899
900 void hmp_memsave(Monitor *mon, const QDict *qdict)
901 {
902     uint32_t size = qdict_get_int(qdict, "size");
903     const char *filename = qdict_get_str(qdict, "filename");
904     uint64_t addr = qdict_get_int(qdict, "val");
905     Error *err = NULL;
906
907     qmp_memsave(addr, size, filename, true, monitor_get_cpu_index(), &err);
908     hmp_handle_error(mon, &err);
909 }
910
911 void hmp_pmemsave(Monitor *mon, const QDict *qdict)
912 {
913     uint32_t size = qdict_get_int(qdict, "size");
914     const char *filename = qdict_get_str(qdict, "filename");
915     uint64_t addr = qdict_get_int(qdict, "val");
916     Error *err = NULL;
917
918     qmp_pmemsave(addr, size, filename, &err);
919     hmp_handle_error(mon, &err);
920 }
921
922 void hmp_ringbuf_write(Monitor *mon, const QDict *qdict)
923 {
924     const char *chardev = qdict_get_str(qdict, "device");
925     const char *data = qdict_get_str(qdict, "data");
926     Error *err = NULL;
927
928     qmp_ringbuf_write(chardev, data, false, 0, &err);
929
930     hmp_handle_error(mon, &err);
931 }
932
933 void hmp_ringbuf_read(Monitor *mon, const QDict *qdict)
934 {
935     uint32_t size = qdict_get_int(qdict, "size");
936     const char *chardev = qdict_get_str(qdict, "device");
937     char *data;
938     Error *err = NULL;
939     int i;
940
941     data = qmp_ringbuf_read(chardev, size, false, 0, &err);
942     if (err) {
943         monitor_printf(mon, "%s\n", error_get_pretty(err));
944         error_free(err);
945         return;
946     }
947
948     for (i = 0; data[i]; i++) {
949         unsigned char ch = data[i];
950
951         if (ch == '\\') {
952             monitor_printf(mon, "\\\\");
953         } else if ((ch < 0x20 && ch != '\n' && ch != '\t') || ch == 0x7F) {
954             monitor_printf(mon, "\\u%04X", ch);
955         } else {
956             monitor_printf(mon, "%c", ch);
957         }
958
959     }
960     monitor_printf(mon, "\n");
961     g_free(data);
962 }
963
964 static void hmp_cont_cb(void *opaque, int err)
965 {
966     if (!err) {
967         qmp_cont(NULL);
968     }
969 }
970
971 static bool key_is_missing(const BlockInfo *bdev)
972 {
973     return (bdev->inserted && bdev->inserted->encryption_key_missing);
974 }
975
976 void hmp_cont(Monitor *mon, const QDict *qdict)
977 {
978     BlockInfoList *bdev_list, *bdev;
979     Error *err = NULL;
980
981     bdev_list = qmp_query_block(NULL);
982     for (bdev = bdev_list; bdev; bdev = bdev->next) {
983         if (key_is_missing(bdev->value)) {
984             monitor_read_block_device_key(mon, bdev->value->device,
985                                           hmp_cont_cb, NULL);
986             goto out;
987         }
988     }
989
990     qmp_cont(&err);
991     hmp_handle_error(mon, &err);
992
993 out:
994     qapi_free_BlockInfoList(bdev_list);
995 }
996
997 void hmp_system_wakeup(Monitor *mon, const QDict *qdict)
998 {
999     qmp_system_wakeup(NULL);
1000 }
1001
1002 void hmp_nmi(Monitor *mon, const QDict *qdict)
1003 {
1004     Error *err = NULL;
1005
1006     qmp_inject_nmi(&err);
1007     hmp_handle_error(mon, &err);
1008 }
1009
1010 void hmp_set_link(Monitor *mon, const QDict *qdict)
1011 {
1012     const char *name = qdict_get_str(qdict, "name");
1013     bool up = qdict_get_bool(qdict, "up");
1014     Error *err = NULL;
1015
1016     qmp_set_link(name, up, &err);
1017     hmp_handle_error(mon, &err);
1018 }
1019
1020 void hmp_block_passwd(Monitor *mon, const QDict *qdict)
1021 {
1022     const char *device = qdict_get_str(qdict, "device");
1023     const char *password = qdict_get_str(qdict, "password");
1024     Error *err = NULL;
1025
1026     qmp_block_passwd(true, device, false, NULL, password, &err);
1027     hmp_handle_error(mon, &err);
1028 }
1029
1030 void hmp_balloon(Monitor *mon, const QDict *qdict)
1031 {
1032     int64_t value = qdict_get_int(qdict, "value");
1033     Error *err = NULL;
1034
1035     qmp_balloon(value, &err);
1036     if (err) {
1037         monitor_printf(mon, "balloon: %s\n", error_get_pretty(err));
1038         error_free(err);
1039     }
1040 }
1041
1042 void hmp_block_resize(Monitor *mon, const QDict *qdict)
1043 {
1044     const char *device = qdict_get_str(qdict, "device");
1045     int64_t size = qdict_get_int(qdict, "size");
1046     Error *err = NULL;
1047
1048     qmp_block_resize(true, device, false, NULL, size, &err);
1049     hmp_handle_error(mon, &err);
1050 }
1051
1052 void hmp_drive_mirror(Monitor *mon, const QDict *qdict)
1053 {
1054     const char *device = qdict_get_str(qdict, "device");
1055     const char *filename = qdict_get_str(qdict, "target");
1056     const char *format = qdict_get_try_str(qdict, "format");
1057     bool reuse = qdict_get_try_bool(qdict, "reuse", false);
1058     bool full = qdict_get_try_bool(qdict, "full", false);
1059     enum NewImageMode mode;
1060     Error *err = NULL;
1061
1062     if (!filename) {
1063         error_setg(&err, QERR_MISSING_PARAMETER, "target");
1064         hmp_handle_error(mon, &err);
1065         return;
1066     }
1067
1068     if (reuse) {
1069         mode = NEW_IMAGE_MODE_EXISTING;
1070     } else {
1071         mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS;
1072     }
1073
1074     qmp_drive_mirror(device, filename, !!format, format,
1075                      false, NULL, false, NULL,
1076                      full ? MIRROR_SYNC_MODE_FULL : MIRROR_SYNC_MODE_TOP,
1077                      true, mode, false, 0, false, 0, false, 0,
1078                      false, 0, false, 0, false, true, &err);
1079     hmp_handle_error(mon, &err);
1080 }
1081
1082 void hmp_drive_backup(Monitor *mon, const QDict *qdict)
1083 {
1084     const char *device = qdict_get_str(qdict, "device");
1085     const char *filename = qdict_get_str(qdict, "target");
1086     const char *format = qdict_get_try_str(qdict, "format");
1087     bool reuse = qdict_get_try_bool(qdict, "reuse", false);
1088     bool full = qdict_get_try_bool(qdict, "full", false);
1089     enum NewImageMode mode;
1090     Error *err = NULL;
1091
1092     if (!filename) {
1093         error_setg(&err, QERR_MISSING_PARAMETER, "target");
1094         hmp_handle_error(mon, &err);
1095         return;
1096     }
1097
1098     if (reuse) {
1099         mode = NEW_IMAGE_MODE_EXISTING;
1100     } else {
1101         mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS;
1102     }
1103
1104     qmp_drive_backup(device, filename, !!format, format,
1105                      full ? MIRROR_SYNC_MODE_FULL : MIRROR_SYNC_MODE_TOP,
1106                      true, mode, false, 0, false, NULL,
1107                      false, 0, false, 0, &err);
1108     hmp_handle_error(mon, &err);
1109 }
1110
1111 void hmp_snapshot_blkdev(Monitor *mon, const QDict *qdict)
1112 {
1113     const char *device = qdict_get_str(qdict, "device");
1114     const char *filename = qdict_get_try_str(qdict, "snapshot-file");
1115     const char *format = qdict_get_try_str(qdict, "format");
1116     bool reuse = qdict_get_try_bool(qdict, "reuse", false);
1117     enum NewImageMode mode;
1118     Error *err = NULL;
1119
1120     if (!filename) {
1121         /* In the future, if 'snapshot-file' is not specified, the snapshot
1122            will be taken internally. Today it's actually required. */
1123         error_setg(&err, QERR_MISSING_PARAMETER, "snapshot-file");
1124         hmp_handle_error(mon, &err);
1125         return;
1126     }
1127
1128     mode = reuse ? NEW_IMAGE_MODE_EXISTING : NEW_IMAGE_MODE_ABSOLUTE_PATHS;
1129     qmp_blockdev_snapshot_sync(true, device, false, NULL,
1130                                filename, false, NULL,
1131                                !!format, format,
1132                                true, mode, &err);
1133     hmp_handle_error(mon, &err);
1134 }
1135
1136 void hmp_snapshot_blkdev_internal(Monitor *mon, const QDict *qdict)
1137 {
1138     const char *device = qdict_get_str(qdict, "device");
1139     const char *name = qdict_get_str(qdict, "name");
1140     Error *err = NULL;
1141
1142     qmp_blockdev_snapshot_internal_sync(device, name, &err);
1143     hmp_handle_error(mon, &err);
1144 }
1145
1146 void hmp_snapshot_delete_blkdev_internal(Monitor *mon, const QDict *qdict)
1147 {
1148     const char *device = qdict_get_str(qdict, "device");
1149     const char *name = qdict_get_str(qdict, "name");
1150     const char *id = qdict_get_try_str(qdict, "id");
1151     Error *err = NULL;
1152
1153     qmp_blockdev_snapshot_delete_internal_sync(device, !!id, id,
1154                                                true, name, &err);
1155     hmp_handle_error(mon, &err);
1156 }
1157
1158 void hmp_migrate_cancel(Monitor *mon, const QDict *qdict)
1159 {
1160     qmp_migrate_cancel(NULL);
1161 }
1162
1163 void hmp_migrate_incoming(Monitor *mon, const QDict *qdict)
1164 {
1165     Error *err = NULL;
1166     const char *uri = qdict_get_str(qdict, "uri");
1167
1168     qmp_migrate_incoming(uri, &err);
1169
1170     hmp_handle_error(mon, &err);
1171 }
1172
1173 void hmp_migrate_set_downtime(Monitor *mon, const QDict *qdict)
1174 {
1175     double value = qdict_get_double(qdict, "value");
1176     qmp_migrate_set_downtime(value, NULL);
1177 }
1178
1179 void hmp_migrate_set_cache_size(Monitor *mon, const QDict *qdict)
1180 {
1181     int64_t value = qdict_get_int(qdict, "value");
1182     Error *err = NULL;
1183
1184     qmp_migrate_set_cache_size(value, &err);
1185     if (err) {
1186         monitor_printf(mon, "%s\n", error_get_pretty(err));
1187         error_free(err);
1188         return;
1189     }
1190 }
1191
1192 void hmp_migrate_set_speed(Monitor *mon, const QDict *qdict)
1193 {
1194     int64_t value = qdict_get_int(qdict, "value");
1195     qmp_migrate_set_speed(value, NULL);
1196 }
1197
1198 void hmp_migrate_set_capability(Monitor *mon, const QDict *qdict)
1199 {
1200     const char *cap = qdict_get_str(qdict, "capability");
1201     bool state = qdict_get_bool(qdict, "state");
1202     Error *err = NULL;
1203     MigrationCapabilityStatusList *caps = g_malloc0(sizeof(*caps));
1204     int i;
1205
1206     for (i = 0; i < MIGRATION_CAPABILITY_MAX; i++) {
1207         if (strcmp(cap, MigrationCapability_lookup[i]) == 0) {
1208             caps->value = g_malloc0(sizeof(*caps->value));
1209             caps->value->capability = i;
1210             caps->value->state = state;
1211             caps->next = NULL;
1212             qmp_migrate_set_capabilities(caps, &err);
1213             break;
1214         }
1215     }
1216
1217     if (i == MIGRATION_CAPABILITY_MAX) {
1218         error_setg(&err, QERR_INVALID_PARAMETER, cap);
1219     }
1220
1221     qapi_free_MigrationCapabilityStatusList(caps);
1222
1223     if (err) {
1224         monitor_printf(mon, "migrate_set_capability: %s\n",
1225                        error_get_pretty(err));
1226         error_free(err);
1227     }
1228 }
1229
1230 void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
1231 {
1232     const char *param = qdict_get_str(qdict, "parameter");
1233     int value = qdict_get_int(qdict, "value");
1234     Error *err = NULL;
1235     bool has_compress_level = false;
1236     bool has_compress_threads = false;
1237     bool has_decompress_threads = false;
1238     bool has_x_cpu_throttle_initial = false;
1239     bool has_x_cpu_throttle_increment = false;
1240     int i;
1241
1242     for (i = 0; i < MIGRATION_PARAMETER_MAX; i++) {
1243         if (strcmp(param, MigrationParameter_lookup[i]) == 0) {
1244             switch (i) {
1245             case MIGRATION_PARAMETER_COMPRESS_LEVEL:
1246                 has_compress_level = true;
1247                 break;
1248             case MIGRATION_PARAMETER_COMPRESS_THREADS:
1249                 has_compress_threads = true;
1250                 break;
1251             case MIGRATION_PARAMETER_DECOMPRESS_THREADS:
1252                 has_decompress_threads = true;
1253                 break;
1254             case MIGRATION_PARAMETER_X_CPU_THROTTLE_INITIAL:
1255                 has_x_cpu_throttle_initial = true;
1256                 break;
1257             case MIGRATION_PARAMETER_X_CPU_THROTTLE_INCREMENT:
1258                 has_x_cpu_throttle_increment = true;
1259                 break;
1260             }
1261             qmp_migrate_set_parameters(has_compress_level, value,
1262                                        has_compress_threads, value,
1263                                        has_decompress_threads, value,
1264                                        has_x_cpu_throttle_initial, value,
1265                                        has_x_cpu_throttle_increment, value,
1266                                        &err);
1267             break;
1268         }
1269     }
1270
1271     if (i == MIGRATION_PARAMETER_MAX) {
1272         error_setg(&err, QERR_INVALID_PARAMETER, param);
1273     }
1274
1275     if (err) {
1276         monitor_printf(mon, "migrate_set_parameter: %s\n",
1277                        error_get_pretty(err));
1278         error_free(err);
1279     }
1280 }
1281
1282 void hmp_client_migrate_info(Monitor *mon, const QDict *qdict)
1283 {
1284     Error *err = NULL;
1285     const char *protocol = qdict_get_str(qdict, "protocol");
1286     const char *hostname = qdict_get_str(qdict, "hostname");
1287     bool has_port        = qdict_haskey(qdict, "port");
1288     int port             = qdict_get_try_int(qdict, "port", -1);
1289     bool has_tls_port    = qdict_haskey(qdict, "tls-port");
1290     int tls_port         = qdict_get_try_int(qdict, "tls-port", -1);
1291     const char *cert_subject = qdict_get_try_str(qdict, "cert-subject");
1292
1293     qmp_client_migrate_info(protocol, hostname,
1294                             has_port, port, has_tls_port, tls_port,
1295                             !!cert_subject, cert_subject, &err);
1296     hmp_handle_error(mon, &err);
1297 }
1298
1299 void hmp_migrate_start_postcopy(Monitor *mon, const QDict *qdict)
1300 {
1301     Error *err = NULL;
1302     qmp_migrate_start_postcopy(&err);
1303     hmp_handle_error(mon, &err);
1304 }
1305
1306 void hmp_set_password(Monitor *mon, const QDict *qdict)
1307 {
1308     const char *protocol  = qdict_get_str(qdict, "protocol");
1309     const char *password  = qdict_get_str(qdict, "password");
1310     const char *connected = qdict_get_try_str(qdict, "connected");
1311     Error *err = NULL;
1312
1313     qmp_set_password(protocol, password, !!connected, connected, &err);
1314     hmp_handle_error(mon, &err);
1315 }
1316
1317 void hmp_expire_password(Monitor *mon, const QDict *qdict)
1318 {
1319     const char *protocol  = qdict_get_str(qdict, "protocol");
1320     const char *whenstr = qdict_get_str(qdict, "time");
1321     Error *err = NULL;
1322
1323     qmp_expire_password(protocol, whenstr, &err);
1324     hmp_handle_error(mon, &err);
1325 }
1326
1327 void hmp_eject(Monitor *mon, const QDict *qdict)
1328 {
1329     bool force = qdict_get_try_bool(qdict, "force", false);
1330     const char *device = qdict_get_str(qdict, "device");
1331     Error *err = NULL;
1332
1333     qmp_eject(device, true, force, &err);
1334     hmp_handle_error(mon, &err);
1335 }
1336
1337 static void hmp_change_read_arg(void *opaque, const char *password,
1338                                 void *readline_opaque)
1339 {
1340     qmp_change_vnc_password(password, NULL);
1341     monitor_read_command(opaque, 1);
1342 }
1343
1344 void hmp_change(Monitor *mon, const QDict *qdict)
1345 {
1346     const char *device = qdict_get_str(qdict, "device");
1347     const char *target = qdict_get_str(qdict, "target");
1348     const char *arg = qdict_get_try_str(qdict, "arg");
1349     const char *read_only = qdict_get_try_str(qdict, "read-only-mode");
1350     BlockdevChangeReadOnlyMode read_only_mode = 0;
1351     Error *err = NULL;
1352
1353     if (strcmp(device, "vnc") == 0) {
1354         if (read_only) {
1355             monitor_printf(mon,
1356                            "Parameter 'read-only-mode' is invalid for VNC\n");
1357             return;
1358         }
1359         if (strcmp(target, "passwd") == 0 ||
1360             strcmp(target, "password") == 0) {
1361             if (!arg) {
1362                 monitor_read_password(mon, hmp_change_read_arg, NULL);
1363                 return;
1364             }
1365         }
1366         qmp_change("vnc", target, !!arg, arg, &err);
1367     } else {
1368         if (read_only) {
1369             read_only_mode =
1370                 qapi_enum_parse(BlockdevChangeReadOnlyMode_lookup,
1371                                 read_only, BLOCKDEV_CHANGE_READ_ONLY_MODE_MAX,
1372                                 BLOCKDEV_CHANGE_READ_ONLY_MODE_RETAIN, &err);
1373             if (err) {
1374                 hmp_handle_error(mon, &err);
1375                 return;
1376             }
1377         }
1378
1379         qmp_blockdev_change_medium(device, target, !!arg, arg,
1380                                    !!read_only, read_only_mode, &err);
1381         if (err &&
1382             error_get_class(err) == ERROR_CLASS_DEVICE_ENCRYPTED) {
1383             error_free(err);
1384             monitor_read_block_device_key(mon, device, NULL, NULL);
1385             return;
1386         }
1387     }
1388
1389     hmp_handle_error(mon, &err);
1390 }
1391
1392 void hmp_block_set_io_throttle(Monitor *mon, const QDict *qdict)
1393 {
1394     Error *err = NULL;
1395
1396     qmp_block_set_io_throttle(qdict_get_str(qdict, "device"),
1397                               qdict_get_int(qdict, "bps"),
1398                               qdict_get_int(qdict, "bps_rd"),
1399                               qdict_get_int(qdict, "bps_wr"),
1400                               qdict_get_int(qdict, "iops"),
1401                               qdict_get_int(qdict, "iops_rd"),
1402                               qdict_get_int(qdict, "iops_wr"),
1403                               false, /* no burst max via HMP */
1404                               0,
1405                               false,
1406                               0,
1407                               false,
1408                               0,
1409                               false,
1410                               0,
1411                               false,
1412                               0,
1413                               false,
1414                               0,
1415                               false, /* No default I/O size */
1416                               0,
1417                               false,
1418                               NULL, &err);
1419     hmp_handle_error(mon, &err);
1420 }
1421
1422 void hmp_block_stream(Monitor *mon, const QDict *qdict)
1423 {
1424     Error *error = NULL;
1425     const char *device = qdict_get_str(qdict, "device");
1426     const char *base = qdict_get_try_str(qdict, "base");
1427     int64_t speed = qdict_get_try_int(qdict, "speed", 0);
1428
1429     qmp_block_stream(device, base != NULL, base, false, NULL,
1430                      qdict_haskey(qdict, "speed"), speed,
1431                      true, BLOCKDEV_ON_ERROR_REPORT, &error);
1432
1433     hmp_handle_error(mon, &error);
1434 }
1435
1436 void hmp_block_job_set_speed(Monitor *mon, const QDict *qdict)
1437 {
1438     Error *error = NULL;
1439     const char *device = qdict_get_str(qdict, "device");
1440     int64_t value = qdict_get_int(qdict, "speed");
1441
1442     qmp_block_job_set_speed(device, value, &error);
1443
1444     hmp_handle_error(mon, &error);
1445 }
1446
1447 void hmp_block_job_cancel(Monitor *mon, const QDict *qdict)
1448 {
1449     Error *error = NULL;
1450     const char *device = qdict_get_str(qdict, "device");
1451     bool force = qdict_get_try_bool(qdict, "force", false);
1452
1453     qmp_block_job_cancel(device, true, force, &error);
1454
1455     hmp_handle_error(mon, &error);
1456 }
1457
1458 void hmp_block_job_pause(Monitor *mon, const QDict *qdict)
1459 {
1460     Error *error = NULL;
1461     const char *device = qdict_get_str(qdict, "device");
1462
1463     qmp_block_job_pause(device, &error);
1464
1465     hmp_handle_error(mon, &error);
1466 }
1467
1468 void hmp_block_job_resume(Monitor *mon, const QDict *qdict)
1469 {
1470     Error *error = NULL;
1471     const char *device = qdict_get_str(qdict, "device");
1472
1473     qmp_block_job_resume(device, &error);
1474
1475     hmp_handle_error(mon, &error);
1476 }
1477
1478 void hmp_block_job_complete(Monitor *mon, const QDict *qdict)
1479 {
1480     Error *error = NULL;
1481     const char *device = qdict_get_str(qdict, "device");
1482
1483     qmp_block_job_complete(device, &error);
1484
1485     hmp_handle_error(mon, &error);
1486 }
1487
1488 typedef struct HMPMigrationStatus
1489 {
1490     QEMUTimer *timer;
1491     Monitor *mon;
1492     bool is_block_migration;
1493 } HMPMigrationStatus;
1494
1495 static void hmp_migrate_status_cb(void *opaque)
1496 {
1497     HMPMigrationStatus *status = opaque;
1498     MigrationInfo *info;
1499
1500     info = qmp_query_migrate(NULL);
1501     if (!info->has_status || info->status == MIGRATION_STATUS_ACTIVE ||
1502         info->status == MIGRATION_STATUS_SETUP) {
1503         if (info->has_disk) {
1504             int progress;
1505
1506             if (info->disk->remaining) {
1507                 progress = info->disk->transferred * 100 / info->disk->total;
1508             } else {
1509                 progress = 100;
1510             }
1511
1512             monitor_printf(status->mon, "Completed %d %%\r", progress);
1513             monitor_flush(status->mon);
1514         }
1515
1516         timer_mod(status->timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + 1000);
1517     } else {
1518         if (status->is_block_migration) {
1519             monitor_printf(status->mon, "\n");
1520         }
1521         monitor_resume(status->mon);
1522         timer_del(status->timer);
1523         g_free(status);
1524     }
1525
1526     qapi_free_MigrationInfo(info);
1527 }
1528
1529 void hmp_migrate(Monitor *mon, const QDict *qdict)
1530 {
1531     bool detach = qdict_get_try_bool(qdict, "detach", false);
1532     bool blk = qdict_get_try_bool(qdict, "blk", false);
1533     bool inc = qdict_get_try_bool(qdict, "inc", false);
1534     const char *uri = qdict_get_str(qdict, "uri");
1535     Error *err = NULL;
1536
1537     qmp_migrate(uri, !!blk, blk, !!inc, inc, false, false, &err);
1538     if (err) {
1539         monitor_printf(mon, "migrate: %s\n", error_get_pretty(err));
1540         error_free(err);
1541         return;
1542     }
1543
1544     if (!detach) {
1545         HMPMigrationStatus *status;
1546
1547         if (monitor_suspend(mon) < 0) {
1548             monitor_printf(mon, "terminal does not allow synchronous "
1549                            "migration, continuing detached\n");
1550             return;
1551         }
1552
1553         status = g_malloc0(sizeof(*status));
1554         status->mon = mon;
1555         status->is_block_migration = blk || inc;
1556         status->timer = timer_new_ms(QEMU_CLOCK_REALTIME, hmp_migrate_status_cb,
1557                                           status);
1558         timer_mod(status->timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME));
1559     }
1560 }
1561
1562 void hmp_device_add(Monitor *mon, const QDict *qdict)
1563 {
1564     Error *err = NULL;
1565
1566     qmp_device_add((QDict *)qdict, NULL, &err);
1567     hmp_handle_error(mon, &err);
1568 }
1569
1570 void hmp_device_del(Monitor *mon, const QDict *qdict)
1571 {
1572     const char *id = qdict_get_str(qdict, "id");
1573     Error *err = NULL;
1574
1575     qmp_device_del(id, &err);
1576     hmp_handle_error(mon, &err);
1577 }
1578
1579 void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict)
1580 {
1581     Error *err = NULL;
1582     bool paging = qdict_get_try_bool(qdict, "paging", false);
1583     bool zlib = qdict_get_try_bool(qdict, "zlib", false);
1584     bool lzo = qdict_get_try_bool(qdict, "lzo", false);
1585     bool snappy = qdict_get_try_bool(qdict, "snappy", false);
1586     const char *file = qdict_get_str(qdict, "filename");
1587     bool has_begin = qdict_haskey(qdict, "begin");
1588     bool has_length = qdict_haskey(qdict, "length");
1589     int64_t begin = 0;
1590     int64_t length = 0;
1591     enum DumpGuestMemoryFormat dump_format = DUMP_GUEST_MEMORY_FORMAT_ELF;
1592     char *prot;
1593
1594     if (zlib + lzo + snappy > 1) {
1595         error_setg(&err, "only one of '-z|-l|-s' can be set");
1596         hmp_handle_error(mon, &err);
1597         return;
1598     }
1599
1600     if (zlib) {
1601         dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_ZLIB;
1602     }
1603
1604     if (lzo) {
1605         dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_LZO;
1606     }
1607
1608     if (snappy) {
1609         dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_SNAPPY;
1610     }
1611
1612     if (has_begin) {
1613         begin = qdict_get_int(qdict, "begin");
1614     }
1615     if (has_length) {
1616         length = qdict_get_int(qdict, "length");
1617     }
1618
1619     prot = g_strconcat("file:", file, NULL);
1620
1621     qmp_dump_guest_memory(paging, prot, has_begin, begin, has_length, length,
1622                           true, dump_format, &err);
1623     hmp_handle_error(mon, &err);
1624     g_free(prot);
1625 }
1626
1627 void hmp_netdev_add(Monitor *mon, const QDict *qdict)
1628 {
1629     Error *err = NULL;
1630     QemuOpts *opts;
1631
1632     opts = qemu_opts_from_qdict(qemu_find_opts("netdev"), qdict, &err);
1633     if (err) {
1634         goto out;
1635     }
1636
1637     netdev_add(opts, &err);
1638     if (err) {
1639         qemu_opts_del(opts);
1640     }
1641
1642 out:
1643     hmp_handle_error(mon, &err);
1644 }
1645
1646 void hmp_netdev_del(Monitor *mon, const QDict *qdict)
1647 {
1648     const char *id = qdict_get_str(qdict, "id");
1649     Error *err = NULL;
1650
1651     qmp_netdev_del(id, &err);
1652     hmp_handle_error(mon, &err);
1653 }
1654
1655 void hmp_object_add(Monitor *mon, const QDict *qdict)
1656 {
1657     Error *err = NULL;
1658     Error *err_end = NULL;
1659     QemuOpts *opts;
1660     char *type = NULL;
1661     char *id = NULL;
1662     void *dummy = NULL;
1663     OptsVisitor *ov;
1664     QDict *pdict;
1665
1666     opts = qemu_opts_from_qdict(qemu_find_opts("object"), qdict, &err);
1667     if (err) {
1668         goto out;
1669     }
1670
1671     ov = opts_visitor_new(opts);
1672     pdict = qdict_clone_shallow(qdict);
1673
1674     visit_start_struct(opts_get_visitor(ov), &dummy, NULL, NULL, 0, &err);
1675     if (err) {
1676         goto out_clean;
1677     }
1678
1679     qdict_del(pdict, "qom-type");
1680     visit_type_str(opts_get_visitor(ov), &type, "qom-type", &err);
1681     if (err) {
1682         goto out_end;
1683     }
1684
1685     qdict_del(pdict, "id");
1686     visit_type_str(opts_get_visitor(ov), &id, "id", &err);
1687     if (err) {
1688         goto out_end;
1689     }
1690
1691     object_add(type, id, pdict, opts_get_visitor(ov), &err);
1692
1693 out_end:
1694     visit_end_struct(opts_get_visitor(ov), &err_end);
1695     if (!err && err_end) {
1696         qmp_object_del(id, NULL);
1697     }
1698     error_propagate(&err, err_end);
1699 out_clean:
1700     opts_visitor_cleanup(ov);
1701
1702     QDECREF(pdict);
1703     qemu_opts_del(opts);
1704     g_free(id);
1705     g_free(type);
1706     g_free(dummy);
1707
1708 out:
1709     hmp_handle_error(mon, &err);
1710 }
1711
1712 void hmp_getfd(Monitor *mon, const QDict *qdict)
1713 {
1714     const char *fdname = qdict_get_str(qdict, "fdname");
1715     Error *err = NULL;
1716
1717     qmp_getfd(fdname, &err);
1718     hmp_handle_error(mon, &err);
1719 }
1720
1721 void hmp_closefd(Monitor *mon, const QDict *qdict)
1722 {
1723     const char *fdname = qdict_get_str(qdict, "fdname");
1724     Error *err = NULL;
1725
1726     qmp_closefd(fdname, &err);
1727     hmp_handle_error(mon, &err);
1728 }
1729
1730 void hmp_sendkey(Monitor *mon, const QDict *qdict)
1731 {
1732     const char *keys = qdict_get_str(qdict, "keys");
1733     KeyValueList *keylist, *head = NULL, *tmp = NULL;
1734     int has_hold_time = qdict_haskey(qdict, "hold-time");
1735     int hold_time = qdict_get_try_int(qdict, "hold-time", -1);
1736     Error *err = NULL;
1737     char keyname_buf[16];
1738     char *separator;
1739     int keyname_len;
1740
1741     while (1) {
1742         separator = strchr(keys, '-');
1743         keyname_len = separator ? separator - keys : strlen(keys);
1744         pstrcpy(keyname_buf, sizeof(keyname_buf), keys);
1745
1746         /* Be compatible with old interface, convert user inputted "<" */
1747         if (!strncmp(keyname_buf, "<", 1) && keyname_len == 1) {
1748             pstrcpy(keyname_buf, sizeof(keyname_buf), "less");
1749             keyname_len = 4;
1750         }
1751         keyname_buf[keyname_len] = 0;
1752
1753         keylist = g_malloc0(sizeof(*keylist));
1754         keylist->value = g_malloc0(sizeof(*keylist->value));
1755
1756         if (!head) {
1757             head = keylist;
1758         }
1759         if (tmp) {
1760             tmp->next = keylist;
1761         }
1762         tmp = keylist;
1763
1764         if (strstart(keyname_buf, "0x", NULL)) {
1765             char *endp;
1766             int value = strtoul(keyname_buf, &endp, 0);
1767             if (*endp != '\0') {
1768                 goto err_out;
1769             }
1770             keylist->value->type = KEY_VALUE_KIND_NUMBER;
1771             keylist->value->u.number = value;
1772         } else {
1773             int idx = index_from_key(keyname_buf);
1774             if (idx == Q_KEY_CODE_MAX) {
1775                 goto err_out;
1776             }
1777             keylist->value->type = KEY_VALUE_KIND_QCODE;
1778             keylist->value->u.qcode = idx;
1779         }
1780
1781         if (!separator) {
1782             break;
1783         }
1784         keys = separator + 1;
1785     }
1786
1787     qmp_send_key(head, has_hold_time, hold_time, &err);
1788     hmp_handle_error(mon, &err);
1789
1790 out:
1791     qapi_free_KeyValueList(head);
1792     return;
1793
1794 err_out:
1795     monitor_printf(mon, "invalid parameter: %s\n", keyname_buf);
1796     goto out;
1797 }
1798
1799 void hmp_screendump(Monitor *mon, const QDict *qdict)
1800 {
1801     const char *filename = qdict_get_str(qdict, "filename");
1802     Error *err = NULL;
1803
1804     qmp_screendump(filename, &err);
1805     hmp_handle_error(mon, &err);
1806 }
1807
1808 void hmp_nbd_server_start(Monitor *mon, const QDict *qdict)
1809 {
1810     const char *uri = qdict_get_str(qdict, "uri");
1811     bool writable = qdict_get_try_bool(qdict, "writable", false);
1812     bool all = qdict_get_try_bool(qdict, "all", false);
1813     Error *local_err = NULL;
1814     BlockInfoList *block_list, *info;
1815     SocketAddress *addr;
1816
1817     if (writable && !all) {
1818         error_setg(&local_err, "-w only valid together with -a");
1819         goto exit;
1820     }
1821
1822     /* First check if the address is valid and start the server.  */
1823     addr = socket_parse(uri, &local_err);
1824     if (local_err != NULL) {
1825         goto exit;
1826     }
1827
1828     qmp_nbd_server_start(addr, &local_err);
1829     qapi_free_SocketAddress(addr);
1830     if (local_err != NULL) {
1831         goto exit;
1832     }
1833
1834     if (!all) {
1835         return;
1836     }
1837
1838     /* Then try adding all block devices.  If one fails, close all and
1839      * exit.
1840      */
1841     block_list = qmp_query_block(NULL);
1842
1843     for (info = block_list; info; info = info->next) {
1844         if (!info->value->has_inserted) {
1845             continue;
1846         }
1847
1848         qmp_nbd_server_add(info->value->device, true, writable, &local_err);
1849
1850         if (local_err != NULL) {
1851             qmp_nbd_server_stop(NULL);
1852             break;
1853         }
1854     }
1855
1856     qapi_free_BlockInfoList(block_list);
1857
1858 exit:
1859     hmp_handle_error(mon, &local_err);
1860 }
1861
1862 void hmp_nbd_server_add(Monitor *mon, const QDict *qdict)
1863 {
1864     const char *device = qdict_get_str(qdict, "device");
1865     bool writable = qdict_get_try_bool(qdict, "writable", false);
1866     Error *local_err = NULL;
1867
1868     qmp_nbd_server_add(device, true, writable, &local_err);
1869
1870     if (local_err != NULL) {
1871         hmp_handle_error(mon, &local_err);
1872     }
1873 }
1874
1875 void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict)
1876 {
1877     Error *err = NULL;
1878
1879     qmp_nbd_server_stop(&err);
1880     hmp_handle_error(mon, &err);
1881 }
1882
1883 void hmp_cpu_add(Monitor *mon, const QDict *qdict)
1884 {
1885     int cpuid;
1886     Error *err = NULL;
1887
1888     cpuid = qdict_get_int(qdict, "id");
1889     qmp_cpu_add(cpuid, &err);
1890     hmp_handle_error(mon, &err);
1891 }
1892
1893 void hmp_chardev_add(Monitor *mon, const QDict *qdict)
1894 {
1895     const char *args = qdict_get_str(qdict, "args");
1896     Error *err = NULL;
1897     QemuOpts *opts;
1898
1899     opts = qemu_opts_parse_noisily(qemu_find_opts("chardev"), args, true);
1900     if (opts == NULL) {
1901         error_setg(&err, "Parsing chardev args failed");
1902     } else {
1903         qemu_chr_new_from_opts(opts, NULL, &err);
1904     }
1905     hmp_handle_error(mon, &err);
1906 }
1907
1908 void hmp_chardev_remove(Monitor *mon, const QDict *qdict)
1909 {
1910     Error *local_err = NULL;
1911
1912     qmp_chardev_remove(qdict_get_str(qdict, "id"), &local_err);
1913     hmp_handle_error(mon, &local_err);
1914 }
1915
1916 void hmp_qemu_io(Monitor *mon, const QDict *qdict)
1917 {
1918     BlockBackend *blk;
1919     const char* device = qdict_get_str(qdict, "device");
1920     const char* command = qdict_get_str(qdict, "command");
1921     Error *err = NULL;
1922
1923     blk = blk_by_name(device);
1924     if (blk) {
1925         qemuio_command(blk, command);
1926     } else {
1927         error_set(&err, ERROR_CLASS_DEVICE_NOT_FOUND,
1928                   "Device '%s' not found", device);
1929     }
1930
1931     hmp_handle_error(mon, &err);
1932 }
1933
1934 void hmp_object_del(Monitor *mon, const QDict *qdict)
1935 {
1936     const char *id = qdict_get_str(qdict, "id");
1937     Error *err = NULL;
1938
1939     qmp_object_del(id, &err);
1940     hmp_handle_error(mon, &err);
1941 }
1942
1943 void hmp_info_memdev(Monitor *mon, const QDict *qdict)
1944 {
1945     Error *err = NULL;
1946     MemdevList *memdev_list = qmp_query_memdev(&err);
1947     MemdevList *m = memdev_list;
1948     StringOutputVisitor *ov;
1949     char *str;
1950     int i = 0;
1951
1952
1953     while (m) {
1954         ov = string_output_visitor_new(false);
1955         visit_type_uint16List(string_output_get_visitor(ov),
1956                               &m->value->host_nodes, NULL, NULL);
1957         monitor_printf(mon, "memory backend: %d\n", i);
1958         monitor_printf(mon, "  size:  %" PRId64 "\n", m->value->size);
1959         monitor_printf(mon, "  merge: %s\n",
1960                        m->value->merge ? "true" : "false");
1961         monitor_printf(mon, "  dump: %s\n",
1962                        m->value->dump ? "true" : "false");
1963         monitor_printf(mon, "  prealloc: %s\n",
1964                        m->value->prealloc ? "true" : "false");
1965         monitor_printf(mon, "  policy: %s\n",
1966                        HostMemPolicy_lookup[m->value->policy]);
1967         str = string_output_get_string(ov);
1968         monitor_printf(mon, "  host nodes: %s\n", str);
1969
1970         g_free(str);
1971         string_output_visitor_cleanup(ov);
1972         m = m->next;
1973         i++;
1974     }
1975
1976     monitor_printf(mon, "\n");
1977
1978     qapi_free_MemdevList(memdev_list);
1979 }
1980
1981 void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
1982 {
1983     Error *err = NULL;
1984     MemoryDeviceInfoList *info_list = qmp_query_memory_devices(&err);
1985     MemoryDeviceInfoList *info;
1986     MemoryDeviceInfo *value;
1987     PCDIMMDeviceInfo *di;
1988
1989     for (info = info_list; info; info = info->next) {
1990         value = info->value;
1991
1992         if (value) {
1993             switch (value->type) {
1994             case MEMORY_DEVICE_INFO_KIND_DIMM:
1995                 di = value->u.dimm;
1996
1997                 monitor_printf(mon, "Memory device [%s]: \"%s\"\n",
1998                                MemoryDeviceInfoKind_lookup[value->type],
1999                                di->id ? di->id : "");
2000                 monitor_printf(mon, "  addr: 0x%" PRIx64 "\n", di->addr);
2001                 monitor_printf(mon, "  slot: %" PRId64 "\n", di->slot);
2002                 monitor_printf(mon, "  node: %" PRId64 "\n", di->node);
2003                 monitor_printf(mon, "  size: %" PRIu64 "\n", di->size);
2004                 monitor_printf(mon, "  memdev: %s\n", di->memdev);
2005                 monitor_printf(mon, "  hotplugged: %s\n",
2006                                di->hotplugged ? "true" : "false");
2007                 monitor_printf(mon, "  hotpluggable: %s\n",
2008                                di->hotpluggable ? "true" : "false");
2009                 break;
2010             default:
2011                 break;
2012             }
2013         }
2014     }
2015
2016     qapi_free_MemoryDeviceInfoList(info_list);
2017 }
2018
2019 void hmp_info_iothreads(Monitor *mon, const QDict *qdict)
2020 {
2021     IOThreadInfoList *info_list = qmp_query_iothreads(NULL);
2022     IOThreadInfoList *info;
2023
2024     for (info = info_list; info; info = info->next) {
2025         monitor_printf(mon, "%s: thread_id=%" PRId64 "\n",
2026                        info->value->id, info->value->thread_id);
2027     }
2028
2029     qapi_free_IOThreadInfoList(info_list);
2030 }
2031
2032 void hmp_qom_list(Monitor *mon, const QDict *qdict)
2033 {
2034     const char *path = qdict_get_try_str(qdict, "path");
2035     ObjectPropertyInfoList *list;
2036     Error *err = NULL;
2037
2038     if (path == NULL) {
2039         monitor_printf(mon, "/\n");
2040         return;
2041     }
2042
2043     list = qmp_qom_list(path, &err);
2044     if (err == NULL) {
2045         ObjectPropertyInfoList *start = list;
2046         while (list != NULL) {
2047             ObjectPropertyInfo *value = list->value;
2048
2049             monitor_printf(mon, "%s (%s)\n",
2050                            value->name, value->type);
2051             list = list->next;
2052         }
2053         qapi_free_ObjectPropertyInfoList(start);
2054     }
2055     hmp_handle_error(mon, &err);
2056 }
2057
2058 void hmp_qom_set(Monitor *mon, const QDict *qdict)
2059 {
2060     const char *path = qdict_get_str(qdict, "path");
2061     const char *property = qdict_get_str(qdict, "property");
2062     const char *value = qdict_get_str(qdict, "value");
2063     Error *err = NULL;
2064     bool ambiguous = false;
2065     Object *obj;
2066
2067     obj = object_resolve_path(path, &ambiguous);
2068     if (obj == NULL) {
2069         error_set(&err, ERROR_CLASS_DEVICE_NOT_FOUND,
2070                   "Device '%s' not found", path);
2071     } else {
2072         if (ambiguous) {
2073             monitor_printf(mon, "Warning: Path '%s' is ambiguous\n", path);
2074         }
2075         object_property_parse(obj, value, property, &err);
2076     }
2077     hmp_handle_error(mon, &err);
2078 }
2079
2080 void hmp_rocker(Monitor *mon, const QDict *qdict)
2081 {
2082     const char *name = qdict_get_str(qdict, "name");
2083     RockerSwitch *rocker;
2084     Error *errp = NULL;
2085
2086     rocker = qmp_query_rocker(name, &errp);
2087     if (errp != NULL) {
2088         hmp_handle_error(mon, &errp);
2089         return;
2090     }
2091
2092     monitor_printf(mon, "name: %s\n", rocker->name);
2093     monitor_printf(mon, "id: 0x%" PRIx64 "\n", rocker->id);
2094     monitor_printf(mon, "ports: %d\n", rocker->ports);
2095
2096     qapi_free_RockerSwitch(rocker);
2097 }
2098
2099 void hmp_rocker_ports(Monitor *mon, const QDict *qdict)
2100 {
2101     RockerPortList *list, *port;
2102     const char *name = qdict_get_str(qdict, "name");
2103     Error *errp = NULL;
2104
2105     list = qmp_query_rocker_ports(name, &errp);
2106     if (errp != NULL) {
2107         hmp_handle_error(mon, &errp);
2108         return;
2109     }
2110
2111     monitor_printf(mon, "            ena/    speed/ auto\n");
2112     monitor_printf(mon, "      port  link    duplex neg?\n");
2113
2114     for (port = list; port; port = port->next) {
2115         monitor_printf(mon, "%10s  %-4s   %-3s  %2s  %-3s\n",
2116                        port->value->name,
2117                        port->value->enabled ? port->value->link_up ?
2118                        "up" : "down" : "!ena",
2119                        port->value->speed == 10000 ? "10G" : "??",
2120                        port->value->duplex ? "FD" : "HD",
2121                        port->value->autoneg ? "Yes" : "No");
2122     }
2123
2124     qapi_free_RockerPortList(list);
2125 }
2126
2127 void hmp_rocker_of_dpa_flows(Monitor *mon, const QDict *qdict)
2128 {
2129     RockerOfDpaFlowList *list, *info;
2130     const char *name = qdict_get_str(qdict, "name");
2131     uint32_t tbl_id = qdict_get_try_int(qdict, "tbl_id", -1);
2132     Error *errp = NULL;
2133
2134     list = qmp_query_rocker_of_dpa_flows(name, tbl_id != -1, tbl_id, &errp);
2135     if (errp != NULL) {
2136         hmp_handle_error(mon, &errp);
2137         return;
2138     }
2139
2140     monitor_printf(mon, "prio tbl hits key(mask) --> actions\n");
2141
2142     for (info = list; info; info = info->next) {
2143         RockerOfDpaFlow *flow = info->value;
2144         RockerOfDpaFlowKey *key = flow->key;
2145         RockerOfDpaFlowMask *mask = flow->mask;
2146         RockerOfDpaFlowAction *action = flow->action;
2147
2148         if (flow->hits) {
2149             monitor_printf(mon, "%-4d %-3d %-4" PRIu64,
2150                            key->priority, key->tbl_id, flow->hits);
2151         } else {
2152             monitor_printf(mon, "%-4d %-3d     ",
2153                            key->priority, key->tbl_id);
2154         }
2155
2156         if (key->has_in_pport) {
2157             monitor_printf(mon, " pport %d", key->in_pport);
2158             if (mask->has_in_pport) {
2159                 monitor_printf(mon, "(0x%x)", mask->in_pport);
2160             }
2161         }
2162
2163         if (key->has_vlan_id) {
2164             monitor_printf(mon, " vlan %d",
2165                            key->vlan_id & VLAN_VID_MASK);
2166             if (mask->has_vlan_id) {
2167                 monitor_printf(mon, "(0x%x)", mask->vlan_id);
2168             }
2169         }
2170
2171         if (key->has_tunnel_id) {
2172             monitor_printf(mon, " tunnel %d", key->tunnel_id);
2173             if (mask->has_tunnel_id) {
2174                 monitor_printf(mon, "(0x%x)", mask->tunnel_id);
2175             }
2176         }
2177
2178         if (key->has_eth_type) {
2179             switch (key->eth_type) {
2180             case 0x0806:
2181                 monitor_printf(mon, " ARP");
2182                 break;
2183             case 0x0800:
2184                 monitor_printf(mon, " IP");
2185                 break;
2186             case 0x86dd:
2187                 monitor_printf(mon, " IPv6");
2188                 break;
2189             case 0x8809:
2190                 monitor_printf(mon, " LACP");
2191                 break;
2192             case 0x88cc:
2193                 monitor_printf(mon, " LLDP");
2194                 break;
2195             default:
2196                 monitor_printf(mon, " eth type 0x%04x", key->eth_type);
2197                 break;
2198             }
2199         }
2200
2201         if (key->has_eth_src) {
2202             if ((strcmp(key->eth_src, "01:00:00:00:00:00") == 0) &&
2203                 (mask->has_eth_src) &&
2204                 (strcmp(mask->eth_src, "01:00:00:00:00:00") == 0)) {
2205                 monitor_printf(mon, " src <any mcast/bcast>");
2206             } else if ((strcmp(key->eth_src, "00:00:00:00:00:00") == 0) &&
2207                 (mask->has_eth_src) &&
2208                 (strcmp(mask->eth_src, "01:00:00:00:00:00") == 0)) {
2209                 monitor_printf(mon, " src <any ucast>");
2210             } else {
2211                 monitor_printf(mon, " src %s", key->eth_src);
2212                 if (mask->has_eth_src) {
2213                     monitor_printf(mon, "(%s)", mask->eth_src);
2214                 }
2215             }
2216         }
2217
2218         if (key->has_eth_dst) {
2219             if ((strcmp(key->eth_dst, "01:00:00:00:00:00") == 0) &&
2220                 (mask->has_eth_dst) &&
2221                 (strcmp(mask->eth_dst, "01:00:00:00:00:00") == 0)) {
2222                 monitor_printf(mon, " dst <any mcast/bcast>");
2223             } else if ((strcmp(key->eth_dst, "00:00:00:00:00:00") == 0) &&
2224                 (mask->has_eth_dst) &&
2225                 (strcmp(mask->eth_dst, "01:00:00:00:00:00") == 0)) {
2226                 monitor_printf(mon, " dst <any ucast>");
2227             } else {
2228                 monitor_printf(mon, " dst %s", key->eth_dst);
2229                 if (mask->has_eth_dst) {
2230                     monitor_printf(mon, "(%s)", mask->eth_dst);
2231                 }
2232             }
2233         }
2234
2235         if (key->has_ip_proto) {
2236             monitor_printf(mon, " proto %d", key->ip_proto);
2237             if (mask->has_ip_proto) {
2238                 monitor_printf(mon, "(0x%x)", mask->ip_proto);
2239             }
2240         }
2241
2242         if (key->has_ip_tos) {
2243             monitor_printf(mon, " TOS %d", key->ip_tos);
2244             if (mask->has_ip_tos) {
2245                 monitor_printf(mon, "(0x%x)", mask->ip_tos);
2246             }
2247         }
2248
2249         if (key->has_ip_dst) {
2250             monitor_printf(mon, " dst %s", key->ip_dst);
2251         }
2252
2253         if (action->has_goto_tbl || action->has_group_id ||
2254             action->has_new_vlan_id) {
2255             monitor_printf(mon, " -->");
2256         }
2257
2258         if (action->has_new_vlan_id) {
2259             monitor_printf(mon, " apply new vlan %d",
2260                            ntohs(action->new_vlan_id));
2261         }
2262
2263         if (action->has_group_id) {
2264             monitor_printf(mon, " write group 0x%08x", action->group_id);
2265         }
2266
2267         if (action->has_goto_tbl) {
2268             monitor_printf(mon, " goto tbl %d", action->goto_tbl);
2269         }
2270
2271         monitor_printf(mon, "\n");
2272     }
2273
2274     qapi_free_RockerOfDpaFlowList(list);
2275 }
2276
2277 void hmp_rocker_of_dpa_groups(Monitor *mon, const QDict *qdict)
2278 {
2279     RockerOfDpaGroupList *list, *g;
2280     const char *name = qdict_get_str(qdict, "name");
2281     uint8_t type = qdict_get_try_int(qdict, "type", 9);
2282     Error *errp = NULL;
2283     bool set = false;
2284
2285     list = qmp_query_rocker_of_dpa_groups(name, type != 9, type, &errp);
2286     if (errp != NULL) {
2287         hmp_handle_error(mon, &errp);
2288         return;
2289     }
2290
2291     monitor_printf(mon, "id (decode) --> buckets\n");
2292
2293     for (g = list; g; g = g->next) {
2294         RockerOfDpaGroup *group = g->value;
2295
2296         monitor_printf(mon, "0x%08x", group->id);
2297
2298         monitor_printf(mon, " (type %s", group->type == 0 ? "L2 interface" :
2299                                          group->type == 1 ? "L2 rewrite" :
2300                                          group->type == 2 ? "L3 unicast" :
2301                                          group->type == 3 ? "L2 multicast" :
2302                                          group->type == 4 ? "L2 flood" :
2303                                          group->type == 5 ? "L3 interface" :
2304                                          group->type == 6 ? "L3 multicast" :
2305                                          group->type == 7 ? "L3 ECMP" :
2306                                          group->type == 8 ? "L2 overlay" :
2307                                          "unknown");
2308
2309         if (group->has_vlan_id) {
2310             monitor_printf(mon, " vlan %d", group->vlan_id);
2311         }
2312
2313         if (group->has_pport) {
2314             monitor_printf(mon, " pport %d", group->pport);
2315         }
2316
2317         if (group->has_index) {
2318             monitor_printf(mon, " index %d", group->index);
2319         }
2320
2321         monitor_printf(mon, ") -->");
2322
2323         if (group->has_set_vlan_id && group->set_vlan_id) {
2324             set = true;
2325             monitor_printf(mon, " set vlan %d",
2326                            group->set_vlan_id & VLAN_VID_MASK);
2327         }
2328
2329         if (group->has_set_eth_src) {
2330             if (!set) {
2331                 set = true;
2332                 monitor_printf(mon, " set");
2333             }
2334             monitor_printf(mon, " src %s", group->set_eth_src);
2335         }
2336
2337         if (group->has_set_eth_dst) {
2338             if (!set) {
2339                 set = true;
2340                 monitor_printf(mon, " set");
2341             }
2342             monitor_printf(mon, " dst %s", group->set_eth_dst);
2343         }
2344
2345         set = false;
2346
2347         if (group->has_ttl_check && group->ttl_check) {
2348             monitor_printf(mon, " check TTL");
2349         }
2350
2351         if (group->has_group_id && group->group_id) {
2352             monitor_printf(mon, " group id 0x%08x", group->group_id);
2353         }
2354
2355         if (group->has_pop_vlan && group->pop_vlan) {
2356             monitor_printf(mon, " pop vlan");
2357         }
2358
2359         if (group->has_out_pport) {
2360             monitor_printf(mon, " out pport %d", group->out_pport);
2361         }
2362
2363         if (group->has_group_ids) {
2364             struct uint32List *id;
2365
2366             monitor_printf(mon, " groups [");
2367             for (id = group->group_ids; id; id = id->next) {
2368                 monitor_printf(mon, "0x%08x", id->value);
2369                 if (id->next) {
2370                     monitor_printf(mon, ",");
2371                 }
2372             }
2373             monitor_printf(mon, "]");
2374         }
2375
2376         monitor_printf(mon, "\n");
2377     }
2378
2379     qapi_free_RockerOfDpaGroupList(list);
2380 }
This page took 0.15782 seconds and 4 git commands to generate.