qemu/monitor/hmp.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 <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
  43static 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
  53void 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
  65int 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
  79static 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
 147static 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 */
 172static 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 */
 209static 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
 218static bool cmd_available(const HMPCommand *cmd)
 219{
 220    return phase_check(PHASE_MACHINE_READY) || cmd_can_preconfig(cmd);
 221}
 222
 223static 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 */
 241static 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
 277void 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
 313static const char *pch;
 314static sigjmp_buf expr_env;
 315
 316static G_NORETURN G_GNUC_PRINTF(2, 3)
 317void 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
 327static void next(void)
 328{
 329    if (*pch != '\0') {
 330        pch++;
 331        while (qemu_isspace(*pch)) {
 332            pch++;
 333        }
 334    }
 335}
 336
 337static int64_t expr_sum(Monitor *mon);
 338
 339static 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, &reg, 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
 427static 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
 461static 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
 490static 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
 512static 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
 527static 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 */
 552static 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 */
 582static 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
 606static int default_fmt_format = 'x';
 607static int default_fmt_size = 4;
 608
 609static 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
 621static 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 */
 645static 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 */
 694static 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
1081fail:
1082    qobject_unref(qdict);
1083    g_free(key);
1084    return NULL;
1085}
1086
1087static 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_puts(mon, info->human_readable_text);
1098}
1099
1100static 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
1112typedef struct HandleHmpCommandCo {
1113    Monitor *mon;
1114    const HMPCommand *cmd;
1115    QDict *qdict;
1116    bool done;
1117} HandleHmpCommandCo;
1118
1119static 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
1127void 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
1178static 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
1204static 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
1262static const char *next_arg_type(const char *typestr)
1263{
1264    const char *p = strchr(typestr, ':');
1265    return (p != NULL ? ++p : typestr);
1266}
1267
1268static 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
1360static 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
1387cleanup:
1388    free_cmdline_args(args, nb_args);
1389}
1390
1391static 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
1409static 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 */
1470static 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
1480static void monitor_readline_flush(void *opaque)
1481{
1482    MonitorHMP *mon = opaque;
1483    monitor_flush(&mon->common);
1484}
1485
1486void 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