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