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