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