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