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 <dirent.h> 27 #include "hw/qdev-core.h" 28 #include "monitor-internal.h" 29 #include "monitor/hmp.h" 30 #include "qapi/error.h" 31 #include "qapi/qmp/qdict.h" 32 #include "qapi/qmp/qnum.h" 33 #include "qemu/config-file.h" 34 #include "qemu/ctype.h" 35 #include "qemu/cutils.h" 36 #include "qemu/log.h" 37 #include "qemu/option.h" 38 #include "qemu/units.h" 39 #include "sysemu/block-backend.h" 40 #include "sysemu/runstate.h" 41 #include "trace.h" 42 43 static void monitor_command_cb(void *opaque, const char *cmdline, 44 void *readline_opaque) 45 { 46 MonitorHMP *mon = opaque; 47 48 monitor_suspend(&mon->common); 49 handle_hmp_command(mon, cmdline); 50 monitor_resume(&mon->common); 51 } 52 53 void monitor_read_command(MonitorHMP *mon, int show_prompt) 54 { 55 if (!mon->rs) { 56 return; 57 } 58 59 readline_start(mon->rs, "(qemu) ", 0, monitor_command_cb, NULL); 60 if (show_prompt) { 61 readline_show_prompt(mon->rs); 62 } 63 } 64 65 int monitor_read_password(MonitorHMP *mon, ReadLineFunc *readline_func, 66 void *opaque) 67 { 68 if (mon->rs) { 69 readline_start(mon->rs, "Password: ", 1, readline_func, opaque); 70 /* prompt is printed on return from the command handler */ 71 return 0; 72 } else { 73 monitor_printf(&mon->common, 74 "terminal does not support password prompting\n"); 75 return -ENOTTY; 76 } 77 } 78 79 static int get_str(char *buf, int buf_size, const char **pp) 80 { 81 const char *p; 82 char *q; 83 int c; 84 85 q = buf; 86 p = *pp; 87 while (qemu_isspace(*p)) { 88 p++; 89 } 90 if (*p == '\0') { 91 fail: 92 *q = '\0'; 93 *pp = p; 94 return -1; 95 } 96 if (*p == '\"') { 97 p++; 98 while (*p != '\0' && *p != '\"') { 99 if (*p == '\\') { 100 p++; 101 c = *p++; 102 switch (c) { 103 case 'n': 104 c = '\n'; 105 break; 106 case 'r': 107 c = '\r'; 108 break; 109 case '\\': 110 case '\'': 111 case '\"': 112 break; 113 default: 114 printf("unsupported escape code: '\\%c'\n", c); 115 goto fail; 116 } 117 if ((q - buf) < buf_size - 1) { 118 *q++ = c; 119 } 120 } else { 121 if ((q - buf) < buf_size - 1) { 122 *q++ = *p; 123 } 124 p++; 125 } 126 } 127 if (*p != '\"') { 128 printf("unterminated string\n"); 129 goto fail; 130 } 131 p++; 132 } else { 133 while (*p != '\0' && !qemu_isspace(*p)) { 134 if ((q - buf) < buf_size - 1) { 135 *q++ = *p; 136 } 137 p++; 138 } 139 } 140 *q = '\0'; 141 *pp = p; 142 return 0; 143 } 144 145 #define MAX_ARGS 16 146 147 static void free_cmdline_args(char **args, int nb_args) 148 { 149 int i; 150 151 assert(nb_args <= MAX_ARGS); 152 153 for (i = 0; i < nb_args; i++) { 154 g_free(args[i]); 155 } 156 157 } 158 159 /* 160 * Parse the command line to get valid args. 161 * @cmdline: command line to be parsed. 162 * @pnb_args: location to store the number of args, must NOT be NULL. 163 * @args: location to store the args, which should be freed by caller, must 164 * NOT be NULL. 165 * 166 * Returns 0 on success, negative on failure. 167 * 168 * NOTE: this parser is an approximate form of the real command parser. Number 169 * of args have a limit of MAX_ARGS. If cmdline contains more, it will 170 * return with failure. 171 */ 172 static int parse_cmdline(const char *cmdline, 173 int *pnb_args, char **args) 174 { 175 const char *p; 176 int nb_args, ret; 177 char buf[1024]; 178 179 p = cmdline; 180 nb_args = 0; 181 for (;;) { 182 while (qemu_isspace(*p)) { 183 p++; 184 } 185 if (*p == '\0') { 186 break; 187 } 188 if (nb_args >= MAX_ARGS) { 189 goto fail; 190 } 191 ret = get_str(buf, sizeof(buf), &p); 192 if (ret < 0) { 193 goto fail; 194 } 195 args[nb_args] = g_strdup(buf); 196 nb_args++; 197 } 198 *pnb_args = nb_args; 199 return 0; 200 201 fail: 202 free_cmdline_args(args, nb_args); 203 return -1; 204 } 205 206 /* 207 * Can command @cmd be executed in preconfig state? 208 */ 209 static bool cmd_can_preconfig(const HMPCommand *cmd) 210 { 211 if (!cmd->flags) { 212 return false; 213 } 214 215 return strchr(cmd->flags, 'p'); 216 } 217 218 static bool cmd_available(const HMPCommand *cmd) 219 { 220 return phase_check(PHASE_MACHINE_READY) || cmd_can_preconfig(cmd); 221 } 222 223 static void help_cmd_dump_one(Monitor *mon, 224 const HMPCommand *cmd, 225 char **prefix_args, 226 int prefix_args_nb) 227 { 228 int i; 229 230 if (!cmd_available(cmd)) { 231 return; 232 } 233 234 for (i = 0; i < prefix_args_nb; i++) { 235 monitor_printf(mon, "%s ", prefix_args[i]); 236 } 237 monitor_printf(mon, "%s %s -- %s\n", cmd->name, cmd->params, cmd->help); 238 } 239 240 /* @args[@arg_index] is the valid command need to find in @cmds */ 241 static void help_cmd_dump(Monitor *mon, const HMPCommand *cmds, 242 char **args, int nb_args, int arg_index) 243 { 244 const HMPCommand *cmd; 245 size_t i; 246 247 /* No valid arg need to compare with, dump all in *cmds */ 248 if (arg_index >= nb_args) { 249 for (cmd = cmds; cmd->name != NULL; cmd++) { 250 help_cmd_dump_one(mon, cmd, args, arg_index); 251 } 252 return; 253 } 254 255 /* Find one entry to dump */ 256 for (cmd = cmds; cmd->name != NULL; cmd++) { 257 if (hmp_compare_cmd(args[arg_index], cmd->name) && 258 cmd_available(cmd)) { 259 if (cmd->sub_table) { 260 /* continue with next arg */ 261 help_cmd_dump(mon, cmd->sub_table, 262 args, nb_args, arg_index + 1); 263 } else { 264 help_cmd_dump_one(mon, cmd, args, arg_index); 265 } 266 return; 267 } 268 } 269 270 /* Command not found */ 271 monitor_printf(mon, "unknown command: '"); 272 for (i = 0; i <= arg_index; i++) { 273 monitor_printf(mon, "%s%s", args[i], i == arg_index ? "'\n" : " "); 274 } 275 } 276 277 void help_cmd(Monitor *mon, const char *name) 278 { 279 char *args[MAX_ARGS]; 280 int nb_args = 0; 281 282 /* 1. parse user input */ 283 if (name) { 284 /* special case for log, directly dump and return */ 285 if (!strcmp(name, "log")) { 286 const QEMULogItem *item; 287 monitor_printf(mon, "Log items (comma separated):\n"); 288 monitor_printf(mon, "%-15s %s\n", "none", "remove all logs"); 289 for (item = qemu_log_items; item->mask != 0; item++) { 290 monitor_printf(mon, "%-15s %s\n", item->name, item->help); 291 } 292 #ifdef CONFIG_TRACE_LOG 293 monitor_printf(mon, "trace:PATTERN enable trace events\n"); 294 monitor_printf(mon, "\nUse \"log trace:help\" to get a list of " 295 "trace events.\n\n"); 296 #endif 297 return; 298 } 299 300 if (parse_cmdline(name, &nb_args, args) < 0) { 301 return; 302 } 303 } 304 305 /* 2. dump the contents according to parsed args */ 306 help_cmd_dump(mon, hmp_cmds, args, nb_args, 0); 307 308 free_cmdline_args(args, nb_args); 309 } 310 311 /*******************************************************************/ 312 313 static const char *pch; 314 static sigjmp_buf expr_env; 315 316 static G_NORETURN G_GNUC_PRINTF(2, 3) 317 void expr_error(Monitor *mon, const char *fmt, ...) 318 { 319 va_list ap; 320 va_start(ap, fmt); 321 monitor_vprintf(mon, fmt, ap); 322 monitor_printf(mon, "\n"); 323 va_end(ap); 324 siglongjmp(expr_env, 1); 325 } 326 327 static void next(void) 328 { 329 if (*pch != '\0') { 330 pch++; 331 while (qemu_isspace(*pch)) { 332 pch++; 333 } 334 } 335 } 336 337 static int64_t expr_sum(Monitor *mon); 338 339 static int64_t expr_unary(Monitor *mon) 340 { 341 int64_t n; 342 char *p; 343 int ret; 344 345 switch (*pch) { 346 case '+': 347 next(); 348 n = expr_unary(mon); 349 break; 350 case '-': 351 next(); 352 n = -expr_unary(mon); 353 break; 354 case '~': 355 next(); 356 n = ~expr_unary(mon); 357 break; 358 case '(': 359 next(); 360 n = expr_sum(mon); 361 if (*pch != ')') { 362 expr_error(mon, "')' expected"); 363 } 364 next(); 365 break; 366 case '\'': 367 pch++; 368 if (*pch == '\0') { 369 expr_error(mon, "character constant expected"); 370 } 371 n = *pch; 372 pch++; 373 if (*pch != '\'') { 374 expr_error(mon, "missing terminating \' character"); 375 } 376 next(); 377 break; 378 case '$': 379 { 380 char buf[128], *q; 381 int64_t reg = 0; 382 383 pch++; 384 q = buf; 385 while ((*pch >= 'a' && *pch <= 'z') || 386 (*pch >= 'A' && *pch <= 'Z') || 387 (*pch >= '0' && *pch <= '9') || 388 *pch == '_' || *pch == '.') { 389 if ((q - buf) < sizeof(buf) - 1) { 390 *q++ = *pch; 391 } 392 pch++; 393 } 394 while (qemu_isspace(*pch)) { 395 pch++; 396 } 397 *q = 0; 398 ret = get_monitor_def(mon, ®, buf); 399 if (ret < 0) { 400 expr_error(mon, "unknown register"); 401 } 402 n = reg; 403 } 404 break; 405 case '\0': 406 expr_error(mon, "unexpected end of expression"); 407 n = 0; 408 break; 409 default: 410 errno = 0; 411 n = strtoull(pch, &p, 0); 412 if (errno == ERANGE) { 413 expr_error(mon, "number too large"); 414 } 415 if (pch == p) { 416 expr_error(mon, "invalid char '%c' in expression", *p); 417 } 418 pch = p; 419 while (qemu_isspace(*pch)) { 420 pch++; 421 } 422 break; 423 } 424 return n; 425 } 426 427 static int64_t expr_prod(Monitor *mon) 428 { 429 int64_t val, val2; 430 int op; 431 432 val = expr_unary(mon); 433 for (;;) { 434 op = *pch; 435 if (op != '*' && op != '/' && op != '%') { 436 break; 437 } 438 next(); 439 val2 = expr_unary(mon); 440 switch (op) { 441 default: 442 case '*': 443 val *= val2; 444 break; 445 case '/': 446 case '%': 447 if (val2 == 0) { 448 expr_error(mon, "division by zero"); 449 } 450 if (op == '/') { 451 val /= val2; 452 } else { 453 val %= val2; 454 } 455 break; 456 } 457 } 458 return val; 459 } 460 461 static int64_t expr_logic(Monitor *mon) 462 { 463 int64_t val, val2; 464 int op; 465 466 val = expr_prod(mon); 467 for (;;) { 468 op = *pch; 469 if (op != '&' && op != '|' && op != '^') { 470 break; 471 } 472 next(); 473 val2 = expr_prod(mon); 474 switch (op) { 475 default: 476 case '&': 477 val &= val2; 478 break; 479 case '|': 480 val |= val2; 481 break; 482 case '^': 483 val ^= val2; 484 break; 485 } 486 } 487 return val; 488 } 489 490 static int64_t expr_sum(Monitor *mon) 491 { 492 int64_t val, val2; 493 int op; 494 495 val = expr_logic(mon); 496 for (;;) { 497 op = *pch; 498 if (op != '+' && op != '-') { 499 break; 500 } 501 next(); 502 val2 = expr_logic(mon); 503 if (op == '+') { 504 val += val2; 505 } else { 506 val -= val2; 507 } 508 } 509 return val; 510 } 511 512 static int get_expr(Monitor *mon, int64_t *pval, const char **pp) 513 { 514 pch = *pp; 515 if (sigsetjmp(expr_env, 0)) { 516 *pp = pch; 517 return -1; 518 } 519 while (qemu_isspace(*pch)) { 520 pch++; 521 } 522 *pval = expr_sum(mon); 523 *pp = pch; 524 return 0; 525 } 526 527 static int get_double(Monitor *mon, double *pval, const char **pp) 528 { 529 const char *p = *pp; 530 char *tailp; 531 double d; 532 533 d = strtod(p, &tailp); 534 if (tailp == p) { 535 monitor_printf(mon, "Number expected\n"); 536 return -1; 537 } 538 if (d != d || d - d != 0) { 539 /* NaN or infinity */ 540 monitor_printf(mon, "Bad number\n"); 541 return -1; 542 } 543 *pval = d; 544 *pp = tailp; 545 return 0; 546 } 547 548 /* 549 * Store the command-name in cmdname, and return a pointer to 550 * the remaining of the command string. 551 */ 552 static const char *get_command_name(const char *cmdline, 553 char *cmdname, size_t nlen) 554 { 555 size_t len; 556 const char *p, *pstart; 557 558 p = cmdline; 559 while (qemu_isspace(*p)) { 560 p++; 561 } 562 if (*p == '\0') { 563 return NULL; 564 } 565 pstart = p; 566 while (*p != '\0' && *p != '/' && !qemu_isspace(*p)) { 567 p++; 568 } 569 len = p - pstart; 570 if (len > nlen - 1) { 571 len = nlen - 1; 572 } 573 memcpy(cmdname, pstart, len); 574 cmdname[len] = '\0'; 575 return p; 576 } 577 578 /** 579 * Read key of 'type' into 'key' and return the current 580 * 'type' pointer. 581 */ 582 static char *key_get_info(const char *type, char **key) 583 { 584 size_t len; 585 char *p, *str; 586 587 if (*type == ',') { 588 type++; 589 } 590 591 p = strchr(type, ':'); 592 if (!p) { 593 *key = NULL; 594 return NULL; 595 } 596 len = p - type; 597 598 str = g_malloc(len + 1); 599 memcpy(str, type, len); 600 str[len] = '\0'; 601 602 *key = str; 603 return ++p; 604 } 605 606 static int default_fmt_format = 'x'; 607 static int default_fmt_size = 4; 608 609 static int is_valid_option(const char *c, const char *typestr) 610 { 611 char option[3]; 612 613 option[0] = '-'; 614 option[1] = *c; 615 option[2] = '\0'; 616 617 typestr = strstr(typestr, option); 618 return (typestr != NULL); 619 } 620 621 static const HMPCommand *search_dispatch_table(const HMPCommand *disp_table, 622 const char *cmdname) 623 { 624 const HMPCommand *cmd; 625 626 for (cmd = disp_table; cmd->name != NULL; cmd++) { 627 if (hmp_compare_cmd(cmdname, cmd->name)) { 628 return cmd; 629 } 630 } 631 632 return NULL; 633 } 634 635 /* 636 * Parse command name from @cmdp according to command table @table. 637 * If blank, return NULL. 638 * Else, if no valid command can be found, report to @mon, and return 639 * NULL. 640 * Else, change @cmdp to point right behind the name, and return its 641 * command table entry. 642 * Do not assume the return value points into @table! It doesn't when 643 * the command is found in a sub-command table. 644 */ 645 static const HMPCommand *monitor_parse_command(MonitorHMP *hmp_mon, 646 const char *cmdp_start, 647 const char **cmdp, 648 HMPCommand *table) 649 { 650 Monitor *mon = &hmp_mon->common; 651 const char *p; 652 const HMPCommand *cmd; 653 char cmdname[256]; 654 655 /* extract the command name */ 656 p = get_command_name(*cmdp, cmdname, sizeof(cmdname)); 657 if (!p) { 658 return NULL; 659 } 660 661 cmd = search_dispatch_table(table, cmdname); 662 if (!cmd) { 663 monitor_printf(mon, "unknown command: '%.*s'\n", 664 (int)(p - cmdp_start), cmdp_start); 665 return NULL; 666 } 667 if (!cmd_available(cmd)) { 668 monitor_printf(mon, "Command '%.*s' not available " 669 "until machine initialization has completed.\n", 670 (int)(p - cmdp_start), cmdp_start); 671 return NULL; 672 } 673 674 /* filter out following useless space */ 675 while (qemu_isspace(*p)) { 676 p++; 677 } 678 679 *cmdp = p; 680 /* search sub command */ 681 if (cmd->sub_table != NULL && *p != '\0') { 682 return monitor_parse_command(hmp_mon, cmdp_start, cmdp, cmd->sub_table); 683 } 684 685 return cmd; 686 } 687 688 /* 689 * Parse arguments for @cmd. 690 * If it can't be parsed, report to @mon, and return NULL. 691 * Else, insert command arguments into a QDict, and return it. 692 * Note: On success, caller has to free the QDict structure. 693 */ 694 static QDict *monitor_parse_arguments(Monitor *mon, 695 const char **endp, 696 const HMPCommand *cmd) 697 { 698 const char *typestr; 699 char *key; 700 int c; 701 const char *p = *endp; 702 char buf[1024]; 703 QDict *qdict = qdict_new(); 704 705 /* parse the parameters */ 706 typestr = cmd->args_type; 707 for (;;) { 708 typestr = key_get_info(typestr, &key); 709 if (!typestr) { 710 break; 711 } 712 c = *typestr; 713 typestr++; 714 switch (c) { 715 case 'F': 716 case 'B': 717 case 's': 718 { 719 int ret; 720 721 while (qemu_isspace(*p)) { 722 p++; 723 } 724 if (*typestr == '?') { 725 typestr++; 726 if (*p == '\0') { 727 /* no optional string: NULL argument */ 728 break; 729 } 730 } 731 ret = get_str(buf, sizeof(buf), &p); 732 if (ret < 0) { 733 switch (c) { 734 case 'F': 735 monitor_printf(mon, "%s: filename expected\n", 736 cmd->name); 737 break; 738 case 'B': 739 monitor_printf(mon, "%s: block device name expected\n", 740 cmd->name); 741 break; 742 default: 743 monitor_printf(mon, "%s: string expected\n", cmd->name); 744 break; 745 } 746 goto fail; 747 } 748 qdict_put_str(qdict, key, buf); 749 } 750 break; 751 case 'O': 752 { 753 QemuOptsList *opts_list; 754 QemuOpts *opts; 755 756 opts_list = qemu_find_opts(key); 757 if (!opts_list || opts_list->desc->name) { 758 goto bad_type; 759 } 760 while (qemu_isspace(*p)) { 761 p++; 762 } 763 if (!*p) { 764 break; 765 } 766 if (get_str(buf, sizeof(buf), &p) < 0) { 767 goto fail; 768 } 769 opts = qemu_opts_parse_noisily(opts_list, buf, true); 770 if (!opts) { 771 goto fail; 772 } 773 qemu_opts_to_qdict(opts, qdict); 774 qemu_opts_del(opts); 775 } 776 break; 777 case '/': 778 { 779 int count, format, size; 780 781 while (qemu_isspace(*p)) { 782 p++; 783 } 784 if (*p == '/') { 785 /* format found */ 786 p++; 787 count = 1; 788 if (qemu_isdigit(*p)) { 789 count = 0; 790 while (qemu_isdigit(*p)) { 791 count = count * 10 + (*p - '0'); 792 p++; 793 } 794 } 795 size = -1; 796 format = -1; 797 for (;;) { 798 switch (*p) { 799 case 'o': 800 case 'd': 801 case 'u': 802 case 'x': 803 case 'i': 804 case 'c': 805 format = *p++; 806 break; 807 case 'b': 808 size = 1; 809 p++; 810 break; 811 case 'h': 812 size = 2; 813 p++; 814 break; 815 case 'w': 816 size = 4; 817 p++; 818 break; 819 case 'g': 820 case 'L': 821 size = 8; 822 p++; 823 break; 824 default: 825 goto next; 826 } 827 } 828 next: 829 if (*p != '\0' && !qemu_isspace(*p)) { 830 monitor_printf(mon, "invalid char in format: '%c'\n", 831 *p); 832 goto fail; 833 } 834 if (format < 0) { 835 format = default_fmt_format; 836 } 837 if (format != 'i') { 838 /* for 'i', not specifying a size gives -1 as size */ 839 if (size < 0) { 840 size = default_fmt_size; 841 } 842 default_fmt_size = size; 843 } 844 default_fmt_format = format; 845 } else { 846 count = 1; 847 format = default_fmt_format; 848 if (format != 'i') { 849 size = default_fmt_size; 850 } else { 851 size = -1; 852 } 853 } 854 qdict_put_int(qdict, "count", count); 855 qdict_put_int(qdict, "format", format); 856 qdict_put_int(qdict, "size", size); 857 } 858 break; 859 case 'i': 860 case 'l': 861 case 'M': 862 { 863 int64_t val; 864 865 while (qemu_isspace(*p)) { 866 p++; 867 } 868 if (*typestr == '?' || *typestr == '.') { 869 if (*typestr == '?') { 870 if (*p == '\0') { 871 typestr++; 872 break; 873 } 874 } else { 875 if (*p == '.') { 876 p++; 877 while (qemu_isspace(*p)) { 878 p++; 879 } 880 } else { 881 typestr++; 882 break; 883 } 884 } 885 typestr++; 886 } 887 if (get_expr(mon, &val, &p)) { 888 goto fail; 889 } 890 /* Check if 'i' is greater than 32-bit */ 891 if ((c == 'i') && ((val >> 32) & 0xffffffff)) { 892 monitor_printf(mon, "\'%s\' has failed: ", cmd->name); 893 monitor_printf(mon, "integer is for 32-bit values\n"); 894 goto fail; 895 } else if (c == 'M') { 896 if (val < 0) { 897 monitor_printf(mon, "enter a positive value\n"); 898 goto fail; 899 } 900 val *= MiB; 901 } 902 qdict_put_int(qdict, key, val); 903 } 904 break; 905 case 'o': 906 { 907 int ret; 908 uint64_t val; 909 const char *end; 910 911 while (qemu_isspace(*p)) { 912 p++; 913 } 914 if (*typestr == '?') { 915 typestr++; 916 if (*p == '\0') { 917 break; 918 } 919 } 920 ret = qemu_strtosz_MiB(p, &end, &val); 921 if (ret < 0 || val > INT64_MAX) { 922 monitor_printf(mon, "invalid size\n"); 923 goto fail; 924 } 925 qdict_put_int(qdict, key, val); 926 p = end; 927 } 928 break; 929 case 'T': 930 { 931 double val; 932 933 while (qemu_isspace(*p)) { 934 p++; 935 } 936 if (*typestr == '?') { 937 typestr++; 938 if (*p == '\0') { 939 break; 940 } 941 } 942 if (get_double(mon, &val, &p) < 0) { 943 goto fail; 944 } 945 if (p[0] && p[1] == 's') { 946 switch (*p) { 947 case 'm': 948 val /= 1e3; p += 2; break; 949 case 'u': 950 val /= 1e6; p += 2; break; 951 case 'n': 952 val /= 1e9; p += 2; break; 953 } 954 } 955 if (*p && !qemu_isspace(*p)) { 956 monitor_printf(mon, "Unknown unit suffix\n"); 957 goto fail; 958 } 959 qdict_put(qdict, key, qnum_from_double(val)); 960 } 961 break; 962 case 'b': 963 { 964 const char *beg; 965 bool val; 966 967 while (qemu_isspace(*p)) { 968 p++; 969 } 970 beg = p; 971 while (qemu_isgraph(*p)) { 972 p++; 973 } 974 if (p - beg == 2 && !memcmp(beg, "on", p - beg)) { 975 val = true; 976 } else if (p - beg == 3 && !memcmp(beg, "off", p - beg)) { 977 val = false; 978 } else { 979 monitor_printf(mon, "Expected 'on' or 'off'\n"); 980 goto fail; 981 } 982 qdict_put_bool(qdict, key, val); 983 } 984 break; 985 case '-': 986 { 987 const char *tmp = p; 988 int skip_key = 0; 989 int ret; 990 /* option */ 991 992 c = *typestr++; 993 if (c == '\0') { 994 goto bad_type; 995 } 996 while (qemu_isspace(*p)) { 997 p++; 998 } 999 if (*p == '-') { 1000 p++; 1001 if (c != *p) { 1002 if (!is_valid_option(p, typestr)) { 1003 monitor_printf(mon, "%s: unsupported option -%c\n", 1004 cmd->name, *p); 1005 goto fail; 1006 } else { 1007 skip_key = 1; 1008 } 1009 } 1010 if (skip_key) { 1011 p = tmp; 1012 } else if (*typestr == 's') { 1013 /* has option with string value */ 1014 typestr++; 1015 tmp = p++; 1016 while (qemu_isspace(*p)) { 1017 p++; 1018 } 1019 ret = get_str(buf, sizeof(buf), &p); 1020 if (ret < 0) { 1021 monitor_printf(mon, "%s: value expected for -%c\n", 1022 cmd->name, *tmp); 1023 goto fail; 1024 } 1025 qdict_put_str(qdict, key, buf); 1026 } else { 1027 /* has boolean option */ 1028 p++; 1029 qdict_put_bool(qdict, key, true); 1030 } 1031 } else if (*typestr == 's') { 1032 typestr++; 1033 } 1034 } 1035 break; 1036 case 'S': 1037 { 1038 /* package all remaining string */ 1039 int len; 1040 1041 while (qemu_isspace(*p)) { 1042 p++; 1043 } 1044 if (*typestr == '?') { 1045 typestr++; 1046 if (*p == '\0') { 1047 /* no remaining string: NULL argument */ 1048 break; 1049 } 1050 } 1051 len = strlen(p); 1052 if (len <= 0) { 1053 monitor_printf(mon, "%s: string expected\n", 1054 cmd->name); 1055 goto fail; 1056 } 1057 qdict_put_str(qdict, key, p); 1058 p += len; 1059 } 1060 break; 1061 default: 1062 bad_type: 1063 monitor_printf(mon, "%s: unknown type '%c'\n", cmd->name, c); 1064 goto fail; 1065 } 1066 g_free(key); 1067 key = NULL; 1068 } 1069 /* check that all arguments were parsed */ 1070 while (qemu_isspace(*p)) { 1071 p++; 1072 } 1073 if (*p != '\0') { 1074 monitor_printf(mon, "%s: extraneous characters at the end of line\n", 1075 cmd->name); 1076 goto fail; 1077 } 1078 1079 return qdict; 1080 1081 fail: 1082 qobject_unref(qdict); 1083 g_free(key); 1084 return NULL; 1085 } 1086 1087 static void hmp_info_human_readable_text(Monitor *mon, 1088 HumanReadableText *(*handler)(Error **)) 1089 { 1090 Error *err = NULL; 1091 g_autoptr(HumanReadableText) info = handler(&err); 1092 1093 if (hmp_handle_error(mon, err)) { 1094 return; 1095 } 1096 1097 monitor_printf(mon, "%s", info->human_readable_text); 1098 } 1099 1100 static void handle_hmp_command_exec(Monitor *mon, 1101 const HMPCommand *cmd, 1102 QDict *qdict) 1103 { 1104 if (cmd->cmd_info_hrt) { 1105 hmp_info_human_readable_text(mon, 1106 cmd->cmd_info_hrt); 1107 } else { 1108 cmd->cmd(mon, qdict); 1109 } 1110 } 1111 1112 typedef struct HandleHmpCommandCo { 1113 Monitor *mon; 1114 const HMPCommand *cmd; 1115 QDict *qdict; 1116 bool done; 1117 } HandleHmpCommandCo; 1118 1119 static void handle_hmp_command_co(void *opaque) 1120 { 1121 HandleHmpCommandCo *data = opaque; 1122 handle_hmp_command_exec(data->mon, data->cmd, data->qdict); 1123 monitor_set_cur(qemu_coroutine_self(), NULL); 1124 data->done = true; 1125 } 1126 1127 void handle_hmp_command(MonitorHMP *mon, const char *cmdline) 1128 { 1129 QDict *qdict; 1130 const HMPCommand *cmd; 1131 const char *cmd_start = cmdline; 1132 1133 trace_handle_hmp_command(mon, cmdline); 1134 1135 cmd = monitor_parse_command(mon, cmdline, &cmdline, hmp_cmds); 1136 if (!cmd) { 1137 return; 1138 } 1139 1140 if (!cmd->cmd && !cmd->cmd_info_hrt) { 1141 /* FIXME: is it useful to try autoload modules here ??? */ 1142 monitor_printf(&mon->common, "Command \"%.*s\" is not available.\n", 1143 (int)(cmdline - cmd_start), cmd_start); 1144 return; 1145 } 1146 1147 qdict = monitor_parse_arguments(&mon->common, &cmdline, cmd); 1148 if (!qdict) { 1149 while (cmdline > cmd_start && qemu_isspace(cmdline[-1])) { 1150 cmdline--; 1151 } 1152 monitor_printf(&mon->common, "Try \"help %.*s\" for more information\n", 1153 (int)(cmdline - cmd_start), cmd_start); 1154 return; 1155 } 1156 1157 if (!cmd->coroutine) { 1158 /* old_mon is non-NULL when called from qmp_human_monitor_command() */ 1159 Monitor *old_mon = monitor_set_cur(qemu_coroutine_self(), &mon->common); 1160 handle_hmp_command_exec(&mon->common, cmd, qdict); 1161 monitor_set_cur(qemu_coroutine_self(), old_mon); 1162 } else { 1163 HandleHmpCommandCo data = { 1164 .mon = &mon->common, 1165 .cmd = cmd, 1166 .qdict = qdict, 1167 .done = false, 1168 }; 1169 Coroutine *co = qemu_coroutine_create(handle_hmp_command_co, &data); 1170 monitor_set_cur(co, &mon->common); 1171 aio_co_enter(qemu_get_aio_context(), co); 1172 AIO_WAIT_WHILE(qemu_get_aio_context(), !data.done); 1173 } 1174 1175 qobject_unref(qdict); 1176 } 1177 1178 static void cmd_completion(MonitorHMP *mon, const char *name, const char *list) 1179 { 1180 const char *p, *pstart; 1181 char cmd[128]; 1182 int len; 1183 1184 p = list; 1185 for (;;) { 1186 pstart = p; 1187 p = qemu_strchrnul(p, '|'); 1188 len = p - pstart; 1189 if (len > sizeof(cmd) - 2) { 1190 len = sizeof(cmd) - 2; 1191 } 1192 memcpy(cmd, pstart, len); 1193 cmd[len] = '\0'; 1194 if (name[0] == '\0' || !strncmp(name, cmd, strlen(name))) { 1195 readline_add_completion(mon->rs, cmd); 1196 } 1197 if (*p == '\0') { 1198 break; 1199 } 1200 p++; 1201 } 1202 } 1203 1204 static void file_completion(MonitorHMP *mon, const char *input) 1205 { 1206 DIR *ffs; 1207 struct dirent *d; 1208 char path[1024]; 1209 char file[1024], file_prefix[1024]; 1210 int input_path_len; 1211 const char *p; 1212 1213 p = strrchr(input, '/'); 1214 if (!p) { 1215 input_path_len = 0; 1216 pstrcpy(file_prefix, sizeof(file_prefix), input); 1217 pstrcpy(path, sizeof(path), "."); 1218 } else { 1219 input_path_len = p - input + 1; 1220 memcpy(path, input, input_path_len); 1221 if (input_path_len > sizeof(path) - 1) { 1222 input_path_len = sizeof(path) - 1; 1223 } 1224 path[input_path_len] = '\0'; 1225 pstrcpy(file_prefix, sizeof(file_prefix), p + 1); 1226 } 1227 1228 ffs = opendir(path); 1229 if (!ffs) { 1230 return; 1231 } 1232 for (;;) { 1233 struct stat sb; 1234 d = readdir(ffs); 1235 if (!d) { 1236 break; 1237 } 1238 1239 if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) { 1240 continue; 1241 } 1242 1243 if (strstart(d->d_name, file_prefix, NULL)) { 1244 memcpy(file, input, input_path_len); 1245 if (input_path_len < sizeof(file)) { 1246 pstrcpy(file + input_path_len, sizeof(file) - input_path_len, 1247 d->d_name); 1248 } 1249 /* 1250 * stat the file to find out if it's a directory. 1251 * In that case add a slash to speed up typing long paths 1252 */ 1253 if (stat(file, &sb) == 0 && S_ISDIR(sb.st_mode)) { 1254 pstrcat(file, sizeof(file), "/"); 1255 } 1256 readline_add_completion(mon->rs, file); 1257 } 1258 } 1259 closedir(ffs); 1260 } 1261 1262 static const char *next_arg_type(const char *typestr) 1263 { 1264 const char *p = strchr(typestr, ':'); 1265 return (p != NULL ? ++p : typestr); 1266 } 1267 1268 static void monitor_find_completion_by_table(MonitorHMP *mon, 1269 const HMPCommand *cmd_table, 1270 char **args, 1271 int nb_args) 1272 { 1273 const char *cmdname; 1274 int i; 1275 const char *ptype, *old_ptype, *str, *name; 1276 const HMPCommand *cmd; 1277 BlockBackend *blk = NULL; 1278 1279 if (nb_args <= 1) { 1280 /* command completion */ 1281 if (nb_args == 0) { 1282 cmdname = ""; 1283 } else { 1284 cmdname = args[0]; 1285 } 1286 readline_set_completion_index(mon->rs, strlen(cmdname)); 1287 for (cmd = cmd_table; cmd->name != NULL; cmd++) { 1288 if (cmd_available(cmd)) { 1289 cmd_completion(mon, cmdname, cmd->name); 1290 } 1291 } 1292 } else { 1293 /* find the command */ 1294 for (cmd = cmd_table; cmd->name != NULL; cmd++) { 1295 if (hmp_compare_cmd(args[0], cmd->name) && 1296 cmd_available(cmd)) { 1297 break; 1298 } 1299 } 1300 if (!cmd->name) { 1301 return; 1302 } 1303 1304 if (cmd->sub_table) { 1305 /* do the job again */ 1306 monitor_find_completion_by_table(mon, cmd->sub_table, 1307 &args[1], nb_args - 1); 1308 return; 1309 } 1310 if (cmd->command_completion) { 1311 cmd->command_completion(mon->rs, nb_args, args[nb_args - 1]); 1312 return; 1313 } 1314 1315 ptype = next_arg_type(cmd->args_type); 1316 for (i = 0; i < nb_args - 2; i++) { 1317 if (*ptype != '\0') { 1318 ptype = next_arg_type(ptype); 1319 while (*ptype == '?') { 1320 ptype = next_arg_type(ptype); 1321 } 1322 } 1323 } 1324 str = args[nb_args - 1]; 1325 old_ptype = NULL; 1326 while (*ptype == '-' && old_ptype != ptype) { 1327 old_ptype = ptype; 1328 ptype = next_arg_type(ptype); 1329 } 1330 switch (*ptype) { 1331 case 'F': 1332 /* file completion */ 1333 readline_set_completion_index(mon->rs, strlen(str)); 1334 file_completion(mon, str); 1335 break; 1336 case 'B': 1337 /* block device name completion */ 1338 readline_set_completion_index(mon->rs, strlen(str)); 1339 while ((blk = blk_next(blk)) != NULL) { 1340 name = blk_name(blk); 1341 if (str[0] == '\0' || 1342 !strncmp(name, str, strlen(str))) { 1343 readline_add_completion(mon->rs, name); 1344 } 1345 } 1346 break; 1347 case 's': 1348 case 'S': 1349 if (!strcmp(cmd->name, "help|?")) { 1350 monitor_find_completion_by_table(mon, cmd_table, 1351 &args[1], nb_args - 1); 1352 } 1353 break; 1354 default: 1355 break; 1356 } 1357 } 1358 } 1359 1360 static void monitor_find_completion(void *opaque, 1361 const char *cmdline) 1362 { 1363 MonitorHMP *mon = opaque; 1364 char *args[MAX_ARGS]; 1365 int nb_args, len; 1366 1367 /* 1. parse the cmdline */ 1368 if (parse_cmdline(cmdline, &nb_args, args) < 0) { 1369 return; 1370 } 1371 1372 /* 1373 * if the line ends with a space, it means we want to complete the 1374 * next arg 1375 */ 1376 len = strlen(cmdline); 1377 if (len > 0 && qemu_isspace(cmdline[len - 1])) { 1378 if (nb_args >= MAX_ARGS) { 1379 goto cleanup; 1380 } 1381 args[nb_args++] = g_strdup(""); 1382 } 1383 1384 /* 2. auto complete according to args */ 1385 monitor_find_completion_by_table(mon, hmp_cmds, args, nb_args); 1386 1387 cleanup: 1388 free_cmdline_args(args, nb_args); 1389 } 1390 1391 static void monitor_read(void *opaque, const uint8_t *buf, int size) 1392 { 1393 MonitorHMP *mon = container_of(opaque, MonitorHMP, common); 1394 int i; 1395 1396 if (mon->rs) { 1397 for (i = 0; i < size; i++) { 1398 readline_handle_byte(mon->rs, buf[i]); 1399 } 1400 } else { 1401 if (size == 0 || buf[size - 1] != 0) { 1402 monitor_printf(&mon->common, "corrupted command\n"); 1403 } else { 1404 handle_hmp_command(mon, (char *)buf); 1405 } 1406 } 1407 } 1408 1409 static void monitor_event(void *opaque, QEMUChrEvent event) 1410 { 1411 Monitor *mon = opaque; 1412 MonitorHMP *hmp_mon = container_of(mon, MonitorHMP, common); 1413 1414 switch (event) { 1415 case CHR_EVENT_MUX_IN: 1416 qemu_mutex_lock(&mon->mon_lock); 1417 mon->mux_out = 0; 1418 qemu_mutex_unlock(&mon->mon_lock); 1419 if (mon->reset_seen) { 1420 readline_restart(hmp_mon->rs); 1421 monitor_resume(mon); 1422 monitor_flush(mon); 1423 } else { 1424 qatomic_mb_set(&mon->suspend_cnt, 0); 1425 } 1426 break; 1427 1428 case CHR_EVENT_MUX_OUT: 1429 if (mon->reset_seen) { 1430 if (qatomic_mb_read(&mon->suspend_cnt) == 0) { 1431 monitor_printf(mon, "\n"); 1432 } 1433 monitor_flush(mon); 1434 monitor_suspend(mon); 1435 } else { 1436 qatomic_inc(&mon->suspend_cnt); 1437 } 1438 qemu_mutex_lock(&mon->mon_lock); 1439 mon->mux_out = 1; 1440 qemu_mutex_unlock(&mon->mon_lock); 1441 break; 1442 1443 case CHR_EVENT_OPENED: 1444 monitor_printf(mon, "QEMU %s monitor - type 'help' for more " 1445 "information\n", QEMU_VERSION); 1446 if (!mon->mux_out) { 1447 readline_restart(hmp_mon->rs); 1448 readline_show_prompt(hmp_mon->rs); 1449 } 1450 mon->reset_seen = 1; 1451 mon_refcount++; 1452 break; 1453 1454 case CHR_EVENT_CLOSED: 1455 mon_refcount--; 1456 monitor_fdsets_cleanup(); 1457 break; 1458 1459 case CHR_EVENT_BREAK: 1460 /* Ignored */ 1461 break; 1462 } 1463 } 1464 1465 1466 /* 1467 * These functions just adapt the readline interface in a typesafe way. We 1468 * could cast function pointers but that discards compiler checks. 1469 */ 1470 static void G_GNUC_PRINTF(2, 3) monitor_readline_printf(void *opaque, 1471 const char *fmt, ...) 1472 { 1473 MonitorHMP *mon = opaque; 1474 va_list ap; 1475 va_start(ap, fmt); 1476 monitor_vprintf(&mon->common, fmt, ap); 1477 va_end(ap); 1478 } 1479 1480 static void monitor_readline_flush(void *opaque) 1481 { 1482 MonitorHMP *mon = opaque; 1483 monitor_flush(&mon->common); 1484 } 1485 1486 void monitor_init_hmp(Chardev *chr, bool use_readline, Error **errp) 1487 { 1488 MonitorHMP *mon = g_new0(MonitorHMP, 1); 1489 1490 if (!qemu_chr_fe_init(&mon->common.chr, chr, errp)) { 1491 g_free(mon); 1492 return; 1493 } 1494 1495 monitor_data_init(&mon->common, false, false, false); 1496 1497 mon->use_readline = use_readline; 1498 if (mon->use_readline) { 1499 mon->rs = readline_init(monitor_readline_printf, 1500 monitor_readline_flush, 1501 mon, 1502 monitor_find_completion); 1503 monitor_read_command(mon, 0); 1504 } 1505 1506 qemu_chr_fe_set_handlers(&mon->common.chr, monitor_can_read, monitor_read, 1507 monitor_event, NULL, &mon->common, NULL, true); 1508 monitor_list_append(&mon->common); 1509 } 1510