qemu/monitor.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#include <dirent.h>
  25#include "hw/hw.h"
  26#include "hw/qdev.h"
  27#include "hw/usb.h"
  28#include "hw/pcmcia.h"
  29#include "hw/pc.h"
  30#include "hw/pci.h"
  31#include "hw/watchdog.h"
  32#include "hw/loader.h"
  33#include "gdbstub.h"
  34#include "net.h"
  35#include "net/slirp.h"
  36#include "qemu-char.h"
  37#include "ui/qemu-spice.h"
  38#include "sysemu.h"
  39#include "monitor.h"
  40#include "readline.h"
  41#include "console.h"
  42#include "blockdev.h"
  43#include "audio/audio.h"
  44#include "disas.h"
  45#include "balloon.h"
  46#include "qemu-timer.h"
  47#include "migration.h"
  48#include "kvm.h"
  49#include "acl.h"
  50#include "qint.h"
  51#include "qfloat.h"
  52#include "qlist.h"
  53#include "qbool.h"
  54#include "qstring.h"
  55#include "qjson.h"
  56#include "json-streamer.h"
  57#include "json-parser.h"
  58#include "osdep.h"
  59#include "cpu.h"
  60#ifdef CONFIG_SIMPLE_TRACE
  61#include "trace.h"
  62#endif
  63#include "ui/qemu-spice.h"
  64
  65//#define DEBUG
  66//#define DEBUG_COMPLETION
  67
  68/*
  69 * Supported types:
  70 *
  71 * 'F'          filename
  72 * 'B'          block device name
  73 * 's'          string (accept optional quote)
  74 * 'O'          option string of the form NAME=VALUE,...
  75 *              parsed according to QemuOptsList given by its name
  76 *              Example: 'device:O' uses qemu_device_opts.
  77 *              Restriction: only lists with empty desc are supported
  78 *              TODO lift the restriction
  79 * 'i'          32 bit integer
  80 * 'l'          target long (32 or 64 bit)
  81 * 'M'          just like 'l', except in user mode the value is
  82 *              multiplied by 2^20 (think Mebibyte)
  83 * 'o'          octets (aka bytes)
  84 *              user mode accepts an optional T, t, G, g, M, m, K, k
  85 *              suffix, which multiplies the value by 2^40 for
  86 *              suffixes T and t, 2^30 for suffixes G and g, 2^20 for
  87 *              M and m, 2^10 for K and k
  88 * 'T'          double
  89 *              user mode accepts an optional ms, us, ns suffix,
  90 *              which divides the value by 1e3, 1e6, 1e9, respectively
  91 * '/'          optional gdb-like print format (like "/10x")
  92 *
  93 * '?'          optional type (for all types, except '/')
  94 * '.'          other form of optional type (for 'i' and 'l')
  95 * 'b'          boolean
  96 *              user mode accepts "on" or "off"
  97 * '-'          optional parameter (eg. '-f')
  98 *
  99 */
 100
 101typedef struct MonitorCompletionData MonitorCompletionData;
 102struct MonitorCompletionData {
 103    Monitor *mon;
 104    void (*user_print)(Monitor *mon, const QObject *data);
 105};
 106
 107typedef struct mon_cmd_t {
 108    const char *name;
 109    const char *args_type;
 110    const char *params;
 111    const char *help;
 112    void (*user_print)(Monitor *mon, const QObject *data);
 113    union {
 114        void (*info)(Monitor *mon);
 115        void (*info_new)(Monitor *mon, QObject **ret_data);
 116        int  (*info_async)(Monitor *mon, MonitorCompletion *cb, void *opaque);
 117        void (*cmd)(Monitor *mon, const QDict *qdict);
 118        int  (*cmd_new)(Monitor *mon, const QDict *params, QObject **ret_data);
 119        int  (*cmd_async)(Monitor *mon, const QDict *params,
 120                          MonitorCompletion *cb, void *opaque);
 121    } mhandler;
 122    int flags;
 123} mon_cmd_t;
 124
 125/* file descriptors passed via SCM_RIGHTS */
 126typedef struct mon_fd_t mon_fd_t;
 127struct mon_fd_t {
 128    char *name;
 129    int fd;
 130    QLIST_ENTRY(mon_fd_t) next;
 131};
 132
 133typedef struct MonitorControl {
 134    QObject *id;
 135    JSONMessageParser parser;
 136    int command_mode;
 137} MonitorControl;
 138
 139struct Monitor {
 140    CharDriverState *chr;
 141    int mux_out;
 142    int reset_seen;
 143    int flags;
 144    int suspend_cnt;
 145    uint8_t outbuf[1024];
 146    int outbuf_index;
 147    ReadLineState *rs;
 148    MonitorControl *mc;
 149    CPUState *mon_cpu;
 150    BlockDriverCompletionFunc *password_completion_cb;
 151    void *password_opaque;
 152#ifdef CONFIG_DEBUG_MONITOR
 153    int print_calls_nr;
 154#endif
 155    QError *error;
 156    QLIST_HEAD(,mon_fd_t) fds;
 157    QLIST_ENTRY(Monitor) entry;
 158};
 159
 160#ifdef CONFIG_DEBUG_MONITOR
 161#define MON_DEBUG(fmt, ...) do {    \
 162    fprintf(stderr, "Monitor: ");       \
 163    fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
 164
 165static inline void mon_print_count_inc(Monitor *mon)
 166{
 167    mon->print_calls_nr++;
 168}
 169
 170static inline void mon_print_count_init(Monitor *mon)
 171{
 172    mon->print_calls_nr = 0;
 173}
 174
 175static inline int mon_print_count_get(const Monitor *mon)
 176{
 177    return mon->print_calls_nr;
 178}
 179
 180#else /* !CONFIG_DEBUG_MONITOR */
 181#define MON_DEBUG(fmt, ...) do { } while (0)
 182static inline void mon_print_count_inc(Monitor *mon) { }
 183static inline void mon_print_count_init(Monitor *mon) { }
 184static inline int mon_print_count_get(const Monitor *mon) { return 0; }
 185#endif /* CONFIG_DEBUG_MONITOR */
 186
 187/* QMP checker flags */
 188#define QMP_ACCEPT_UNKNOWNS 1
 189
 190static QLIST_HEAD(mon_list, Monitor) mon_list;
 191
 192static const mon_cmd_t mon_cmds[];
 193static const mon_cmd_t info_cmds[];
 194
 195static const mon_cmd_t qmp_cmds[];
 196static const mon_cmd_t qmp_query_cmds[];
 197
 198Monitor *cur_mon;
 199Monitor *default_mon;
 200
 201static void monitor_command_cb(Monitor *mon, const char *cmdline,
 202                               void *opaque);
 203
 204static inline int qmp_cmd_mode(const Monitor *mon)
 205{
 206    return (mon->mc ? mon->mc->command_mode : 0);
 207}
 208
 209/* Return true if in control mode, false otherwise */
 210static inline int monitor_ctrl_mode(const Monitor *mon)
 211{
 212    return (mon->flags & MONITOR_USE_CONTROL);
 213}
 214
 215/* Return non-zero iff we have a current monitor, and it is in QMP mode.  */
 216int monitor_cur_is_qmp(void)
 217{
 218    return cur_mon && monitor_ctrl_mode(cur_mon);
 219}
 220
 221static void monitor_read_command(Monitor *mon, int show_prompt)
 222{
 223    if (!mon->rs)
 224        return;
 225
 226    readline_start(mon->rs, "(qemu) ", 0, monitor_command_cb, NULL);
 227    if (show_prompt)
 228        readline_show_prompt(mon->rs);
 229}
 230
 231static int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
 232                                 void *opaque)
 233{
 234    if (monitor_ctrl_mode(mon)) {
 235        qerror_report(QERR_MISSING_PARAMETER, "password");
 236        return -EINVAL;
 237    } else if (mon->rs) {
 238        readline_start(mon->rs, "Password: ", 1, readline_func, opaque);
 239        /* prompt is printed on return from the command handler */
 240        return 0;
 241    } else {
 242        monitor_printf(mon, "terminal does not support password prompting\n");
 243        return -ENOTTY;
 244    }
 245}
 246
 247void monitor_flush(Monitor *mon)
 248{
 249    if (mon && mon->outbuf_index != 0 && !mon->mux_out) {
 250        qemu_chr_write(mon->chr, mon->outbuf, mon->outbuf_index);
 251        mon->outbuf_index = 0;
 252    }
 253}
 254
 255/* flush at every end of line or if the buffer is full */
 256static void monitor_puts(Monitor *mon, const char *str)
 257{
 258    char c;
 259
 260    for(;;) {
 261        c = *str++;
 262        if (c == '\0')
 263            break;
 264        if (c == '\n')
 265            mon->outbuf[mon->outbuf_index++] = '\r';
 266        mon->outbuf[mon->outbuf_index++] = c;
 267        if (mon->outbuf_index >= (sizeof(mon->outbuf) - 1)
 268            || c == '\n')
 269            monitor_flush(mon);
 270    }
 271}
 272
 273void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
 274{
 275    char buf[4096];
 276
 277    if (!mon)
 278        return;
 279
 280    mon_print_count_inc(mon);
 281
 282    if (monitor_ctrl_mode(mon)) {
 283        return;
 284    }
 285
 286    vsnprintf(buf, sizeof(buf), fmt, ap);
 287    monitor_puts(mon, buf);
 288}
 289
 290void monitor_printf(Monitor *mon, const char *fmt, ...)
 291{
 292    va_list ap;
 293    va_start(ap, fmt);
 294    monitor_vprintf(mon, fmt, ap);
 295    va_end(ap);
 296}
 297
 298void monitor_print_filename(Monitor *mon, const char *filename)
 299{
 300    int i;
 301
 302    for (i = 0; filename[i]; i++) {
 303        switch (filename[i]) {
 304        case ' ':
 305        case '"':
 306        case '\\':
 307            monitor_printf(mon, "\\%c", filename[i]);
 308            break;
 309        case '\t':
 310            monitor_printf(mon, "\\t");
 311            break;
 312        case '\r':
 313            monitor_printf(mon, "\\r");
 314            break;
 315        case '\n':
 316            monitor_printf(mon, "\\n");
 317            break;
 318        default:
 319            monitor_printf(mon, "%c", filename[i]);
 320            break;
 321        }
 322    }
 323}
 324
 325static int GCC_FMT_ATTR(2, 3) monitor_fprintf(FILE *stream,
 326                                              const char *fmt, ...)
 327{
 328    va_list ap;
 329    va_start(ap, fmt);
 330    monitor_vprintf((Monitor *)stream, fmt, ap);
 331    va_end(ap);
 332    return 0;
 333}
 334
 335static void monitor_user_noop(Monitor *mon, const QObject *data) { }
 336
 337static inline int handler_is_qobject(const mon_cmd_t *cmd)
 338{
 339    return cmd->user_print != NULL;
 340}
 341
 342static inline bool handler_is_async(const mon_cmd_t *cmd)
 343{
 344    return cmd->flags & MONITOR_CMD_ASYNC;
 345}
 346
 347static inline int monitor_has_error(const Monitor *mon)
 348{
 349    return mon->error != NULL;
 350}
 351
 352static void monitor_json_emitter(Monitor *mon, const QObject *data)
 353{
 354    QString *json;
 355
 356    json = mon->flags & MONITOR_USE_PRETTY ? qobject_to_json_pretty(data) :
 357                                             qobject_to_json(data);
 358    assert(json != NULL);
 359
 360    qstring_append_chr(json, '\n');
 361    monitor_puts(mon, qstring_get_str(json));
 362
 363    QDECREF(json);
 364}
 365
 366static void monitor_protocol_emitter(Monitor *mon, QObject *data)
 367{
 368    QDict *qmp;
 369
 370    qmp = qdict_new();
 371
 372    if (!monitor_has_error(mon)) {
 373        /* success response */
 374        if (data) {
 375            qobject_incref(data);
 376            qdict_put_obj(qmp, "return", data);
 377        } else {
 378            /* return an empty QDict by default */
 379            qdict_put(qmp, "return", qdict_new());
 380        }
 381    } else {
 382        /* error response */
 383        qdict_put(mon->error->error, "desc", qerror_human(mon->error));
 384        qdict_put(qmp, "error", mon->error->error);
 385        QINCREF(mon->error->error);
 386        QDECREF(mon->error);
 387        mon->error = NULL;
 388    }
 389
 390    if (mon->mc->id) {
 391        qdict_put_obj(qmp, "id", mon->mc->id);
 392        mon->mc->id = NULL;
 393    }
 394
 395    monitor_json_emitter(mon, QOBJECT(qmp));
 396    QDECREF(qmp);
 397}
 398
 399static void timestamp_put(QDict *qdict)
 400{
 401    int err;
 402    QObject *obj;
 403    qemu_timeval tv;
 404
 405    err = qemu_gettimeofday(&tv);
 406    if (err < 0)
 407        return;
 408
 409    obj = qobject_from_jsonf("{ 'seconds': %" PRId64 ", "
 410                                "'microseconds': %" PRId64 " }",
 411                                (int64_t) tv.tv_sec, (int64_t) tv.tv_usec);
 412    qdict_put_obj(qdict, "timestamp", obj);
 413}
 414
 415/**
 416 * monitor_protocol_event(): Generate a Monitor event
 417 *
 418 * Event-specific data can be emitted through the (optional) 'data' parameter.
 419 */
 420void monitor_protocol_event(MonitorEvent event, QObject *data)
 421{
 422    QDict *qmp;
 423    const char *event_name;
 424    Monitor *mon;
 425
 426    assert(event < QEVENT_MAX);
 427
 428    switch (event) {
 429        case QEVENT_SHUTDOWN:
 430            event_name = "SHUTDOWN";
 431            break;
 432        case QEVENT_RESET:
 433            event_name = "RESET";
 434            break;
 435        case QEVENT_POWERDOWN:
 436            event_name = "POWERDOWN";
 437            break;
 438        case QEVENT_STOP:
 439            event_name = "STOP";
 440            break;
 441        case QEVENT_RESUME:
 442            event_name = "RESUME";
 443            break;
 444        case QEVENT_VNC_CONNECTED:
 445            event_name = "VNC_CONNECTED";
 446            break;
 447        case QEVENT_VNC_INITIALIZED:
 448            event_name = "VNC_INITIALIZED";
 449            break;
 450        case QEVENT_VNC_DISCONNECTED:
 451            event_name = "VNC_DISCONNECTED";
 452            break;
 453        case QEVENT_BLOCK_IO_ERROR:
 454            event_name = "BLOCK_IO_ERROR";
 455            break;
 456        case QEVENT_RTC_CHANGE:
 457            event_name = "RTC_CHANGE";
 458            break;
 459        case QEVENT_WATCHDOG:
 460            event_name = "WATCHDOG";
 461            break;
 462        case QEVENT_SPICE_CONNECTED:
 463            event_name = "SPICE_CONNECTED";
 464            break;
 465        case QEVENT_SPICE_INITIALIZED:
 466            event_name = "SPICE_INITIALIZED";
 467            break;
 468        case QEVENT_SPICE_DISCONNECTED:
 469            event_name = "SPICE_DISCONNECTED";
 470            break;
 471        default:
 472            abort();
 473            break;
 474    }
 475
 476    qmp = qdict_new();
 477    timestamp_put(qmp);
 478    qdict_put(qmp, "event", qstring_from_str(event_name));
 479    if (data) {
 480        qobject_incref(data);
 481        qdict_put_obj(qmp, "data", data);
 482    }
 483
 484    QLIST_FOREACH(mon, &mon_list, entry) {
 485        if (monitor_ctrl_mode(mon) && qmp_cmd_mode(mon)) {
 486            monitor_json_emitter(mon, QOBJECT(qmp));
 487        }
 488    }
 489    QDECREF(qmp);
 490}
 491
 492static int do_qmp_capabilities(Monitor *mon, const QDict *params,
 493                               QObject **ret_data)
 494{
 495    /* Will setup QMP capabilities in the future */
 496    if (monitor_ctrl_mode(mon)) {
 497        mon->mc->command_mode = 1;
 498    }
 499
 500    return 0;
 501}
 502
 503static int mon_set_cpu(int cpu_index);
 504static void handle_user_command(Monitor *mon, const char *cmdline);
 505
 506static int do_hmp_passthrough(Monitor *mon, const QDict *params,
 507                              QObject **ret_data)
 508{
 509    int ret = 0;
 510    Monitor *old_mon, hmp;
 511    CharDriverState mchar;
 512
 513    memset(&hmp, 0, sizeof(hmp));
 514    qemu_chr_init_mem(&mchar);
 515    hmp.chr = &mchar;
 516
 517    old_mon = cur_mon;
 518    cur_mon = &hmp;
 519
 520    if (qdict_haskey(params, "cpu-index")) {
 521        ret = mon_set_cpu(qdict_get_int(params, "cpu-index"));
 522        if (ret < 0) {
 523            cur_mon = old_mon;
 524            qerror_report(QERR_INVALID_PARAMETER_VALUE, "cpu-index", "a CPU number");
 525            goto out;
 526        }
 527    }
 528
 529    handle_user_command(&hmp, qdict_get_str(params, "command-line"));
 530    cur_mon = old_mon;
 531
 532    if (qemu_chr_mem_osize(hmp.chr) > 0) {
 533        *ret_data = QOBJECT(qemu_chr_mem_to_qs(hmp.chr));
 534    }
 535
 536out:
 537    qemu_chr_close_mem(hmp.chr);
 538    return ret;
 539}
 540
 541static int compare_cmd(const char *name, const char *list)
 542{
 543    const char *p, *pstart;
 544    int len;
 545    len = strlen(name);
 546    p = list;
 547    for(;;) {
 548        pstart = p;
 549        p = strchr(p, '|');
 550        if (!p)
 551            p = pstart + strlen(pstart);
 552        if ((p - pstart) == len && !memcmp(pstart, name, len))
 553            return 1;
 554        if (*p == '\0')
 555            break;
 556        p++;
 557    }
 558    return 0;
 559}
 560
 561static void help_cmd_dump(Monitor *mon, const mon_cmd_t *cmds,
 562                          const char *prefix, const char *name)
 563{
 564    const mon_cmd_t *cmd;
 565
 566    for(cmd = cmds; cmd->name != NULL; cmd++) {
 567        if (!name || !strcmp(name, cmd->name))
 568            monitor_printf(mon, "%s%s %s -- %s\n", prefix, cmd->name,
 569                           cmd->params, cmd->help);
 570    }
 571}
 572
 573static void help_cmd(Monitor *mon, const char *name)
 574{
 575    if (name && !strcmp(name, "info")) {
 576        help_cmd_dump(mon, info_cmds, "info ", NULL);
 577    } else {
 578        help_cmd_dump(mon, mon_cmds, "", name);
 579        if (name && !strcmp(name, "log")) {
 580            const CPULogItem *item;
 581            monitor_printf(mon, "Log items (comma separated):\n");
 582            monitor_printf(mon, "%-10s %s\n", "none", "remove all logs");
 583            for(item = cpu_log_items; item->mask != 0; item++) {
 584                monitor_printf(mon, "%-10s %s\n", item->name, item->help);
 585            }
 586        }
 587    }
 588}
 589
 590static void do_help_cmd(Monitor *mon, const QDict *qdict)
 591{
 592    help_cmd(mon, qdict_get_try_str(qdict, "name"));
 593}
 594
 595#ifdef CONFIG_SIMPLE_TRACE
 596static void do_change_trace_event_state(Monitor *mon, const QDict *qdict)
 597{
 598    const char *tp_name = qdict_get_str(qdict, "name");
 599    bool new_state = qdict_get_bool(qdict, "option");
 600    int ret = st_change_trace_event_state(tp_name, new_state);
 601
 602    if (!ret) {
 603        monitor_printf(mon, "unknown event name \"%s\"\n", tp_name);
 604    }
 605}
 606
 607static void do_trace_file(Monitor *mon, const QDict *qdict)
 608{
 609    const char *op = qdict_get_try_str(qdict, "op");
 610    const char *arg = qdict_get_try_str(qdict, "arg");
 611
 612    if (!op) {
 613        st_print_trace_file_status((FILE *)mon, &monitor_fprintf);
 614    } else if (!strcmp(op, "on")) {
 615        st_set_trace_file_enabled(true);
 616    } else if (!strcmp(op, "off")) {
 617        st_set_trace_file_enabled(false);
 618    } else if (!strcmp(op, "flush")) {
 619        st_flush_trace_buffer();
 620    } else if (!strcmp(op, "set")) {
 621        if (arg) {
 622            st_set_trace_file(arg);
 623        }
 624    } else {
 625        monitor_printf(mon, "unexpected argument \"%s\"\n", op);
 626        help_cmd(mon, "trace-file");
 627    }
 628}
 629#endif
 630
 631static void user_monitor_complete(void *opaque, QObject *ret_data)
 632{
 633    MonitorCompletionData *data = (MonitorCompletionData *)opaque; 
 634
 635    if (ret_data) {
 636        data->user_print(data->mon, ret_data);
 637    }
 638    monitor_resume(data->mon);
 639    qemu_free(data);
 640}
 641
 642static void qmp_monitor_complete(void *opaque, QObject *ret_data)
 643{
 644    monitor_protocol_emitter(opaque, ret_data);
 645}
 646
 647static int qmp_async_cmd_handler(Monitor *mon, const mon_cmd_t *cmd,
 648                                 const QDict *params)
 649{
 650    return cmd->mhandler.cmd_async(mon, params, qmp_monitor_complete, mon);
 651}
 652
 653static void qmp_async_info_handler(Monitor *mon, const mon_cmd_t *cmd)
 654{
 655    cmd->mhandler.info_async(mon, qmp_monitor_complete, mon);
 656}
 657
 658static void user_async_cmd_handler(Monitor *mon, const mon_cmd_t *cmd,
 659                                   const QDict *params)
 660{
 661    int ret;
 662
 663    MonitorCompletionData *cb_data = qemu_malloc(sizeof(*cb_data));
 664    cb_data->mon = mon;
 665    cb_data->user_print = cmd->user_print;
 666    monitor_suspend(mon);
 667    ret = cmd->mhandler.cmd_async(mon, params,
 668                                  user_monitor_complete, cb_data);
 669    if (ret < 0) {
 670        monitor_resume(mon);
 671        qemu_free(cb_data);
 672    }
 673}
 674
 675static void user_async_info_handler(Monitor *mon, const mon_cmd_t *cmd)
 676{
 677    int ret;
 678
 679    MonitorCompletionData *cb_data = qemu_malloc(sizeof(*cb_data));
 680    cb_data->mon = mon;
 681    cb_data->user_print = cmd->user_print;
 682    monitor_suspend(mon);
 683    ret = cmd->mhandler.info_async(mon, user_monitor_complete, cb_data);
 684    if (ret < 0) {
 685        monitor_resume(mon);
 686        qemu_free(cb_data);
 687    }
 688}
 689
 690static void do_info(Monitor *mon, const QDict *qdict)
 691{
 692    const mon_cmd_t *cmd;
 693    const char *item = qdict_get_try_str(qdict, "item");
 694
 695    if (!item) {
 696        goto help;
 697    }
 698
 699    for (cmd = info_cmds; cmd->name != NULL; cmd++) {
 700        if (compare_cmd(item, cmd->name))
 701            break;
 702    }
 703
 704    if (cmd->name == NULL) {
 705        goto help;
 706    }
 707
 708    if (handler_is_async(cmd)) {
 709        user_async_info_handler(mon, cmd);
 710    } else if (handler_is_qobject(cmd)) {
 711        QObject *info_data = NULL;
 712
 713        cmd->mhandler.info_new(mon, &info_data);
 714        if (info_data) {
 715            cmd->user_print(mon, info_data);
 716            qobject_decref(info_data);
 717        }
 718    } else {
 719        cmd->mhandler.info(mon);
 720    }
 721
 722    return;
 723
 724help:
 725    help_cmd(mon, "info");
 726}
 727
 728static void do_info_version_print(Monitor *mon, const QObject *data)
 729{
 730    QDict *qdict;
 731    QDict *qemu;
 732
 733    qdict = qobject_to_qdict(data);
 734    qemu = qdict_get_qdict(qdict, "qemu");
 735
 736    monitor_printf(mon, "%" PRId64 ".%" PRId64 ".%" PRId64 "%s\n",
 737                  qdict_get_int(qemu, "major"),
 738                  qdict_get_int(qemu, "minor"),
 739                  qdict_get_int(qemu, "micro"),
 740                  qdict_get_str(qdict, "package"));
 741}
 742
 743static void do_info_version(Monitor *mon, QObject **ret_data)
 744{
 745    const char *version = QEMU_VERSION;
 746    int major = 0, minor = 0, micro = 0;
 747    char *tmp;
 748
 749    major = strtol(version, &tmp, 10);
 750    tmp++;
 751    minor = strtol(tmp, &tmp, 10);
 752    tmp++;
 753    micro = strtol(tmp, &tmp, 10);
 754
 755    *ret_data = qobject_from_jsonf("{ 'qemu': { 'major': %d, 'minor': %d, \
 756        'micro': %d }, 'package': %s }", major, minor, micro, QEMU_PKGVERSION);
 757}
 758
 759static void do_info_name_print(Monitor *mon, const QObject *data)
 760{
 761    QDict *qdict;
 762
 763    qdict = qobject_to_qdict(data);
 764    if (qdict_size(qdict) == 0) {
 765        return;
 766    }
 767
 768    monitor_printf(mon, "%s\n", qdict_get_str(qdict, "name"));
 769}
 770
 771static void do_info_name(Monitor *mon, QObject **ret_data)
 772{
 773    *ret_data = qemu_name ? qobject_from_jsonf("{'name': %s }", qemu_name) :
 774                            qobject_from_jsonf("{}");
 775}
 776
 777static QObject *get_cmd_dict(const char *name)
 778{
 779    const char *p;
 780
 781    /* Remove '|' from some commands */
 782    p = strchr(name, '|');
 783    if (p) {
 784        p++;
 785    } else {
 786        p = name;
 787    }
 788
 789    return qobject_from_jsonf("{ 'name': %s }", p);
 790}
 791
 792static void do_info_commands(Monitor *mon, QObject **ret_data)
 793{
 794    QList *cmd_list;
 795    const mon_cmd_t *cmd;
 796
 797    cmd_list = qlist_new();
 798
 799    for (cmd = qmp_cmds; cmd->name != NULL; cmd++) {
 800        qlist_append_obj(cmd_list, get_cmd_dict(cmd->name));
 801    }
 802
 803    for (cmd = qmp_query_cmds; cmd->name != NULL; cmd++) {
 804        char buf[128];
 805        snprintf(buf, sizeof(buf), "query-%s", cmd->name);
 806        qlist_append_obj(cmd_list, get_cmd_dict(buf));
 807    }
 808
 809    *ret_data = QOBJECT(cmd_list);
 810}
 811
 812static void do_info_uuid_print(Monitor *mon, const QObject *data)
 813{
 814    monitor_printf(mon, "%s\n", qdict_get_str(qobject_to_qdict(data), "UUID"));
 815}
 816
 817static void do_info_uuid(Monitor *mon, QObject **ret_data)
 818{
 819    char uuid[64];
 820
 821    snprintf(uuid, sizeof(uuid), UUID_FMT, qemu_uuid[0], qemu_uuid[1],
 822                   qemu_uuid[2], qemu_uuid[3], qemu_uuid[4], qemu_uuid[5],
 823                   qemu_uuid[6], qemu_uuid[7], qemu_uuid[8], qemu_uuid[9],
 824                   qemu_uuid[10], qemu_uuid[11], qemu_uuid[12], qemu_uuid[13],
 825                   qemu_uuid[14], qemu_uuid[15]);
 826    *ret_data = qobject_from_jsonf("{ 'UUID': %s }", uuid);
 827}
 828
 829/* get the current CPU defined by the user */
 830static int mon_set_cpu(int cpu_index)
 831{
 832    CPUState *env;
 833
 834    for(env = first_cpu; env != NULL; env = env->next_cpu) {
 835        if (env->cpu_index == cpu_index) {
 836            cur_mon->mon_cpu = env;
 837            return 0;
 838        }
 839    }
 840    return -1;
 841}
 842
 843static CPUState *mon_get_cpu(void)
 844{
 845    if (!cur_mon->mon_cpu) {
 846        mon_set_cpu(0);
 847    }
 848    cpu_synchronize_state(cur_mon->mon_cpu);
 849    return cur_mon->mon_cpu;
 850}
 851
 852static void do_info_registers(Monitor *mon)
 853{
 854    CPUState *env;
 855    env = mon_get_cpu();
 856#ifdef TARGET_I386
 857    cpu_dump_state(env, (FILE *)mon, monitor_fprintf,
 858                   X86_DUMP_FPU);
 859#else
 860    cpu_dump_state(env, (FILE *)mon, monitor_fprintf,
 861                   0);
 862#endif
 863}
 864
 865static void print_cpu_iter(QObject *obj, void *opaque)
 866{
 867    QDict *cpu;
 868    int active = ' ';
 869    Monitor *mon = opaque;
 870
 871    assert(qobject_type(obj) == QTYPE_QDICT);
 872    cpu = qobject_to_qdict(obj);
 873
 874    if (qdict_get_bool(cpu, "current")) {
 875        active = '*';
 876    }
 877
 878    monitor_printf(mon, "%c CPU #%d: ", active, (int)qdict_get_int(cpu, "CPU"));
 879
 880#if defined(TARGET_I386)
 881    monitor_printf(mon, "pc=0x" TARGET_FMT_lx,
 882                   (target_ulong) qdict_get_int(cpu, "pc"));
 883#elif defined(TARGET_PPC)
 884    monitor_printf(mon, "nip=0x" TARGET_FMT_lx,
 885                   (target_long) qdict_get_int(cpu, "nip"));
 886#elif defined(TARGET_SPARC)
 887    monitor_printf(mon, "pc=0x " TARGET_FMT_lx,
 888                   (target_long) qdict_get_int(cpu, "pc"));
 889    monitor_printf(mon, "npc=0x" TARGET_FMT_lx,
 890                   (target_long) qdict_get_int(cpu, "npc"));
 891#elif defined(TARGET_MIPS)
 892    monitor_printf(mon, "PC=0x" TARGET_FMT_lx,
 893                   (target_long) qdict_get_int(cpu, "PC"));
 894#endif
 895
 896    if (qdict_get_bool(cpu, "halted")) {
 897        monitor_printf(mon, " (halted)");
 898    }
 899
 900    monitor_printf(mon, " thread_id=%" PRId64 " ",
 901                   qdict_get_int(cpu, "thread_id"));
 902
 903    monitor_printf(mon, "\n");
 904}
 905
 906static void monitor_print_cpus(Monitor *mon, const QObject *data)
 907{
 908    QList *cpu_list;
 909
 910    assert(qobject_type(data) == QTYPE_QLIST);
 911    cpu_list = qobject_to_qlist(data);
 912    qlist_iter(cpu_list, print_cpu_iter, mon);
 913}
 914
 915static void do_info_cpus(Monitor *mon, QObject **ret_data)
 916{
 917    CPUState *env;
 918    QList *cpu_list;
 919
 920    cpu_list = qlist_new();
 921
 922    /* just to set the default cpu if not already done */
 923    mon_get_cpu();
 924
 925    for(env = first_cpu; env != NULL; env = env->next_cpu) {
 926        QDict *cpu;
 927        QObject *obj;
 928
 929        cpu_synchronize_state(env);
 930
 931        obj = qobject_from_jsonf("{ 'CPU': %d, 'current': %i, 'halted': %i }",
 932                                 env->cpu_index, env == mon->mon_cpu,
 933                                 env->halted);
 934
 935        cpu = qobject_to_qdict(obj);
 936
 937#if defined(TARGET_I386)
 938        qdict_put(cpu, "pc", qint_from_int(env->eip + env->segs[R_CS].base));
 939#elif defined(TARGET_PPC)
 940        qdict_put(cpu, "nip", qint_from_int(env->nip));
 941#elif defined(TARGET_SPARC)
 942        qdict_put(cpu, "pc", qint_from_int(env->pc));
 943        qdict_put(cpu, "npc", qint_from_int(env->npc));
 944#elif defined(TARGET_MIPS)
 945        qdict_put(cpu, "PC", qint_from_int(env->active_tc.PC));
 946#endif
 947        qdict_put(cpu, "thread_id", qint_from_int(env->thread_id));
 948
 949        qlist_append(cpu_list, cpu);
 950    }
 951
 952    *ret_data = QOBJECT(cpu_list);
 953}
 954
 955static int do_cpu_set(Monitor *mon, const QDict *qdict, QObject **ret_data)
 956{
 957    int index = qdict_get_int(qdict, "index");
 958    if (mon_set_cpu(index) < 0) {
 959        qerror_report(QERR_INVALID_PARAMETER_VALUE, "index",
 960                      "a CPU number");
 961        return -1;
 962    }
 963    return 0;
 964}
 965
 966static void do_info_jit(Monitor *mon)
 967{
 968    dump_exec_info((FILE *)mon, monitor_fprintf);
 969}
 970
 971static void do_info_history(Monitor *mon)
 972{
 973    int i;
 974    const char *str;
 975
 976    if (!mon->rs)
 977        return;
 978    i = 0;
 979    for(;;) {
 980        str = readline_get_history(mon->rs, i);
 981        if (!str)
 982            break;
 983        monitor_printf(mon, "%d: '%s'\n", i, str);
 984        i++;
 985    }
 986}
 987
 988#if defined(TARGET_PPC)
 989/* XXX: not implemented in other targets */
 990static void do_info_cpu_stats(Monitor *mon)
 991{
 992    CPUState *env;
 993
 994    env = mon_get_cpu();
 995    cpu_dump_statistics(env, (FILE *)mon, &monitor_fprintf, 0);
 996}
 997#endif
 998
 999#if defined(CONFIG_SIMPLE_TRACE)
1000static void do_info_trace(Monitor *mon)
1001{
1002    st_print_trace((FILE *)mon, &monitor_fprintf);
1003}
1004
1005static void do_info_trace_events(Monitor *mon)
1006{
1007    st_print_trace_events((FILE *)mon, &monitor_fprintf);
1008}
1009#endif
1010
1011/**
1012 * do_quit(): Quit QEMU execution
1013 */
1014static int do_quit(Monitor *mon, const QDict *qdict, QObject **ret_data)
1015{
1016    monitor_suspend(mon);
1017    no_shutdown = 0;
1018    qemu_system_shutdown_request();
1019
1020    return 0;
1021}
1022
1023#ifdef CONFIG_VNC
1024static int change_vnc_password(const char *password)
1025{
1026    if (!password || !password[0]) {
1027        if (vnc_display_disable_login(NULL)) {
1028            qerror_report(QERR_SET_PASSWD_FAILED);
1029            return -1;
1030        }
1031        return 0;
1032    }
1033
1034    if (vnc_display_password(NULL, password) < 0) {
1035        qerror_report(QERR_SET_PASSWD_FAILED);
1036        return -1;
1037    }
1038
1039    return 0;
1040}
1041
1042static void change_vnc_password_cb(Monitor *mon, const char *password,
1043                                   void *opaque)
1044{
1045    change_vnc_password(password);
1046    monitor_read_command(mon, 1);
1047}
1048
1049static int do_change_vnc(Monitor *mon, const char *target, const char *arg)
1050{
1051    if (strcmp(target, "passwd") == 0 ||
1052        strcmp(target, "password") == 0) {
1053        if (arg) {
1054            char password[9];
1055            strncpy(password, arg, sizeof(password));
1056            password[sizeof(password) - 1] = '\0';
1057            return change_vnc_password(password);
1058        } else {
1059            return monitor_read_password(mon, change_vnc_password_cb, NULL);
1060        }
1061    } else {
1062        if (vnc_display_open(NULL, target) < 0) {
1063            qerror_report(QERR_VNC_SERVER_FAILED, target);
1064            return -1;
1065        }
1066    }
1067
1068    return 0;
1069}
1070#else
1071static int do_change_vnc(Monitor *mon, const char *target, const char *arg)
1072{
1073    qerror_report(QERR_FEATURE_DISABLED, "vnc");
1074    return -ENODEV;
1075}
1076#endif
1077
1078/**
1079 * do_change(): Change a removable medium, or VNC configuration
1080 */
1081static int do_change(Monitor *mon, const QDict *qdict, QObject **ret_data)
1082{
1083    const char *device = qdict_get_str(qdict, "device");
1084    const char *target = qdict_get_str(qdict, "target");
1085    const char *arg = qdict_get_try_str(qdict, "arg");
1086    int ret;
1087
1088    if (strcmp(device, "vnc") == 0) {
1089        ret = do_change_vnc(mon, target, arg);
1090    } else {
1091        ret = do_change_block(mon, device, target, arg);
1092    }
1093
1094    return ret;
1095}
1096
1097static int set_password(Monitor *mon, const QDict *qdict, QObject **ret_data)
1098{
1099    const char *protocol  = qdict_get_str(qdict, "protocol");
1100    const char *password  = qdict_get_str(qdict, "password");
1101    const char *connected = qdict_get_try_str(qdict, "connected");
1102    int disconnect_if_connected = 0;
1103    int fail_if_connected = 0;
1104    int rc;
1105
1106    if (connected) {
1107        if (strcmp(connected, "fail") == 0) {
1108            fail_if_connected = 1;
1109        } else if (strcmp(connected, "disconnect") == 0) {
1110            disconnect_if_connected = 1;
1111        } else if (strcmp(connected, "keep") == 0) {
1112            /* nothing */
1113        } else {
1114            qerror_report(QERR_INVALID_PARAMETER, "connected");
1115            return -1;
1116        }
1117    }
1118
1119    if (strcmp(protocol, "spice") == 0) {
1120        if (!using_spice) {
1121            /* correct one? spice isn't a device ,,, */
1122            qerror_report(QERR_DEVICE_NOT_ACTIVE, "spice");
1123            return -1;
1124        }
1125        rc = qemu_spice_set_passwd(password, fail_if_connected,
1126                                   disconnect_if_connected);
1127        if (rc != 0) {
1128            qerror_report(QERR_SET_PASSWD_FAILED);
1129            return -1;
1130        }
1131        return 0;
1132    }
1133
1134    if (strcmp(protocol, "vnc") == 0) {
1135        if (fail_if_connected || disconnect_if_connected) {
1136            /* vnc supports "connected=keep" only */
1137            qerror_report(QERR_INVALID_PARAMETER, "connected");
1138            return -1;
1139        }
1140        /* Note that setting an empty password will not disable login through
1141         * this interface. */
1142        return vnc_display_password(NULL, password);
1143    }
1144
1145    qerror_report(QERR_INVALID_PARAMETER, "protocol");
1146    return -1;
1147}
1148
1149static int expire_password(Monitor *mon, const QDict *qdict, QObject **ret_data)
1150{
1151    const char *protocol  = qdict_get_str(qdict, "protocol");
1152    const char *whenstr = qdict_get_str(qdict, "time");
1153    time_t when;
1154    int rc;
1155
1156    if (strcmp(whenstr, "now") == 0) {
1157        when = 0;
1158    } else if (strcmp(whenstr, "never") == 0) {
1159        when = TIME_MAX;
1160    } else if (whenstr[0] == '+') {
1161        when = time(NULL) + strtoull(whenstr+1, NULL, 10);
1162    } else {
1163        when = strtoull(whenstr, NULL, 10);
1164    }
1165
1166    if (strcmp(protocol, "spice") == 0) {
1167        if (!using_spice) {
1168            /* correct one? spice isn't a device ,,, */
1169            qerror_report(QERR_DEVICE_NOT_ACTIVE, "spice");
1170            return -1;
1171        }
1172        rc = qemu_spice_set_pw_expire(when);
1173        if (rc != 0) {
1174            qerror_report(QERR_SET_PASSWD_FAILED);
1175            return -1;
1176        }
1177        return 0;
1178    }
1179
1180    if (strcmp(protocol, "vnc") == 0) {
1181        return vnc_display_pw_expire(NULL, when);
1182    }
1183
1184    qerror_report(QERR_INVALID_PARAMETER, "protocol");
1185    return -1;
1186}
1187
1188static int add_graphics_client(Monitor *mon, const QDict *qdict, QObject **ret_data)
1189{
1190    const char *protocol  = qdict_get_str(qdict, "protocol");
1191    const char *fdname = qdict_get_str(qdict, "fdname");
1192    int skipauth = qdict_get_try_bool(qdict, "skipauth", 0);
1193    CharDriverState *s;
1194
1195    if (strcmp(protocol, "spice") == 0) {
1196        if (!using_spice) {
1197            /* correct one? spice isn't a device ,,, */
1198            qerror_report(QERR_DEVICE_NOT_ACTIVE, "spice");
1199            return -1;
1200        }
1201        qerror_report(QERR_ADD_CLIENT_FAILED);
1202        return -1;
1203    } else if (strcmp(protocol, "vnc") == 0) {
1204        int fd = monitor_get_fd(mon, fdname);
1205        vnc_display_add_client(NULL, fd, skipauth);
1206        return 0;
1207    } else if ((s = qemu_chr_find(protocol)) != NULL) {
1208        int fd = monitor_get_fd(mon, fdname);
1209        if (qemu_chr_add_client(s, fd) < 0) {
1210            qerror_report(QERR_ADD_CLIENT_FAILED);
1211            return -1;
1212        }
1213        return 0;
1214    }
1215
1216    qerror_report(QERR_INVALID_PARAMETER, "protocol");
1217    return -1;
1218}
1219
1220static int client_migrate_info(Monitor *mon, const QDict *qdict, QObject **ret_data)
1221{
1222    const char *protocol = qdict_get_str(qdict, "protocol");
1223    const char *hostname = qdict_get_str(qdict, "hostname");
1224    const char *subject  = qdict_get_try_str(qdict, "cert-subject");
1225    int port             = qdict_get_try_int(qdict, "port", -1);
1226    int tls_port         = qdict_get_try_int(qdict, "tls-port", -1);
1227    int ret;
1228
1229    if (strcmp(protocol, "spice") == 0) {
1230        if (!using_spice) {
1231            qerror_report(QERR_DEVICE_NOT_ACTIVE, "spice");
1232            return -1;
1233        }
1234
1235        ret = qemu_spice_migrate_info(hostname, port, tls_port, subject);
1236        if (ret != 0) {
1237            qerror_report(QERR_UNDEFINED_ERROR);
1238            return -1;
1239        }
1240        return 0;
1241    }
1242
1243    qerror_report(QERR_INVALID_PARAMETER, "protocol");
1244    return -1;
1245}
1246
1247static int do_screen_dump(Monitor *mon, const QDict *qdict, QObject **ret_data)
1248{
1249    vga_hw_screen_dump(qdict_get_str(qdict, "filename"));
1250    return 0;
1251}
1252
1253static void do_logfile(Monitor *mon, const QDict *qdict)
1254{
1255    cpu_set_log_filename(qdict_get_str(qdict, "filename"));
1256}
1257
1258static void do_log(Monitor *mon, const QDict *qdict)
1259{
1260    int mask;
1261    const char *items = qdict_get_str(qdict, "items");
1262
1263    if (!strcmp(items, "none")) {
1264        mask = 0;
1265    } else {
1266        mask = cpu_str_to_log_mask(items);
1267        if (!mask) {
1268            help_cmd(mon, "log");
1269            return;
1270        }
1271    }
1272    cpu_set_log(mask);
1273}
1274
1275static void do_singlestep(Monitor *mon, const QDict *qdict)
1276{
1277    const char *option = qdict_get_try_str(qdict, "option");
1278    if (!option || !strcmp(option, "on")) {
1279        singlestep = 1;
1280    } else if (!strcmp(option, "off")) {
1281        singlestep = 0;
1282    } else {
1283        monitor_printf(mon, "unexpected option %s\n", option);
1284    }
1285}
1286
1287/**
1288 * do_stop(): Stop VM execution
1289 */
1290static int do_stop(Monitor *mon, const QDict *qdict, QObject **ret_data)
1291{
1292    vm_stop(VMSTOP_USER);
1293    return 0;
1294}
1295
1296static void encrypted_bdrv_it(void *opaque, BlockDriverState *bs);
1297
1298struct bdrv_iterate_context {
1299    Monitor *mon;
1300    int err;
1301};
1302
1303/**
1304 * do_cont(): Resume emulation.
1305 */
1306static int do_cont(Monitor *mon, const QDict *qdict, QObject **ret_data)
1307{
1308    struct bdrv_iterate_context context = { mon, 0 };
1309
1310    if (incoming_expected) {
1311        qerror_report(QERR_MIGRATION_EXPECTED);
1312        return -1;
1313    }
1314    bdrv_iterate(encrypted_bdrv_it, &context);
1315    /* only resume the vm if all keys are set and valid */
1316    if (!context.err) {
1317        vm_start();
1318        return 0;
1319    } else {
1320        return -1;
1321    }
1322}
1323
1324static void bdrv_key_cb(void *opaque, int err)
1325{
1326    Monitor *mon = opaque;
1327
1328    /* another key was set successfully, retry to continue */
1329    if (!err)
1330        do_cont(mon, NULL, NULL);
1331}
1332
1333static void encrypted_bdrv_it(void *opaque, BlockDriverState *bs)
1334{
1335    struct bdrv_iterate_context *context = opaque;
1336
1337    if (!context->err && bdrv_key_required(bs)) {
1338        context->err = -EBUSY;
1339        monitor_read_bdrv_key_start(context->mon, bs, bdrv_key_cb,
1340                                    context->mon);
1341    }
1342}
1343
1344static void do_gdbserver(Monitor *mon, const QDict *qdict)
1345{
1346    const char *device = qdict_get_try_str(qdict, "device");
1347    if (!device)
1348        device = "tcp::" DEFAULT_GDBSTUB_PORT;
1349    if (gdbserver_start(device) < 0) {
1350        monitor_printf(mon, "Could not open gdbserver on device '%s'\n",
1351                       device);
1352    } else if (strcmp(device, "none") == 0) {
1353        monitor_printf(mon, "Disabled gdbserver\n");
1354    } else {
1355        monitor_printf(mon, "Waiting for gdb connection on device '%s'\n",
1356                       device);
1357    }
1358}
1359
1360static void do_watchdog_action(Monitor *mon, const QDict *qdict)
1361{
1362    const char *action = qdict_get_str(qdict, "action");
1363    if (select_watchdog_action(action) == -1) {
1364        monitor_printf(mon, "Unknown watchdog action '%s'\n", action);
1365    }
1366}
1367
1368static void monitor_printc(Monitor *mon, int c)
1369{
1370    monitor_printf(mon, "'");
1371    switch(c) {
1372    case '\'':
1373        monitor_printf(mon, "\\'");
1374        break;
1375    case '\\':
1376        monitor_printf(mon, "\\\\");
1377        break;
1378    case '\n':
1379        monitor_printf(mon, "\\n");
1380        break;
1381    case '\r':
1382        monitor_printf(mon, "\\r");
1383        break;
1384    default:
1385        if (c >= 32 && c <= 126) {
1386            monitor_printf(mon, "%c", c);
1387        } else {
1388            monitor_printf(mon, "\\x%02x", c);
1389        }
1390        break;
1391    }
1392    monitor_printf(mon, "'");
1393}
1394
1395static void memory_dump(Monitor *mon, int count, int format, int wsize,
1396                        target_phys_addr_t addr, int is_physical)
1397{
1398    CPUState *env;
1399    int l, line_size, i, max_digits, len;
1400    uint8_t buf[16];
1401    uint64_t v;
1402
1403    if (format == 'i') {
1404        int flags;
1405        flags = 0;
1406        env = mon_get_cpu();
1407#ifdef TARGET_I386
1408        if (wsize == 2) {
1409            flags = 1;
1410        } else if (wsize == 4) {
1411            flags = 0;
1412        } else {
1413            /* as default we use the current CS size */
1414            flags = 0;
1415            if (env) {
1416#ifdef TARGET_X86_64
1417                if ((env->efer & MSR_EFER_LMA) &&
1418                    (env->segs[R_CS].flags & DESC_L_MASK))
1419                    flags = 2;
1420                else
1421#endif
1422                if (!(env->segs[R_CS].flags & DESC_B_MASK))
1423                    flags = 1;
1424            }
1425        }
1426#endif
1427        monitor_disas(mon, env, addr, count, is_physical, flags);
1428        return;
1429    }
1430
1431    len = wsize * count;
1432    if (wsize == 1)
1433        line_size = 8;
1434    else
1435        line_size = 16;
1436    max_digits = 0;
1437
1438    switch(format) {
1439    case 'o':
1440        max_digits = (wsize * 8 + 2) / 3;
1441        break;
1442    default:
1443    case 'x':
1444        max_digits = (wsize * 8) / 4;
1445        break;
1446    case 'u':
1447    case 'd':
1448        max_digits = (wsize * 8 * 10 + 32) / 33;
1449        break;
1450    case 'c':
1451        wsize = 1;
1452        break;
1453    }
1454
1455    while (len > 0) {
1456        if (is_physical)
1457            monitor_printf(mon, TARGET_FMT_plx ":", addr);
1458        else
1459            monitor_printf(mon, TARGET_FMT_lx ":", (target_ulong)addr);
1460        l = len;
1461        if (l > line_size)
1462            l = line_size;
1463        if (is_physical) {
1464            cpu_physical_memory_read(addr, buf, l);
1465        } else {
1466            env = mon_get_cpu();
1467            if (cpu_memory_rw_debug(env, addr, buf, l, 0) < 0) {
1468                monitor_printf(mon, " Cannot access memory\n");
1469                break;
1470            }
1471        }
1472        i = 0;
1473        while (i < l) {
1474            switch(wsize) {
1475            default:
1476            case 1:
1477                v = ldub_raw(buf + i);
1478                break;
1479            case 2:
1480                v = lduw_raw(buf + i);
1481                break;
1482            case 4:
1483                v = (uint32_t)ldl_raw(buf + i);
1484                break;
1485            case 8:
1486                v = ldq_raw(buf + i);
1487                break;
1488            }
1489            monitor_printf(mon, " ");
1490            switch(format) {
1491            case 'o':
1492                monitor_printf(mon, "%#*" PRIo64, max_digits, v);
1493                break;
1494            case 'x':
1495                monitor_printf(mon, "0x%0*" PRIx64, max_digits, v);
1496                break;
1497            case 'u':
1498                monitor_printf(mon, "%*" PRIu64, max_digits, v);
1499                break;
1500            case 'd':
1501                monitor_printf(mon, "%*" PRId64, max_digits, v);
1502                break;
1503            case 'c':
1504                monitor_printc(mon, v);
1505                break;
1506            }
1507            i += wsize;
1508        }
1509        monitor_printf(mon, "\n");
1510        addr += l;
1511        len -= l;
1512    }
1513}
1514
1515static void do_memory_dump(Monitor *mon, const QDict *qdict)
1516{
1517    int count = qdict_get_int(qdict, "count");
1518    int format = qdict_get_int(qdict, "format");
1519    int size = qdict_get_int(qdict, "size");
1520    target_long addr = qdict_get_int(qdict, "addr");
1521
1522    memory_dump(mon, count, format, size, addr, 0);
1523}
1524
1525static void do_physical_memory_dump(Monitor *mon, const QDict *qdict)
1526{
1527    int count = qdict_get_int(qdict, "count");
1528    int format = qdict_get_int(qdict, "format");
1529    int size = qdict_get_int(qdict, "size");
1530    target_phys_addr_t addr = qdict_get_int(qdict, "addr");
1531
1532    memory_dump(mon, count, format, size, addr, 1);
1533}
1534
1535static void do_print(Monitor *mon, const QDict *qdict)
1536{
1537    int format = qdict_get_int(qdict, "format");
1538    target_phys_addr_t val = qdict_get_int(qdict, "val");
1539
1540#if TARGET_PHYS_ADDR_BITS == 32
1541    switch(format) {
1542    case 'o':
1543        monitor_printf(mon, "%#o", val);
1544        break;
1545    case 'x':
1546        monitor_printf(mon, "%#x", val);
1547        break;
1548    case 'u':
1549        monitor_printf(mon, "%u", val);
1550        break;
1551    default:
1552    case 'd':
1553        monitor_printf(mon, "%d", val);
1554        break;
1555    case 'c':
1556        monitor_printc(mon, val);
1557        break;
1558    }
1559#else
1560    switch(format) {
1561    case 'o':
1562        monitor_printf(mon, "%#" PRIo64, val);
1563        break;
1564    case 'x':
1565        monitor_printf(mon, "%#" PRIx64, val);
1566        break;
1567    case 'u':
1568        monitor_printf(mon, "%" PRIu64, val);
1569        break;
1570    default:
1571    case 'd':
1572        monitor_printf(mon, "%" PRId64, val);
1573        break;
1574    case 'c':
1575        monitor_printc(mon, val);
1576        break;
1577    }
1578#endif
1579    monitor_printf(mon, "\n");
1580}
1581
1582static int do_memory_save(Monitor *mon, const QDict *qdict, QObject **ret_data)
1583{
1584    FILE *f;
1585    uint32_t size = qdict_get_int(qdict, "size");
1586    const char *filename = qdict_get_str(qdict, "filename");
1587    target_long addr = qdict_get_int(qdict, "val");
1588    uint32_t l;
1589    CPUState *env;
1590    uint8_t buf[1024];
1591    int ret = -1;
1592
1593    env = mon_get_cpu();
1594
1595    f = fopen(filename, "wb");
1596    if (!f) {
1597        qerror_report(QERR_OPEN_FILE_FAILED, filename);
1598        return -1;
1599    }
1600    while (size != 0) {
1601        l = sizeof(buf);
1602        if (l > size)
1603            l = size;
1604        cpu_memory_rw_debug(env, addr, buf, l, 0);
1605        if (fwrite(buf, 1, l, f) != l) {
1606            monitor_printf(mon, "fwrite() error in do_memory_save\n");
1607            goto exit;
1608        }
1609        addr += l;
1610        size -= l;
1611    }
1612
1613    ret = 0;
1614
1615exit:
1616    fclose(f);
1617    return ret;
1618}
1619
1620static int do_physical_memory_save(Monitor *mon, const QDict *qdict,
1621                                    QObject **ret_data)
1622{
1623    FILE *f;
1624    uint32_t l;
1625    uint8_t buf[1024];
1626    uint32_t size = qdict_get_int(qdict, "size");
1627    const char *filename = qdict_get_str(qdict, "filename");
1628    target_phys_addr_t addr = qdict_get_int(qdict, "val");
1629    int ret = -1;
1630
1631    f = fopen(filename, "wb");
1632    if (!f) {
1633        qerror_report(QERR_OPEN_FILE_FAILED, filename);
1634        return -1;
1635    }
1636    while (size != 0) {
1637        l = sizeof(buf);
1638        if (l > size)
1639            l = size;
1640        cpu_physical_memory_read(addr, buf, l);
1641        if (fwrite(buf, 1, l, f) != l) {
1642            monitor_printf(mon, "fwrite() error in do_physical_memory_save\n");
1643            goto exit;
1644        }
1645        fflush(f);
1646        addr += l;
1647        size -= l;
1648    }
1649
1650    ret = 0;
1651
1652exit:
1653    fclose(f);
1654    return ret;
1655}
1656
1657static void do_sum(Monitor *mon, const QDict *qdict)
1658{
1659    uint32_t addr;
1660    uint16_t sum;
1661    uint32_t start = qdict_get_int(qdict, "start");
1662    uint32_t size = qdict_get_int(qdict, "size");
1663
1664    sum = 0;
1665    for(addr = start; addr < (start + size); addr++) {
1666        uint8_t val = ldub_phys(addr);
1667        /* BSD sum algorithm ('sum' Unix command) */
1668        sum = (sum >> 1) | (sum << 15);
1669        sum += val;
1670    }
1671    monitor_printf(mon, "%05d\n", sum);
1672}
1673
1674typedef struct {
1675    int keycode;
1676    const char *name;
1677} KeyDef;
1678
1679static const KeyDef key_defs[] = {
1680    { 0x2a, "shift" },
1681    { 0x36, "shift_r" },
1682
1683    { 0x38, "alt" },
1684    { 0xb8, "alt_r" },
1685    { 0x64, "altgr" },
1686    { 0xe4, "altgr_r" },
1687    { 0x1d, "ctrl" },
1688    { 0x9d, "ctrl_r" },
1689
1690    { 0xdd, "menu" },
1691
1692    { 0x01, "esc" },
1693
1694    { 0x02, "1" },
1695    { 0x03, "2" },
1696    { 0x04, "3" },
1697    { 0x05, "4" },
1698    { 0x06, "5" },
1699    { 0x07, "6" },
1700    { 0x08, "7" },
1701    { 0x09, "8" },
1702    { 0x0a, "9" },
1703    { 0x0b, "0" },
1704    { 0x0c, "minus" },
1705    { 0x0d, "equal" },
1706    { 0x0e, "backspace" },
1707
1708    { 0x0f, "tab" },
1709    { 0x10, "q" },
1710    { 0x11, "w" },
1711    { 0x12, "e" },
1712    { 0x13, "r" },
1713    { 0x14, "t" },
1714    { 0x15, "y" },
1715    { 0x16, "u" },
1716    { 0x17, "i" },
1717    { 0x18, "o" },
1718    { 0x19, "p" },
1719    { 0x1a, "bracket_left" },
1720    { 0x1b, "bracket_right" },
1721    { 0x1c, "ret" },
1722
1723    { 0x1e, "a" },
1724    { 0x1f, "s" },
1725    { 0x20, "d" },
1726    { 0x21, "f" },
1727    { 0x22, "g" },
1728    { 0x23, "h" },
1729    { 0x24, "j" },
1730    { 0x25, "k" },
1731    { 0x26, "l" },
1732    { 0x27, "semicolon" },
1733    { 0x28, "apostrophe" },
1734    { 0x29, "grave_accent" },
1735
1736    { 0x2b, "backslash" },
1737    { 0x2c, "z" },
1738    { 0x2d, "x" },
1739    { 0x2e, "c" },
1740    { 0x2f, "v" },
1741    { 0x30, "b" },
1742    { 0x31, "n" },
1743    { 0x32, "m" },
1744    { 0x33, "comma" },
1745    { 0x34, "dot" },
1746    { 0x35, "slash" },
1747
1748    { 0x37, "asterisk" },
1749
1750    { 0x39, "spc" },
1751    { 0x3a, "caps_lock" },
1752    { 0x3b, "f1" },
1753    { 0x3c, "f2" },
1754    { 0x3d, "f3" },
1755    { 0x3e, "f4" },
1756    { 0x3f, "f5" },
1757    { 0x40, "f6" },
1758    { 0x41, "f7" },
1759    { 0x42, "f8" },
1760    { 0x43, "f9" },
1761    { 0x44, "f10" },
1762    { 0x45, "num_lock" },
1763    { 0x46, "scroll_lock" },
1764
1765    { 0xb5, "kp_divide" },
1766    { 0x37, "kp_multiply" },
1767    { 0x4a, "kp_subtract" },
1768    { 0x4e, "kp_add" },
1769    { 0x9c, "kp_enter" },
1770    { 0x53, "kp_decimal" },
1771    { 0x54, "sysrq" },
1772
1773    { 0x52, "kp_0" },
1774    { 0x4f, "kp_1" },
1775    { 0x50, "kp_2" },
1776    { 0x51, "kp_3" },
1777    { 0x4b, "kp_4" },
1778    { 0x4c, "kp_5" },
1779    { 0x4d, "kp_6" },
1780    { 0x47, "kp_7" },
1781    { 0x48, "kp_8" },
1782    { 0x49, "kp_9" },
1783
1784    { 0x56, "<" },
1785
1786    { 0x57, "f11" },
1787    { 0x58, "f12" },
1788
1789    { 0xb7, "print" },
1790
1791    { 0xc7, "home" },
1792    { 0xc9, "pgup" },
1793    { 0xd1, "pgdn" },
1794    { 0xcf, "end" },
1795
1796    { 0xcb, "left" },
1797    { 0xc8, "up" },
1798    { 0xd0, "down" },
1799    { 0xcd, "right" },
1800
1801    { 0xd2, "insert" },
1802    { 0xd3, "delete" },
1803#if defined(TARGET_SPARC) && !defined(TARGET_SPARC64)
1804    { 0xf0, "stop" },
1805    { 0xf1, "again" },
1806    { 0xf2, "props" },
1807    { 0xf3, "undo" },
1808    { 0xf4, "front" },
1809    { 0xf5, "copy" },
1810    { 0xf6, "open" },
1811    { 0xf7, "paste" },
1812    { 0xf8, "find" },
1813    { 0xf9, "cut" },
1814    { 0xfa, "lf" },
1815    { 0xfb, "help" },
1816    { 0xfc, "meta_l" },
1817    { 0xfd, "meta_r" },
1818    { 0xfe, "compose" },
1819#endif
1820    { 0, NULL },
1821};
1822
1823static int get_keycode(const char *key)
1824{
1825    const KeyDef *p;
1826    char *endp;
1827    int ret;
1828
1829    for(p = key_defs; p->name != NULL; p++) {
1830        if (!strcmp(key, p->name))
1831            return p->keycode;
1832    }
1833    if (strstart(key, "0x", NULL)) {
1834        ret = strtoul(key, &endp, 0);
1835        if (*endp == '\0' && ret >= 0x01 && ret <= 0xff)
1836            return ret;
1837    }
1838    return -1;
1839}
1840
1841#define MAX_KEYCODES 16
1842static uint8_t keycodes[MAX_KEYCODES];
1843static int nb_pending_keycodes;
1844static QEMUTimer *key_timer;
1845
1846static void release_keys(void *opaque)
1847{
1848    int keycode;
1849
1850    while (nb_pending_keycodes > 0) {
1851        nb_pending_keycodes--;
1852        keycode = keycodes[nb_pending_keycodes];
1853        if (keycode & 0x80)
1854            kbd_put_keycode(0xe0);
1855        kbd_put_keycode(keycode | 0x80);
1856    }
1857}
1858
1859static void do_sendkey(Monitor *mon, const QDict *qdict)
1860{
1861    char keyname_buf[16];
1862    char *separator;
1863    int keyname_len, keycode, i;
1864    const char *string = qdict_get_str(qdict, "string");
1865    int has_hold_time = qdict_haskey(qdict, "hold_time");
1866    int hold_time = qdict_get_try_int(qdict, "hold_time", -1);
1867
1868    if (nb_pending_keycodes > 0) {
1869        qemu_del_timer(key_timer);
1870        release_keys(NULL);
1871    }
1872    if (!has_hold_time)
1873        hold_time = 100;
1874    i = 0;
1875    while (1) {
1876        separator = strchr(string, '-');
1877        keyname_len = separator ? separator - string : strlen(string);
1878        if (keyname_len > 0) {
1879            pstrcpy(keyname_buf, sizeof(keyname_buf), string);
1880            if (keyname_len > sizeof(keyname_buf) - 1) {
1881                monitor_printf(mon, "invalid key: '%s...'\n", keyname_buf);
1882                return;
1883            }
1884            if (i == MAX_KEYCODES) {
1885                monitor_printf(mon, "too many keys\n");
1886                return;
1887            }
1888            keyname_buf[keyname_len] = 0;
1889            keycode = get_keycode(keyname_buf);
1890            if (keycode < 0) {
1891                monitor_printf(mon, "unknown key: '%s'\n", keyname_buf);
1892                return;
1893            }
1894            keycodes[i++] = keycode;
1895        }
1896        if (!separator)
1897            break;
1898        string = separator + 1;
1899    }
1900    nb_pending_keycodes = i;
1901    /* key down events */
1902    for (i = 0; i < nb_pending_keycodes; i++) {
1903        keycode = keycodes[i];
1904        if (keycode & 0x80)
1905            kbd_put_keycode(0xe0);
1906        kbd_put_keycode(keycode & 0x7f);
1907    }
1908    /* delayed key up events */
1909    qemu_mod_timer(key_timer, qemu_get_clock_ns(vm_clock) +
1910                   muldiv64(get_ticks_per_sec(), hold_time, 1000));
1911}
1912
1913static int mouse_button_state;
1914
1915static void do_mouse_move(Monitor *mon, const QDict *qdict)
1916{
1917    int dx, dy, dz;
1918    const char *dx_str = qdict_get_str(qdict, "dx_str");
1919    const char *dy_str = qdict_get_str(qdict, "dy_str");
1920    const char *dz_str = qdict_get_try_str(qdict, "dz_str");
1921    dx = strtol(dx_str, NULL, 0);
1922    dy = strtol(dy_str, NULL, 0);
1923    dz = 0;
1924    if (dz_str)
1925        dz = strtol(dz_str, NULL, 0);
1926    kbd_mouse_event(dx, dy, dz, mouse_button_state);
1927}
1928
1929static void do_mouse_button(Monitor *mon, const QDict *qdict)
1930{
1931    int button_state = qdict_get_int(qdict, "button_state");
1932    mouse_button_state = button_state;
1933    kbd_mouse_event(0, 0, 0, mouse_button_state);
1934}
1935
1936static void do_ioport_read(Monitor *mon, const QDict *qdict)
1937{
1938    int size = qdict_get_int(qdict, "size");
1939    int addr = qdict_get_int(qdict, "addr");
1940    int has_index = qdict_haskey(qdict, "index");
1941    uint32_t val;
1942    int suffix;
1943
1944    if (has_index) {
1945        int index = qdict_get_int(qdict, "index");
1946        cpu_outb(addr & IOPORTS_MASK, index & 0xff);
1947        addr++;
1948    }
1949    addr &= 0xffff;
1950
1951    switch(size) {
1952    default:
1953    case 1:
1954        val = cpu_inb(addr);
1955        suffix = 'b';
1956        break;
1957    case 2:
1958        val = cpu_inw(addr);
1959        suffix = 'w';
1960        break;
1961    case 4:
1962        val = cpu_inl(addr);
1963        suffix = 'l';
1964        break;
1965    }
1966    monitor_printf(mon, "port%c[0x%04x] = %#0*x\n",
1967                   suffix, addr, size * 2, val);
1968}
1969
1970static void do_ioport_write(Monitor *mon, const QDict *qdict)
1971{
1972    int size = qdict_get_int(qdict, "size");
1973    int addr = qdict_get_int(qdict, "addr");
1974    int val = qdict_get_int(qdict, "val");
1975
1976    addr &= IOPORTS_MASK;
1977
1978    switch (size) {
1979    default:
1980    case 1:
1981        cpu_outb(addr, val);
1982        break;
1983    case 2:
1984        cpu_outw(addr, val);
1985        break;
1986    case 4:
1987        cpu_outl(addr, val);
1988        break;
1989    }
1990}
1991
1992static void do_boot_set(Monitor *mon, const QDict *qdict)
1993{
1994    int res;
1995    const char *bootdevice = qdict_get_str(qdict, "bootdevice");
1996
1997    res = qemu_boot_set(bootdevice);
1998    if (res == 0) {
1999        monitor_printf(mon, "boot device list now set to %s\n", bootdevice);
2000    } else if (res > 0) {
2001        monitor_printf(mon, "setting boot device list failed\n");
2002    } else {
2003        monitor_printf(mon, "no function defined to set boot device list for "
2004                       "this architecture\n");
2005    }
2006}
2007
2008/**
2009 * do_system_reset(): Issue a machine reset
2010 */
2011static int do_system_reset(Monitor *mon, const QDict *qdict,
2012                           QObject **ret_data)
2013{
2014    qemu_system_reset_request();
2015    return 0;
2016}
2017
2018/**
2019 * do_system_powerdown(): Issue a machine powerdown
2020 */
2021static int do_system_powerdown(Monitor *mon, const QDict *qdict,
2022                               QObject **ret_data)
2023{
2024    qemu_system_powerdown_request();
2025    return 0;
2026}
2027
2028#if defined(TARGET_I386)
2029static void print_pte(Monitor *mon, target_phys_addr_t addr,
2030                      target_phys_addr_t pte,
2031                      target_phys_addr_t mask)
2032{
2033#ifdef TARGET_X86_64
2034    if (addr & (1ULL << 47)) {
2035        addr |= -1LL << 48;
2036    }
2037#endif
2038    monitor_printf(mon, TARGET_FMT_plx ": " TARGET_FMT_plx
2039                   " %c%c%c%c%c%c%c%c%c\n",
2040                   addr,
2041                   pte & mask,
2042                   pte & PG_NX_MASK ? 'X' : '-',
2043                   pte & PG_GLOBAL_MASK ? 'G' : '-',
2044                   pte & PG_PSE_MASK ? 'P' : '-',
2045                   pte & PG_DIRTY_MASK ? 'D' : '-',
2046                   pte & PG_ACCESSED_MASK ? 'A' : '-',
2047                   pte & PG_PCD_MASK ? 'C' : '-',
2048                   pte & PG_PWT_MASK ? 'T' : '-',
2049                   pte & PG_USER_MASK ? 'U' : '-',
2050                   pte & PG_RW_MASK ? 'W' : '-');
2051}
2052
2053static void tlb_info_32(Monitor *mon, CPUState *env)
2054{
2055    int l1, l2;
2056    uint32_t pgd, pde, pte;
2057
2058    pgd = env->cr[3] & ~0xfff;
2059    for(l1 = 0; l1 < 1024; l1++) {
2060        cpu_physical_memory_read(pgd + l1 * 4, &pde, 4);
2061        pde = le32_to_cpu(pde);
2062        if (pde & PG_PRESENT_MASK) {
2063            if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
2064                /* 4M pages */
2065                print_pte(mon, (l1 << 22), pde, ~((1 << 21) - 1));
2066            } else {
2067                for(l2 = 0; l2 < 1024; l2++) {
2068                    cpu_physical_memory_read((pde & ~0xfff) + l2 * 4, &pte, 4);
2069                    pte = le32_to_cpu(pte);
2070                    if (pte & PG_PRESENT_MASK) {
2071                        print_pte(mon, (l1 << 22) + (l2 << 12),
2072                                  pte & ~PG_PSE_MASK,
2073                                  ~0xfff);
2074                    }
2075                }
2076            }
2077        }
2078    }
2079}
2080
2081static void tlb_info_pae32(Monitor *mon, CPUState *env)
2082{
2083    int l1, l2, l3;
2084    uint64_t pdpe, pde, pte;
2085    uint64_t pdp_addr, pd_addr, pt_addr;
2086
2087    pdp_addr = env->cr[3] & ~0x1f;
2088    for (l1 = 0; l1 < 4; l1++) {
2089        cpu_physical_memory_read(pdp_addr + l1 * 8, &pdpe, 8);
2090        pdpe = le64_to_cpu(pdpe);
2091        if (pdpe & PG_PRESENT_MASK) {
2092            pd_addr = pdpe & 0x3fffffffff000ULL;
2093            for (l2 = 0; l2 < 512; l2++) {
2094                cpu_physical_memory_read(pd_addr + l2 * 8, &pde, 8);
2095                pde = le64_to_cpu(pde);
2096                if (pde & PG_PRESENT_MASK) {
2097                    if (pde & PG_PSE_MASK) {
2098                        /* 2M pages with PAE, CR4.PSE is ignored */
2099                        print_pte(mon, (l1 << 30 ) + (l2 << 21), pde,
2100                                  ~((target_phys_addr_t)(1 << 20) - 1));
2101                    } else {
2102                        pt_addr = pde & 0x3fffffffff000ULL;
2103                        for (l3 = 0; l3 < 512; l3++) {
2104                            cpu_physical_memory_read(pt_addr + l3 * 8, &pte, 8);
2105                            pte = le64_to_cpu(pte);
2106                            if (pte & PG_PRESENT_MASK) {
2107                                print_pte(mon, (l1 << 30 ) + (l2 << 21)
2108                                          + (l3 << 12),
2109                                          pte & ~PG_PSE_MASK,
2110                                          ~(target_phys_addr_t)0xfff);
2111                            }
2112                        }
2113                    }
2114                }
2115            }
2116        }
2117    }
2118}
2119
2120#ifdef TARGET_X86_64
2121static void tlb_info_64(Monitor *mon, CPUState *env)
2122{
2123    uint64_t l1, l2, l3, l4;
2124    uint64_t pml4e, pdpe, pde, pte;
2125    uint64_t pml4_addr, pdp_addr, pd_addr, pt_addr;
2126
2127    pml4_addr = env->cr[3] & 0x3fffffffff000ULL;
2128    for (l1 = 0; l1 < 512; l1++) {
2129        cpu_physical_memory_read(pml4_addr + l1 * 8, &pml4e, 8);
2130        pml4e = le64_to_cpu(pml4e);
2131        if (pml4e & PG_PRESENT_MASK) {
2132            pdp_addr = pml4e & 0x3fffffffff000ULL;
2133            for (l2 = 0; l2 < 512; l2++) {
2134                cpu_physical_memory_read(pdp_addr + l2 * 8, &pdpe, 8);
2135                pdpe = le64_to_cpu(pdpe);
2136                if (pdpe & PG_PRESENT_MASK) {
2137                    if (pdpe & PG_PSE_MASK) {
2138                        /* 1G pages, CR4.PSE is ignored */
2139                        print_pte(mon, (l1 << 39) + (l2 << 30), pdpe,
2140                                  0x3ffffc0000000ULL);
2141                    } else {
2142                        pd_addr = pdpe & 0x3fffffffff000ULL;
2143                        for (l3 = 0; l3 < 512; l3++) {
2144                            cpu_physical_memory_read(pd_addr + l3 * 8, &pde, 8);
2145                            pde = le64_to_cpu(pde);
2146                            if (pde & PG_PRESENT_MASK) {
2147                                if (pde & PG_PSE_MASK) {
2148                                    /* 2M pages, CR4.PSE is ignored */
2149                                    print_pte(mon, (l1 << 39) + (l2 << 30) +
2150                                              (l3 << 21), pde,
2151                                              0x3ffffffe00000ULL);
2152                                } else {
2153                                    pt_addr = pde & 0x3fffffffff000ULL;
2154                                    for (l4 = 0; l4 < 512; l4++) {
2155                                        cpu_physical_memory_read(pt_addr
2156                                                                 + l4 * 8,
2157                                                                 &pte, 8);
2158                                        pte = le64_to_cpu(pte);
2159                                        if (pte & PG_PRESENT_MASK) {
2160                                            print_pte(mon, (l1 << 39) +
2161                                                      (l2 << 30) +
2162                                                      (l3 << 21) + (l4 << 12),
2163                                                      pte & ~PG_PSE_MASK,
2164                                                      0x3fffffffff000ULL);
2165                                        }
2166                                    }
2167                                }
2168                            }
2169                        }
2170                    }
2171                }
2172            }
2173        }
2174    }
2175}
2176#endif
2177
2178static void tlb_info(Monitor *mon)
2179{
2180    CPUState *env;
2181
2182    env = mon_get_cpu();
2183
2184    if (!(env->cr[0] & CR0_PG_MASK)) {
2185        monitor_printf(mon, "PG disabled\n");
2186        return;
2187    }
2188    if (env->cr[4] & CR4_PAE_MASK) {
2189#ifdef TARGET_X86_64
2190        if (env->hflags & HF_LMA_MASK) {
2191            tlb_info_64(mon, env);
2192        } else
2193#endif
2194        {
2195            tlb_info_pae32(mon, env);
2196        }
2197    } else {
2198        tlb_info_32(mon, env);
2199    }
2200}
2201
2202static void mem_print(Monitor *mon, target_phys_addr_t *pstart,
2203                      int *plast_prot,
2204                      target_phys_addr_t end, int prot)
2205{
2206    int prot1;
2207    prot1 = *plast_prot;
2208    if (prot != prot1) {
2209        if (*pstart != -1) {
2210            monitor_printf(mon, TARGET_FMT_plx "-" TARGET_FMT_plx " "
2211                           TARGET_FMT_plx " %c%c%c\n",
2212                           *pstart, end, end - *pstart,
2213                           prot1 & PG_USER_MASK ? 'u' : '-',
2214                           'r',
2215                           prot1 & PG_RW_MASK ? 'w' : '-');
2216        }
2217        if (prot != 0)
2218            *pstart = end;
2219        else
2220            *pstart = -1;
2221        *plast_prot = prot;
2222    }
2223}
2224
2225static void mem_info_32(Monitor *mon, CPUState *env)
2226{
2227    int l1, l2, prot, last_prot;
2228    uint32_t pgd, pde, pte;
2229    target_phys_addr_t start, end;
2230
2231    pgd = env->cr[3] & ~0xfff;
2232    last_prot = 0;
2233    start = -1;
2234    for(l1 = 0; l1 < 1024; l1++) {
2235        cpu_physical_memory_read(pgd + l1 * 4, &pde, 4);
2236        pde = le32_to_cpu(pde);
2237        end = l1 << 22;
2238        if (pde & PG_PRESENT_MASK) {
2239            if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
2240                prot = pde & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
2241                mem_print(mon, &start, &last_prot, end, prot);
2242            } else {
2243                for(l2 = 0; l2 < 1024; l2++) {
2244                    cpu_physical_memory_read((pde & ~0xfff) + l2 * 4, &pte, 4);
2245                    pte = le32_to_cpu(pte);
2246                    end = (l1 << 22) + (l2 << 12);
2247                    if (pte & PG_PRESENT_MASK) {
2248                        prot = pte & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
2249                    } else {
2250                        prot = 0;
2251                    }
2252                    mem_print(mon, &start, &last_prot, end, prot);
2253                }
2254            }
2255        } else {
2256            prot = 0;
2257            mem_print(mon, &start, &last_prot, end, prot);
2258        }
2259    }
2260}
2261
2262static void mem_info_pae32(Monitor *mon, CPUState *env)
2263{
2264    int l1, l2, l3, prot, last_prot;
2265    uint64_t pdpe, pde, pte;
2266    uint64_t pdp_addr, pd_addr, pt_addr;
2267    target_phys_addr_t start, end;
2268
2269    pdp_addr = env->cr[3] & ~0x1f;
2270    last_prot = 0;
2271    start = -1;
2272    for (l1 = 0; l1 < 4; l1++) {
2273        cpu_physical_memory_read(pdp_addr + l1 * 8, &pdpe, 8);
2274        pdpe = le64_to_cpu(pdpe);
2275        end = l1 << 30;
2276        if (pdpe & PG_PRESENT_MASK) {
2277            pd_addr = pdpe & 0x3fffffffff000ULL;
2278            for (l2 = 0; l2 < 512; l2++) {
2279                cpu_physical_memory_read(pd_addr + l2 * 8, &pde, 8);
2280                pde = le64_to_cpu(pde);
2281                end = (l1 << 30) + (l2 << 21);
2282                if (pde & PG_PRESENT_MASK) {
2283                    if (pde & PG_PSE_MASK) {
2284                        prot = pde & (PG_USER_MASK | PG_RW_MASK |
2285                                      PG_PRESENT_MASK);
2286                        mem_print(mon, &start, &last_prot, end, prot);
2287                    } else {
2288                        pt_addr = pde & 0x3fffffffff000ULL;
2289                        for (l3 = 0; l3 < 512; l3++) {
2290                            cpu_physical_memory_read(pt_addr + l3 * 8, &pte, 8);
2291                            pte = le64_to_cpu(pte);
2292                            end = (l1 << 30) + (l2 << 21) + (l3 << 12);
2293                            if (pte & PG_PRESENT_MASK) {
2294                                prot = pte & (PG_USER_MASK | PG_RW_MASK |
2295                                              PG_PRESENT_MASK);
2296                            } else {
2297                                prot = 0;
2298                            }
2299                            mem_print(mon, &start, &last_prot, end, prot);
2300                        }
2301                    }
2302                } else {
2303                    prot = 0;
2304                    mem_print(mon, &start, &last_prot, end, prot);
2305                }
2306            }
2307        } else {
2308            prot = 0;
2309            mem_print(mon, &start, &last_prot, end, prot);
2310        }
2311    }
2312}
2313
2314
2315#ifdef TARGET_X86_64
2316static void mem_info_64(Monitor *mon, CPUState *env)
2317{
2318    int prot, last_prot;
2319    uint64_t l1, l2, l3, l4;
2320    uint64_t pml4e, pdpe, pde, pte;
2321    uint64_t pml4_addr, pdp_addr, pd_addr, pt_addr, start, end;
2322
2323    pml4_addr = env->cr[3] & 0x3fffffffff000ULL;
2324    last_prot = 0;
2325    start = -1;
2326    for (l1 = 0; l1 < 512; l1++) {
2327        cpu_physical_memory_read(pml4_addr + l1 * 8, &pml4e, 8);
2328        pml4e = le64_to_cpu(pml4e);
2329        end = l1 << 39;
2330        if (pml4e & PG_PRESENT_MASK) {
2331            pdp_addr = pml4e & 0x3fffffffff000ULL;
2332            for (l2 = 0; l2 < 512; l2++) {
2333                cpu_physical_memory_read(pdp_addr + l2 * 8, &pdpe, 8);
2334                pdpe = le64_to_cpu(pdpe);
2335                end = (l1 << 39) + (l2 << 30);
2336                if (pdpe & PG_PRESENT_MASK) {
2337                    if (pdpe & PG_PSE_MASK) {
2338                        prot = pdpe & (PG_USER_MASK | PG_RW_MASK |
2339                                       PG_PRESENT_MASK);
2340                        mem_print(mon, &start, &last_prot, end, prot);
2341                    } else {
2342                        pd_addr = pdpe & 0x3fffffffff000ULL;
2343                        for (l3 = 0; l3 < 512; l3++) {
2344                            cpu_physical_memory_read(pd_addr + l3 * 8, &pde, 8);
2345                            pde = le64_to_cpu(pde);
2346                            end = (l1 << 39) + (l2 << 30) + (l3 << 21);
2347                            if (pde & PG_PRESENT_MASK) {
2348                                if (pde & PG_PSE_MASK) {
2349                                    prot = pde & (PG_USER_MASK | PG_RW_MASK |
2350                                                  PG_PRESENT_MASK);
2351                                    mem_print(mon, &start, &last_prot, end, prot);
2352                                } else {
2353                                    pt_addr = pde & 0x3fffffffff000ULL;
2354                                    for (l4 = 0; l4 < 512; l4++) {
2355                                        cpu_physical_memory_read(pt_addr
2356                                                                 + l4 * 8,
2357                                                                 &pte, 8);
2358                                        pte = le64_to_cpu(pte);
2359                                        end = (l1 << 39) + (l2 << 30) +
2360                                            (l3 << 21) + (l4 << 12);
2361                                        if (pte & PG_PRESENT_MASK) {
2362                                            prot = pte & (PG_USER_MASK | PG_RW_MASK |
2363                                                          PG_PRESENT_MASK);
2364                                        } else {
2365                                            prot = 0;
2366                                        }
2367                                        mem_print(mon, &start, &last_prot, end, prot);
2368                                    }
2369                                }
2370                            } else {
2371                                prot = 0;
2372                                mem_print(mon, &start, &last_prot, end, prot);
2373                            }
2374                        }
2375                    }
2376                } else {
2377                    prot = 0;
2378                    mem_print(mon, &start, &last_prot, end, prot);
2379                }
2380            }
2381        } else {
2382            prot = 0;
2383            mem_print(mon, &start, &last_prot, end, prot);
2384        }
2385    }
2386}
2387#endif
2388
2389static void mem_info(Monitor *mon)
2390{
2391    CPUState *env;
2392
2393    env = mon_get_cpu();
2394
2395    if (!(env->cr[0] & CR0_PG_MASK)) {
2396        monitor_printf(mon, "PG disabled\n");
2397        return;
2398    }
2399    if (env->cr[4] & CR4_PAE_MASK) {
2400#ifdef TARGET_X86_64
2401        if (env->hflags & HF_LMA_MASK) {
2402            mem_info_64(mon, env);
2403        } else
2404#endif
2405        {
2406            mem_info_pae32(mon, env);
2407        }
2408    } else {
2409        mem_info_32(mon, env);
2410    }
2411}
2412#endif
2413
2414#if defined(TARGET_SH4)
2415
2416static void print_tlb(Monitor *mon, int idx, tlb_t *tlb)
2417{
2418    monitor_printf(mon, " tlb%i:\t"
2419                   "asid=%hhu vpn=%x\tppn=%x\tsz=%hhu size=%u\t"
2420                   "v=%hhu shared=%hhu cached=%hhu prot=%hhu "
2421                   "dirty=%hhu writethrough=%hhu\n",
2422                   idx,
2423                   tlb->asid, tlb->vpn, tlb->ppn, tlb->sz, tlb->size,
2424                   tlb->v, tlb->sh, tlb->c, tlb->pr,
2425                   tlb->d, tlb->wt);
2426}
2427
2428static void tlb_info(Monitor *mon)
2429{
2430    CPUState *env = mon_get_cpu();
2431    int i;
2432
2433    monitor_printf (mon, "ITLB:\n");
2434    for (i = 0 ; i < ITLB_SIZE ; i++)
2435        print_tlb (mon, i, &env->itlb[i]);
2436    monitor_printf (mon, "UTLB:\n");
2437    for (i = 0 ; i < UTLB_SIZE ; i++)
2438        print_tlb (mon, i, &env->utlb[i]);
2439}
2440
2441#endif
2442
2443#if defined(TARGET_SPARC)
2444static void tlb_info(Monitor *mon)
2445{
2446    CPUState *env1 = mon_get_cpu();
2447
2448    dump_mmu((FILE*)mon, (fprintf_function)monitor_printf, env1);
2449}
2450#endif
2451
2452static void do_info_kvm_print(Monitor *mon, const QObject *data)
2453{
2454    QDict *qdict;
2455
2456    qdict = qobject_to_qdict(data);
2457
2458    monitor_printf(mon, "kvm support: ");
2459    if (qdict_get_bool(qdict, "present")) {
2460        monitor_printf(mon, "%s\n", qdict_get_bool(qdict, "enabled") ?
2461                                    "enabled" : "disabled");
2462    } else {
2463        monitor_printf(mon, "not compiled\n");
2464    }
2465}
2466
2467static void do_info_kvm(Monitor *mon, QObject **ret_data)
2468{
2469#ifdef CONFIG_KVM
2470    *ret_data = qobject_from_jsonf("{ 'enabled': %i, 'present': true }",
2471                                   kvm_enabled());
2472#else
2473    *ret_data = qobject_from_jsonf("{ 'enabled': false, 'present': false }");
2474#endif
2475}
2476
2477static void do_info_numa(Monitor *mon)
2478{
2479    int i;
2480    CPUState *env;
2481
2482    monitor_printf(mon, "%d nodes\n", nb_numa_nodes);
2483    for (i = 0; i < nb_numa_nodes; i++) {
2484        monitor_printf(mon, "node %d cpus:", i);
2485        for (env = first_cpu; env != NULL; env = env->next_cpu) {
2486            if (env->numa_node == i) {
2487                monitor_printf(mon, " %d", env->cpu_index);
2488            }
2489        }
2490        monitor_printf(mon, "\n");
2491        monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i,
2492            node_mem[i] >> 20);
2493    }
2494}
2495
2496#ifdef CONFIG_PROFILER
2497
2498int64_t qemu_time;
2499int64_t dev_time;
2500
2501static void do_info_profile(Monitor *mon)
2502{
2503    int64_t total;
2504    total = qemu_time;
2505    if (total == 0)
2506        total = 1;
2507    monitor_printf(mon, "async time  %" PRId64 " (%0.3f)\n",
2508                   dev_time, dev_time / (double)get_ticks_per_sec());
2509    monitor_printf(mon, "qemu time   %" PRId64 " (%0.3f)\n",
2510                   qemu_time, qemu_time / (double)get_ticks_per_sec());
2511    qemu_time = 0;
2512    dev_time = 0;
2513}
2514#else
2515static void do_info_profile(Monitor *mon)
2516{
2517    monitor_printf(mon, "Internal profiler not compiled\n");
2518}
2519#endif
2520
2521/* Capture support */
2522static QLIST_HEAD (capture_list_head, CaptureState) capture_head;
2523
2524static void do_info_capture(Monitor *mon)
2525{
2526    int i;
2527    CaptureState *s;
2528
2529    for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
2530        monitor_printf(mon, "[%d]: ", i);
2531        s->ops.info (s->opaque);
2532    }
2533}
2534
2535#ifdef HAS_AUDIO
2536static void do_stop_capture(Monitor *mon, const QDict *qdict)
2537{
2538    int i;
2539    int n = qdict_get_int(qdict, "n");
2540    CaptureState *s;
2541
2542    for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
2543        if (i == n) {
2544            s->ops.destroy (s->opaque);
2545            QLIST_REMOVE (s, entries);
2546            qemu_free (s);
2547            return;
2548        }
2549    }
2550}
2551
2552static void do_wav_capture(Monitor *mon, const QDict *qdict)
2553{
2554    const char *path = qdict_get_str(qdict, "path");
2555    int has_freq = qdict_haskey(qdict, "freq");
2556    int freq = qdict_get_try_int(qdict, "freq", -1);
2557    int has_bits = qdict_haskey(qdict, "bits");
2558    int bits = qdict_get_try_int(qdict, "bits", -1);
2559    int has_channels = qdict_haskey(qdict, "nchannels");
2560    int nchannels = qdict_get_try_int(qdict, "nchannels", -1);
2561    CaptureState *s;
2562
2563    s = qemu_mallocz (sizeof (*s));
2564
2565    freq = has_freq ? freq : 44100;
2566    bits = has_bits ? bits : 16;
2567    nchannels = has_channels ? nchannels : 2;
2568
2569    if (wav_start_capture (s, path, freq, bits, nchannels)) {
2570        monitor_printf(mon, "Failed to add wave capture\n");
2571        qemu_free (s);
2572        return;
2573    }
2574    QLIST_INSERT_HEAD (&capture_head, s, entries);
2575}
2576#endif
2577
2578#if defined(TARGET_I386)
2579static int do_inject_nmi(Monitor *mon, const QDict *qdict, QObject **ret_data)
2580{
2581    CPUState *env;
2582
2583    for (env = first_cpu; env != NULL; env = env->next_cpu) {
2584        cpu_interrupt(env, CPU_INTERRUPT_NMI);
2585    }
2586
2587    return 0;
2588}
2589#else
2590static int do_inject_nmi(Monitor *mon, const QDict *qdict, QObject **ret_data)
2591{
2592    qerror_report(QERR_UNSUPPORTED);
2593    return -1;
2594}
2595#endif
2596
2597static void do_info_status_print(Monitor *mon, const QObject *data)
2598{
2599    QDict *qdict;
2600
2601    qdict = qobject_to_qdict(data);
2602
2603    monitor_printf(mon, "VM status: ");
2604    if (qdict_get_bool(qdict, "running")) {
2605        monitor_printf(mon, "running");
2606        if (qdict_get_bool(qdict, "singlestep")) {
2607            monitor_printf(mon, " (single step mode)");
2608        }
2609    } else {
2610        monitor_printf(mon, "paused");
2611    }
2612
2613    monitor_printf(mon, "\n");
2614}
2615
2616static void do_info_status(Monitor *mon, QObject **ret_data)
2617{
2618    *ret_data = qobject_from_jsonf("{ 'running': %i, 'singlestep': %i }",
2619                                    vm_running, singlestep);
2620}
2621
2622static qemu_acl *find_acl(Monitor *mon, const char *name)
2623{
2624    qemu_acl *acl = qemu_acl_find(name);
2625
2626    if (!acl) {
2627        monitor_printf(mon, "acl: unknown list '%s'\n", name);
2628    }
2629    return acl;
2630}
2631
2632static void do_acl_show(Monitor *mon, const QDict *qdict)
2633{
2634    const char *aclname = qdict_get_str(qdict, "aclname");
2635    qemu_acl *acl = find_acl(mon, aclname);
2636    qemu_acl_entry *entry;
2637    int i = 0;
2638
2639    if (acl) {
2640        monitor_printf(mon, "policy: %s\n",
2641                       acl->defaultDeny ? "deny" : "allow");
2642        QTAILQ_FOREACH(entry, &acl->entries, next) {
2643            i++;
2644            monitor_printf(mon, "%d: %s %s\n", i,
2645                           entry->deny ? "deny" : "allow", entry->match);
2646        }
2647    }
2648}
2649
2650static void do_acl_reset(Monitor *mon, const QDict *qdict)
2651{
2652    const char *aclname = qdict_get_str(qdict, "aclname");
2653    qemu_acl *acl = find_acl(mon, aclname);
2654
2655    if (acl) {
2656        qemu_acl_reset(acl);
2657        monitor_printf(mon, "acl: removed all rules\n");
2658    }
2659}
2660
2661static void do_acl_policy(Monitor *mon, const QDict *qdict)
2662{
2663    const char *aclname = qdict_get_str(qdict, "aclname");
2664    const char *policy = qdict_get_str(qdict, "policy");
2665    qemu_acl *acl = find_acl(mon, aclname);
2666
2667    if (acl) {
2668        if (strcmp(policy, "allow") == 0) {
2669            acl->defaultDeny = 0;
2670            monitor_printf(mon, "acl: policy set to 'allow'\n");
2671        } else if (strcmp(policy, "deny") == 0) {
2672            acl->defaultDeny = 1;
2673            monitor_printf(mon, "acl: policy set to 'deny'\n");
2674        } else {
2675            monitor_printf(mon, "acl: unknown policy '%s', "
2676                           "expected 'deny' or 'allow'\n", policy);
2677        }
2678    }
2679}
2680
2681static void do_acl_add(Monitor *mon, const QDict *qdict)
2682{
2683    const char *aclname = qdict_get_str(qdict, "aclname");
2684    const char *match = qdict_get_str(qdict, "match");
2685    const char *policy = qdict_get_str(qdict, "policy");
2686    int has_index = qdict_haskey(qdict, "index");
2687    int index = qdict_get_try_int(qdict, "index", -1);
2688    qemu_acl *acl = find_acl(mon, aclname);
2689    int deny, ret;
2690
2691    if (acl) {
2692        if (strcmp(policy, "allow") == 0) {
2693            deny = 0;
2694        } else if (strcmp(policy, "deny") == 0) {
2695            deny = 1;
2696        } else {
2697            monitor_printf(mon, "acl: unknown policy '%s', "
2698                           "expected 'deny' or 'allow'\n", policy);
2699            return;
2700        }
2701        if (has_index)
2702            ret = qemu_acl_insert(acl, deny, match, index);
2703        else
2704            ret = qemu_acl_append(acl, deny, match);
2705        if (ret < 0)
2706            monitor_printf(mon, "acl: unable to add acl entry\n");
2707        else
2708            monitor_printf(mon, "acl: added rule at position %d\n", ret);
2709    }
2710}
2711
2712static void do_acl_remove(Monitor *mon, const QDict *qdict)
2713{
2714    const char *aclname = qdict_get_str(qdict, "aclname");
2715    const char *match = qdict_get_str(qdict, "match");
2716    qemu_acl *acl = find_acl(mon, aclname);
2717    int ret;
2718
2719    if (acl) {
2720        ret = qemu_acl_remove(acl, match);
2721        if (ret < 0)
2722            monitor_printf(mon, "acl: no matching acl entry\n");
2723        else
2724            monitor_printf(mon, "acl: removed rule at position %d\n", ret);
2725    }
2726}
2727
2728#if defined(TARGET_I386)
2729static void do_inject_mce(Monitor *mon, const QDict *qdict)
2730{
2731    CPUState *cenv;
2732    int cpu_index = qdict_get_int(qdict, "cpu_index");
2733    int bank = qdict_get_int(qdict, "bank");
2734    uint64_t status = qdict_get_int(qdict, "status");
2735    uint64_t mcg_status = qdict_get_int(qdict, "mcg_status");
2736    uint64_t addr = qdict_get_int(qdict, "addr");
2737    uint64_t misc = qdict_get_int(qdict, "misc");
2738    int flags = MCE_INJECT_UNCOND_AO;
2739
2740    if (qdict_get_try_bool(qdict, "broadcast", 0)) {
2741        flags |= MCE_INJECT_BROADCAST;
2742    }
2743    for (cenv = first_cpu; cenv != NULL; cenv = cenv->next_cpu) {
2744        if (cenv->cpu_index == cpu_index) {
2745            cpu_x86_inject_mce(mon, cenv, bank, status, mcg_status, addr, misc,
2746                               flags);
2747            break;
2748        }
2749    }
2750}
2751#endif
2752
2753static int do_getfd(Monitor *mon, const QDict *qdict, QObject **ret_data)
2754{
2755    const char *fdname = qdict_get_str(qdict, "fdname");
2756    mon_fd_t *monfd;
2757    int fd;
2758
2759    fd = qemu_chr_get_msgfd(mon->chr);
2760    if (fd == -1) {
2761        qerror_report(QERR_FD_NOT_SUPPLIED);
2762        return -1;
2763    }
2764
2765    if (qemu_isdigit(fdname[0])) {
2766        qerror_report(QERR_INVALID_PARAMETER_VALUE, "fdname",
2767                      "a name not starting with a digit");
2768        return -1;
2769    }
2770
2771    QLIST_FOREACH(monfd, &mon->fds, next) {
2772        if (strcmp(monfd->name, fdname) != 0) {
2773            continue;
2774        }
2775
2776        close(monfd->fd);
2777        monfd->fd = fd;
2778        return 0;
2779    }
2780
2781    monfd = qemu_mallocz(sizeof(mon_fd_t));
2782    monfd->name = qemu_strdup(fdname);
2783    monfd->fd = fd;
2784
2785    QLIST_INSERT_HEAD(&mon->fds, monfd, next);
2786    return 0;
2787}
2788
2789static int do_closefd(Monitor *mon, const QDict *qdict, QObject **ret_data)
2790{
2791    const char *fdname = qdict_get_str(qdict, "fdname");
2792    mon_fd_t *monfd;
2793
2794    QLIST_FOREACH(monfd, &mon->fds, next) {
2795        if (strcmp(monfd->name, fdname) != 0) {
2796            continue;
2797        }
2798
2799        QLIST_REMOVE(monfd, next);
2800        close(monfd->fd);
2801        qemu_free(monfd->name);
2802        qemu_free(monfd);
2803        return 0;
2804    }
2805
2806    qerror_report(QERR_FD_NOT_FOUND, fdname);
2807    return -1;
2808}
2809
2810static void do_loadvm(Monitor *mon, const QDict *qdict)
2811{
2812    int saved_vm_running  = vm_running;
2813    const char *name = qdict_get_str(qdict, "name");
2814
2815    vm_stop(VMSTOP_LOADVM);
2816
2817    if (load_vmstate(name) == 0 && saved_vm_running) {
2818        vm_start();
2819    }
2820}
2821
2822int monitor_get_fd(Monitor *mon, const char *fdname)
2823{
2824    mon_fd_t *monfd;
2825
2826    QLIST_FOREACH(monfd, &mon->fds, next) {
2827        int fd;
2828
2829        if (strcmp(monfd->name, fdname) != 0) {
2830            continue;
2831        }
2832
2833        fd = monfd->fd;
2834
2835        /* caller takes ownership of fd */
2836        QLIST_REMOVE(monfd, next);
2837        qemu_free(monfd->name);
2838        qemu_free(monfd);
2839
2840        return fd;
2841    }
2842
2843    return -1;
2844}
2845
2846static const mon_cmd_t mon_cmds[] = {
2847#include "hmp-commands.h"
2848    { NULL, NULL, },
2849};
2850
2851/* Please update hmp-commands.hx when adding or changing commands */
2852static const mon_cmd_t info_cmds[] = {
2853    {
2854        .name       = "version",
2855        .args_type  = "",
2856        .params     = "",
2857        .help       = "show the version of QEMU",
2858        .user_print = do_info_version_print,
2859        .mhandler.info_new = do_info_version,
2860    },
2861    {
2862        .name       = "network",
2863        .args_type  = "",
2864        .params     = "",
2865        .help       = "show the network state",
2866        .mhandler.info = do_info_network,
2867    },
2868    {
2869        .name       = "chardev",
2870        .args_type  = "",
2871        .params     = "",
2872        .help       = "show the character devices",
2873        .user_print = qemu_chr_info_print,
2874        .mhandler.info_new = qemu_chr_info,
2875    },
2876    {
2877        .name       = "block",
2878        .args_type  = "",
2879        .params     = "",
2880        .help       = "show the block devices",
2881        .user_print = bdrv_info_print,
2882        .mhandler.info_new = bdrv_info,
2883    },
2884    {
2885        .name       = "blockstats",
2886        .args_type  = "",
2887        .params     = "",
2888        .help       = "show block device statistics",
2889        .user_print = bdrv_stats_print,
2890        .mhandler.info_new = bdrv_info_stats,
2891    },
2892    {
2893        .name       = "registers",
2894        .args_type  = "",
2895        .params     = "",
2896        .help       = "show the cpu registers",
2897        .mhandler.info = do_info_registers,
2898    },
2899    {
2900        .name       = "cpus",
2901        .args_type  = "",
2902        .params     = "",
2903        .help       = "show infos for each CPU",
2904        .user_print = monitor_print_cpus,
2905        .mhandler.info_new = do_info_cpus,
2906    },
2907    {
2908        .name       = "history",
2909        .args_type  = "",
2910        .params     = "",
2911        .help       = "show the command line history",
2912        .mhandler.info = do_info_history,
2913    },
2914    {
2915        .name       = "irq",
2916        .args_type  = "",
2917        .params     = "",
2918        .help       = "show the interrupts statistics (if available)",
2919        .mhandler.info = irq_info,
2920    },
2921    {
2922        .name       = "pic",
2923        .args_type  = "",
2924        .params     = "",
2925        .help       = "show i8259 (PIC) state",
2926        .mhandler.info = pic_info,
2927    },
2928    {
2929        .name       = "pci",
2930        .args_type  = "",
2931        .params     = "",
2932        .help       = "show PCI info",
2933        .user_print = do_pci_info_print,
2934        .mhandler.info_new = do_pci_info,
2935    },
2936#if defined(TARGET_I386) || defined(TARGET_SH4) || defined(TARGET_SPARC)
2937    {
2938        .name       = "tlb",
2939        .args_type  = "",
2940        .params     = "",
2941        .help       = "show virtual to physical memory mappings",
2942        .mhandler.info = tlb_info,
2943    },
2944#endif
2945#if defined(TARGET_I386)
2946    {
2947        .name       = "mem",
2948        .args_type  = "",
2949        .params     = "",
2950        .help       = "show the active virtual memory mappings",
2951        .mhandler.info = mem_info,
2952    },
2953#endif
2954    {
2955        .name       = "jit",
2956        .args_type  = "",
2957        .params     = "",
2958        .help       = "show dynamic compiler info",
2959        .mhandler.info = do_info_jit,
2960    },
2961    {
2962        .name       = "kvm",
2963        .args_type  = "",
2964        .params     = "",
2965        .help       = "show KVM information",
2966        .user_print = do_info_kvm_print,
2967        .mhandler.info_new = do_info_kvm,
2968    },
2969    {
2970        .name       = "numa",
2971        .args_type  = "",
2972        .params     = "",
2973        .help       = "show NUMA information",
2974        .mhandler.info = do_info_numa,
2975    },
2976    {
2977        .name       = "usb",
2978        .args_type  = "",
2979        .params     = "",
2980        .help       = "show guest USB devices",
2981        .mhandler.info = usb_info,
2982    },
2983    {
2984        .name       = "usbhost",
2985        .args_type  = "",
2986        .params     = "",
2987        .help       = "show host USB devices",
2988        .mhandler.info = usb_host_info,
2989    },
2990    {
2991        .name       = "profile",
2992        .args_type  = "",
2993        .params     = "",
2994        .help       = "show profiling information",
2995        .mhandler.info = do_info_profile,
2996    },
2997    {
2998        .name       = "capture",
2999        .args_type  = "",
3000        .params     = "",
3001        .help       = "show capture information",
3002        .mhandler.info = do_info_capture,
3003    },
3004    {
3005        .name       = "snapshots",
3006        .args_type  = "",
3007        .params     = "",
3008        .help       = "show the currently saved VM snapshots",
3009        .mhandler.info = do_info_snapshots,
3010    },
3011    {
3012        .name       = "status",
3013        .args_type  = "",
3014        .params     = "",
3015        .help       = "show the current VM status (running|paused)",
3016        .user_print = do_info_status_print,
3017        .mhandler.info_new = do_info_status,
3018    },
3019    {
3020        .name       = "pcmcia",
3021        .args_type  = "",
3022        .params     = "",
3023        .help       = "show guest PCMCIA status",
3024        .mhandler.info = pcmcia_info,
3025    },
3026    {
3027        .name       = "mice",
3028        .args_type  = "",
3029        .params     = "",
3030        .help       = "show which guest mouse is receiving events",
3031        .user_print = do_info_mice_print,
3032        .mhandler.info_new = do_info_mice,
3033    },
3034    {
3035        .name       = "vnc",
3036        .args_type  = "",
3037        .params     = "",
3038        .help       = "show the vnc server status",
3039        .user_print = do_info_vnc_print,
3040        .mhandler.info_new = do_info_vnc,
3041    },
3042#if defined(CONFIG_SPICE)
3043    {
3044        .name       = "spice",
3045        .args_type  = "",
3046        .params     = "",
3047        .help       = "show the spice server status",
3048        .user_print = do_info_spice_print,
3049        .mhandler.info_new = do_info_spice,
3050    },
3051#endif
3052    {
3053        .name       = "name",
3054        .args_type  = "",
3055        .params     = "",
3056        .help       = "show the current VM name",
3057        .user_print = do_info_name_print,
3058        .mhandler.info_new = do_info_name,
3059    },
3060    {
3061        .name       = "uuid",
3062        .args_type  = "",
3063        .params     = "",
3064        .help       = "show the current VM UUID",
3065        .user_print = do_info_uuid_print,
3066        .mhandler.info_new = do_info_uuid,
3067    },
3068#if defined(TARGET_PPC)
3069    {
3070        .name       = "cpustats",
3071        .args_type  = "",
3072        .params     = "",
3073        .help       = "show CPU statistics",
3074        .mhandler.info = do_info_cpu_stats,
3075    },
3076#endif
3077#if defined(CONFIG_SLIRP)
3078    {
3079        .name       = "usernet",
3080        .args_type  = "",
3081        .params     = "",
3082        .help       = "show user network stack connection states",
3083        .mhandler.info = do_info_usernet,
3084    },
3085#endif
3086    {
3087        .name       = "migrate",
3088        .args_type  = "",
3089        .params     = "",
3090        .help       = "show migration status",
3091        .user_print = do_info_migrate_print,
3092        .mhandler.info_new = do_info_migrate,
3093    },
3094    {
3095        .name       = "balloon",
3096        .args_type  = "",
3097        .params     = "",
3098        .help       = "show balloon information",
3099        .user_print = monitor_print_balloon,
3100        .mhandler.info_async = do_info_balloon,
3101        .flags      = MONITOR_CMD_ASYNC,
3102    },
3103    {
3104        .name       = "qtree",
3105        .args_type  = "",
3106        .params     = "",
3107        .help       = "show device tree",
3108        .mhandler.info = do_info_qtree,
3109    },
3110    {
3111        .name       = "qdm",
3112        .args_type  = "",
3113        .params     = "",
3114        .help       = "show qdev device model list",
3115        .mhandler.info = do_info_qdm,
3116    },
3117    {
3118        .name       = "roms",
3119        .args_type  = "",
3120        .params     = "",
3121        .help       = "show roms",
3122        .mhandler.info = do_info_roms,
3123    },
3124#if defined(CONFIG_SIMPLE_TRACE)
3125    {
3126        .name       = "trace",
3127        .args_type  = "",
3128        .params     = "",
3129        .help       = "show current contents of trace buffer",
3130        .mhandler.info = do_info_trace,
3131    },
3132    {
3133        .name       = "trace-events",
3134        .args_type  = "",
3135        .params     = "",
3136        .help       = "show available trace-events & their state",
3137        .mhandler.info = do_info_trace_events,
3138    },
3139#endif
3140    {
3141        .name       = NULL,
3142    },
3143};
3144
3145static const mon_cmd_t qmp_cmds[] = {
3146#include "qmp-commands.h"
3147    { /* NULL */ },
3148};
3149
3150static const mon_cmd_t qmp_query_cmds[] = {
3151    {
3152        .name       = "version",
3153        .args_type  = "",
3154        .params     = "",
3155        .help       = "show the version of QEMU",
3156        .user_print = do_info_version_print,
3157        .mhandler.info_new = do_info_version,
3158    },
3159    {
3160        .name       = "commands",
3161        .args_type  = "",
3162        .params     = "",
3163        .help       = "list QMP available commands",
3164        .user_print = monitor_user_noop,
3165        .mhandler.info_new = do_info_commands,
3166    },
3167    {
3168        .name       = "chardev",
3169        .args_type  = "",
3170        .params     = "",
3171        .help       = "show the character devices",
3172        .user_print = qemu_chr_info_print,
3173        .mhandler.info_new = qemu_chr_info,
3174    },
3175    {
3176        .name       = "block",
3177        .args_type  = "",
3178        .params     = "",
3179        .help       = "show the block devices",
3180        .user_print = bdrv_info_print,
3181        .mhandler.info_new = bdrv_info,
3182    },
3183    {
3184        .name       = "blockstats",
3185        .args_type  = "",
3186        .params     = "",
3187        .help       = "show block device statistics",
3188        .user_print = bdrv_stats_print,
3189        .mhandler.info_new = bdrv_info_stats,
3190    },
3191    {
3192        .name       = "cpus",
3193        .args_type  = "",
3194        .params     = "",
3195        .help       = "show infos for each CPU",
3196        .user_print = monitor_print_cpus,
3197        .mhandler.info_new = do_info_cpus,
3198    },
3199    {
3200        .name       = "pci",
3201        .args_type  = "",
3202        .params     = "",
3203        .help       = "show PCI info",
3204        .user_print = do_pci_info_print,
3205        .mhandler.info_new = do_pci_info,
3206    },
3207    {
3208        .name       = "kvm",
3209        .args_type  = "",
3210        .params     = "",
3211        .help       = "show KVM information",
3212        .user_print = do_info_kvm_print,
3213        .mhandler.info_new = do_info_kvm,
3214    },
3215    {
3216        .name       = "status",
3217        .args_type  = "",
3218        .params     = "",
3219        .help       = "show the current VM status (running|paused)",
3220        .user_print = do_info_status_print,
3221        .mhandler.info_new = do_info_status,
3222    },
3223    {
3224        .name       = "mice",
3225        .args_type  = "",
3226        .params     = "",
3227        .help       = "show which guest mouse is receiving events",
3228        .user_print = do_info_mice_print,
3229        .mhandler.info_new = do_info_mice,
3230    },
3231    {
3232        .name       = "vnc",
3233        .args_type  = "",
3234        .params     = "",
3235        .help       = "show the vnc server status",
3236        .user_print = do_info_vnc_print,
3237        .mhandler.info_new = do_info_vnc,
3238    },
3239#if defined(CONFIG_SPICE)
3240    {
3241        .name       = "spice",
3242        .args_type  = "",
3243        .params     = "",
3244        .help       = "show the spice server status",
3245        .user_print = do_info_spice_print,
3246        .mhandler.info_new = do_info_spice,
3247    },
3248#endif
3249    {
3250        .name       = "name",
3251        .args_type  = "",
3252        .params     = "",
3253        .help       = "show the current VM name",
3254        .user_print = do_info_name_print,
3255        .mhandler.info_new = do_info_name,
3256    },
3257    {
3258        .name       = "uuid",
3259        .args_type  = "",
3260        .params     = "",
3261        .help       = "show the current VM UUID",
3262        .user_print = do_info_uuid_print,
3263        .mhandler.info_new = do_info_uuid,
3264    },
3265    {
3266        .name       = "migrate",
3267        .args_type  = "",
3268        .params     = "",
3269        .help       = "show migration status",
3270        .user_print = do_info_migrate_print,
3271        .mhandler.info_new = do_info_migrate,
3272    },
3273    {
3274        .name       = "balloon",
3275        .args_type  = "",
3276        .params     = "",
3277        .help       = "show balloon information",
3278        .user_print = monitor_print_balloon,
3279        .mhandler.info_async = do_info_balloon,
3280        .flags      = MONITOR_CMD_ASYNC,
3281    },
3282    { /* NULL */ },
3283};
3284
3285/*******************************************************************/
3286
3287static const char *pch;
3288static jmp_buf expr_env;
3289
3290#define MD_TLONG 0
3291#define MD_I32   1
3292
3293typedef struct MonitorDef {
3294    const char *name;
3295    int offset;
3296    target_long (*get_value)(const struct MonitorDef *md, int val);
3297    int type;
3298} MonitorDef;
3299
3300#if defined(TARGET_I386)
3301static target_long monitor_get_pc (const struct MonitorDef *md, int val)
3302{
3303    CPUState *env = mon_get_cpu();
3304    return env->eip + env->segs[R_CS].base;
3305}
3306#endif
3307
3308#if defined(TARGET_PPC)
3309static target_long monitor_get_ccr (const struct MonitorDef *md, int val)
3310{
3311    CPUState *env = mon_get_cpu();
3312    unsigned int u;
3313    int i;
3314
3315    u = 0;
3316    for (i = 0; i < 8; i++)
3317        u |= env->crf[i] << (32 - (4 * i));
3318
3319    return u;
3320}
3321
3322static target_long monitor_get_msr (const struct MonitorDef *md, int val)
3323{
3324    CPUState *env = mon_get_cpu();
3325    return env->msr;
3326}
3327
3328static target_long monitor_get_xer (const struct MonitorDef *md, int val)
3329{
3330    CPUState *env = mon_get_cpu();
3331    return env->xer;
3332}
3333
3334static target_long monitor_get_decr (const struct MonitorDef *md, int val)
3335{
3336    CPUState *env = mon_get_cpu();
3337    return cpu_ppc_load_decr(env);
3338}
3339
3340static target_long monitor_get_tbu (const struct MonitorDef *md, int val)
3341{
3342    CPUState *env = mon_get_cpu();
3343    return cpu_ppc_load_tbu(env);
3344}
3345
3346static target_long monitor_get_tbl (const struct MonitorDef *md, int val)
3347{
3348    CPUState *env = mon_get_cpu();
3349    return cpu_ppc_load_tbl(env);
3350}
3351#endif
3352
3353#if defined(TARGET_SPARC)
3354#ifndef TARGET_SPARC64
3355static target_long monitor_get_psr (const struct MonitorDef *md, int val)
3356{
3357    CPUState *env = mon_get_cpu();
3358
3359    return cpu_get_psr(env);
3360}
3361#endif
3362
3363static target_long monitor_get_reg(const struct MonitorDef *md, int val)
3364{
3365    CPUState *env = mon_get_cpu();
3366    return env->regwptr[val];
3367}
3368#endif
3369
3370static const MonitorDef monitor_defs[] = {
3371#ifdef TARGET_I386
3372
3373#define SEG(name, seg) \
3374    { name, offsetof(CPUState, segs[seg].selector), NULL, MD_I32 },\
3375    { name ".base", offsetof(CPUState, segs[seg].base) },\
3376    { name ".limit", offsetof(CPUState, segs[seg].limit), NULL, MD_I32 },
3377
3378    { "eax", offsetof(CPUState, regs[0]) },
3379    { "ecx", offsetof(CPUState, regs[1]) },
3380    { "edx", offsetof(CPUState, regs[2]) },
3381    { "ebx", offsetof(CPUState, regs[3]) },
3382    { "esp|sp", offsetof(CPUState, regs[4]) },
3383    { "ebp|fp", offsetof(CPUState, regs[5]) },
3384    { "esi", offsetof(CPUState, regs[6]) },
3385    { "edi", offsetof(CPUState, regs[7]) },
3386#ifdef TARGET_X86_64
3387    { "r8", offsetof(CPUState, regs[8]) },
3388    { "r9", offsetof(CPUState, regs[9]) },
3389    { "r10", offsetof(CPUState, regs[10]) },
3390    { "r11", offsetof(CPUState, regs[11]) },
3391    { "r12", offsetof(CPUState, regs[12]) },
3392    { "r13", offsetof(CPUState, regs[13]) },
3393    { "r14", offsetof(CPUState, regs[14]) },
3394    { "r15", offsetof(CPUState, regs[15]) },
3395#endif
3396    { "eflags", offsetof(CPUState, eflags) },
3397    { "eip", offsetof(CPUState, eip) },
3398    SEG("cs", R_CS)
3399    SEG("ds", R_DS)
3400    SEG("es", R_ES)
3401    SEG("ss", R_SS)
3402    SEG("fs", R_FS)
3403    SEG("gs", R_GS)
3404    { "pc", 0, monitor_get_pc, },
3405#elif defined(TARGET_PPC)
3406    /* General purpose registers */
3407    { "r0", offsetof(CPUState, gpr[0]) },
3408    { "r1", offsetof(CPUState, gpr[1]) },
3409    { "r2", offsetof(CPUState, gpr[2]) },
3410    { "r3", offsetof(CPUState, gpr[3]) },
3411    { "r4", offsetof(CPUState, gpr[4]) },
3412    { "r5", offsetof(CPUState, gpr[5]) },
3413    { "r6", offsetof(CPUState, gpr[6]) },
3414    { "r7", offsetof(CPUState, gpr[7]) },
3415    { "r8", offsetof(CPUState, gpr[8]) },
3416    { "r9", offsetof(CPUState, gpr[9]) },
3417    { "r10", offsetof(CPUState, gpr[10]) },
3418    { "r11", offsetof(CPUState, gpr[11]) },
3419    { "r12", offsetof(CPUState, gpr[12]) },
3420    { "r13", offsetof(CPUState, gpr[13]) },
3421    { "r14", offsetof(CPUState, gpr[14]) },
3422    { "r15", offsetof(CPUState, gpr[15]) },
3423    { "r16", offsetof(CPUState, gpr[16]) },
3424    { "r17", offsetof(CPUState, gpr[17]) },
3425    { "r18", offsetof(CPUState, gpr[18]) },
3426    { "r19", offsetof(CPUState, gpr[19]) },
3427    { "r20", offsetof(CPUState, gpr[20]) },
3428    { "r21", offsetof(CPUState, gpr[21]) },
3429    { "r22", offsetof(CPUState, gpr[22]) },
3430    { "r23", offsetof(CPUState, gpr[23]) },
3431    { "r24", offsetof(CPUState, gpr[24]) },
3432    { "r25", offsetof(CPUState, gpr[25]) },
3433    { "r26", offsetof(CPUState, gpr[26]) },
3434    { "r27", offsetof(CPUState, gpr[27]) },
3435    { "r28", offsetof(CPUState, gpr[28]) },
3436    { "r29", offsetof(CPUState, gpr[29]) },
3437    { "r30", offsetof(CPUState, gpr[30]) },
3438    { "r31", offsetof(CPUState, gpr[31]) },
3439    /* Floating point registers */
3440    { "f0", offsetof(CPUState, fpr[0]) },
3441    { "f1", offsetof(CPUState, fpr[1]) },
3442    { "f2", offsetof(CPUState, fpr[2]) },
3443    { "f3", offsetof(CPUState, fpr[3]) },
3444    { "f4", offsetof(CPUState, fpr[4]) },
3445    { "f5", offsetof(CPUState, fpr[5]) },
3446    { "f6", offsetof(CPUState, fpr[6]) },
3447    { "f7", offsetof(CPUState, fpr[7]) },
3448    { "f8", offsetof(CPUState, fpr[8]) },
3449    { "f9", offsetof(CPUState, fpr[9]) },
3450    { "f10", offsetof(CPUState, fpr[10]) },
3451    { "f11", offsetof(CPUState, fpr[11]) },
3452    { "f12", offsetof(CPUState, fpr[12]) },
3453    { "f13", offsetof(CPUState, fpr[13]) },
3454    { "f14", offsetof(CPUState, fpr[14]) },
3455    { "f15", offsetof(CPUState, fpr[15]) },
3456    { "f16", offsetof(CPUState, fpr[16]) },
3457    { "f17", offsetof(CPUState, fpr[17]) },
3458    { "f18", offsetof(CPUState, fpr[18]) },
3459    { "f19", offsetof(CPUState, fpr[19]) },
3460    { "f20", offsetof(CPUState, fpr[20]) },
3461    { "f21", offsetof(CPUState, fpr[21]) },
3462    { "f22", offsetof(CPUState, fpr[22]) },
3463    { "f23", offsetof(CPUState, fpr[23]) },
3464    { "f24", offsetof(CPUState, fpr[24]) },
3465    { "f25", offsetof(CPUState, fpr[25]) },
3466    { "f26", offsetof(CPUState, fpr[26]) },
3467    { "f27", offsetof(CPUState, fpr[27]) },
3468    { "f28", offsetof(CPUState, fpr[28]) },
3469    { "f29", offsetof(CPUState, fpr[29]) },
3470    { "f30", offsetof(CPUState, fpr[30]) },
3471    { "f31", offsetof(CPUState, fpr[31]) },
3472    { "fpscr", offsetof(CPUState, fpscr) },
3473    /* Next instruction pointer */
3474    { "nip|pc", offsetof(CPUState, nip) },
3475    { "lr", offsetof(CPUState, lr) },
3476    { "ctr", offsetof(CPUState, ctr) },
3477    { "decr", 0, &monitor_get_decr, },
3478    { "ccr", 0, &monitor_get_ccr, },
3479    /* Machine state register */
3480    { "msr", 0, &monitor_get_msr, },
3481    { "xer", 0, &monitor_get_xer, },
3482    { "tbu", 0, &monitor_get_tbu, },
3483    { "tbl", 0, &monitor_get_tbl, },
3484#if defined(TARGET_PPC64)
3485    /* Address space register */
3486    { "asr", offsetof(CPUState, asr) },
3487#endif
3488    /* Segment registers */
3489    { "sdr1", offsetof(CPUState, spr[SPR_SDR1]) },
3490    { "sr0", offsetof(CPUState, sr[0]) },
3491    { "sr1", offsetof(CPUState, sr[1]) },
3492    { "sr2", offsetof(CPUState, sr[2]) },
3493    { "sr3", offsetof(CPUState, sr[3]) },
3494    { "sr4", offsetof(CPUState, sr[4]) },
3495    { "sr5", offsetof(CPUState, sr[5]) },
3496    { "sr6", offsetof(CPUState, sr[6]) },
3497    { "sr7", offsetof(CPUState, sr[7]) },
3498    { "sr8", offsetof(CPUState, sr[8]) },
3499    { "sr9", offsetof(CPUState, sr[9]) },
3500    { "sr10", offsetof(CPUState, sr[10]) },
3501    { "sr11", offsetof(CPUState, sr[11]) },
3502    { "sr12", offsetof(CPUState, sr[12]) },
3503    { "sr13", offsetof(CPUState, sr[13]) },
3504    { "sr14", offsetof(CPUState, sr[14]) },
3505    { "sr15", offsetof(CPUState, sr[15]) },
3506    /* Too lazy to put BATs... */
3507    { "pvr", offsetof(CPUState, spr[SPR_PVR]) },
3508
3509    { "srr0", offsetof(CPUState, spr[SPR_SRR0]) },
3510    { "srr1", offsetof(CPUState, spr[SPR_SRR1]) },
3511    { "sprg0", offsetof(CPUState, spr[SPR_SPRG0]) },
3512    { "sprg1", offsetof(CPUState, spr[SPR_SPRG1]) },
3513    { "sprg2", offsetof(CPUState, spr[SPR_SPRG2]) },
3514    { "sprg3", offsetof(CPUState, spr[SPR_SPRG3]) },
3515    { "sprg4", offsetof(CPUState, spr[SPR_SPRG4]) },
3516    { "sprg5", offsetof(CPUState, spr[SPR_SPRG5]) },
3517    { "sprg6", offsetof(CPUState, spr[SPR_SPRG6]) },
3518    { "sprg7", offsetof(CPUState, spr[SPR_SPRG7]) },
3519    { "pid", offsetof(CPUState, spr[SPR_BOOKE_PID]) },
3520    { "csrr0", offsetof(CPUState, spr[SPR_BOOKE_CSRR0]) },
3521    { "csrr1", offsetof(CPUState, spr[SPR_BOOKE_CSRR1]) },
3522    { "esr", offsetof(CPUState, spr[SPR_BOOKE_ESR]) },
3523    { "dear", offsetof(CPUState, spr[SPR_BOOKE_DEAR]) },
3524    { "mcsr", offsetof(CPUState, spr[SPR_BOOKE_MCSR]) },
3525    { "tsr", offsetof(CPUState, spr[SPR_BOOKE_TSR]) },
3526    { "tcr", offsetof(CPUState, spr[SPR_BOOKE_TCR]) },
3527    { "vrsave", offsetof(CPUState, spr[SPR_VRSAVE]) },
3528    { "pir", offsetof(CPUState, spr[SPR_BOOKE_PIR]) },
3529    { "mcsrr0", offsetof(CPUState, spr[SPR_BOOKE_MCSRR0]) },
3530    { "mcsrr1", offsetof(CPUState, spr[SPR_BOOKE_MCSRR1]) },
3531    { "decar", offsetof(CPUState, spr[SPR_BOOKE_DECAR]) },
3532    { "ivpr", offsetof(CPUState, spr[SPR_BOOKE_IVPR]) },
3533    { "epcr", offsetof(CPUState, spr[SPR_BOOKE_EPCR]) },
3534    { "sprg8", offsetof(CPUState, spr[SPR_BOOKE_SPRG8]) },
3535    { "ivor0", offsetof(CPUState, spr[SPR_BOOKE_IVOR0]) },
3536    { "ivor1", offsetof(CPUState, spr[SPR_BOOKE_IVOR1]) },
3537    { "ivor2", offsetof(CPUState, spr[SPR_BOOKE_IVOR2]) },
3538    { "ivor3", offsetof(CPUState, spr[SPR_BOOKE_IVOR3]) },
3539    { "ivor4", offsetof(CPUState, spr[SPR_BOOKE_IVOR4]) },
3540    { "ivor5", offsetof(CPUState, spr[SPR_BOOKE_IVOR5]) },
3541    { "ivor6", offsetof(CPUState, spr[SPR_BOOKE_IVOR6]) },
3542    { "ivor7", offsetof(CPUState, spr[SPR_BOOKE_IVOR7]) },
3543    { "ivor8", offsetof(CPUState, spr[SPR_BOOKE_IVOR8]) },
3544    { "ivor9", offsetof(CPUState, spr[SPR_BOOKE_IVOR9]) },
3545    { "ivor10", offsetof(CPUState, spr[SPR_BOOKE_IVOR10]) },
3546    { "ivor11", offsetof(CPUState, spr[SPR_BOOKE_IVOR11]) },
3547    { "ivor12", offsetof(CPUState, spr[SPR_BOOKE_IVOR12]) },
3548    { "ivor13", offsetof(CPUState, spr[SPR_BOOKE_IVOR13]) },
3549    { "ivor14", offsetof(CPUState, spr[SPR_BOOKE_IVOR14]) },
3550    { "ivor15", offsetof(CPUState, spr[SPR_BOOKE_IVOR15]) },
3551    { "ivor32", offsetof(CPUState, spr[SPR_BOOKE_IVOR32]) },
3552    { "ivor33", offsetof(CPUState, spr[SPR_BOOKE_IVOR33]) },
3553    { "ivor34", offsetof(CPUState, spr[SPR_BOOKE_IVOR34]) },
3554    { "ivor35", offsetof(CPUState, spr[SPR_BOOKE_IVOR35]) },
3555    { "ivor36", offsetof(CPUState, spr[SPR_BOOKE_IVOR36]) },
3556    { "ivor37", offsetof(CPUState, spr[SPR_BOOKE_IVOR37]) },
3557    { "mas0", offsetof(CPUState, spr[SPR_BOOKE_MAS0]) },
3558    { "mas1", offsetof(CPUState, spr[SPR_BOOKE_MAS1]) },
3559    { "mas2", offsetof(CPUState, spr[SPR_BOOKE_MAS2]) },
3560    { "mas3", offsetof(CPUState, spr[SPR_BOOKE_MAS3]) },
3561    { "mas4", offsetof(CPUState, spr[SPR_BOOKE_MAS4]) },
3562    { "mas6", offsetof(CPUState, spr[SPR_BOOKE_MAS6]) },
3563    { "mas7", offsetof(CPUState, spr[SPR_BOOKE_MAS7]) },
3564    { "mmucfg", offsetof(CPUState, spr[SPR_MMUCFG]) },
3565    { "tlb0cfg", offsetof(CPUState, spr[SPR_BOOKE_TLB0CFG]) },
3566    { "tlb1cfg", offsetof(CPUState, spr[SPR_BOOKE_TLB1CFG]) },
3567    { "epr", offsetof(CPUState, spr[SPR_BOOKE_EPR]) },
3568    { "eplc", offsetof(CPUState, spr[SPR_BOOKE_EPLC]) },
3569    { "epsc", offsetof(CPUState, spr[SPR_BOOKE_EPSC]) },
3570    { "svr", offsetof(CPUState, spr[SPR_E500_SVR]) },
3571    { "mcar", offsetof(CPUState, spr[SPR_Exxx_MCAR]) },
3572    { "pid1", offsetof(CPUState, spr[SPR_BOOKE_PID1]) },
3573    { "pid2", offsetof(CPUState, spr[SPR_BOOKE_PID2]) },
3574    { "hid0", offsetof(CPUState, spr[SPR_HID0]) },
3575
3576#elif defined(TARGET_SPARC)
3577    { "g0", offsetof(CPUState, gregs[0]) },
3578    { "g1", offsetof(CPUState, gregs[1]) },
3579    { "g2", offsetof(CPUState, gregs[2]) },
3580    { "g3", offsetof(CPUState, gregs[3]) },
3581    { "g4", offsetof(CPUState, gregs[4]) },
3582    { "g5", offsetof(CPUState, gregs[5]) },
3583    { "g6", offsetof(CPUState, gregs[6]) },
3584    { "g7", offsetof(CPUState, gregs[7]) },
3585    { "o0", 0, monitor_get_reg },
3586    { "o1", 1, monitor_get_reg },
3587    { "o2", 2, monitor_get_reg },
3588    { "o3", 3, monitor_get_reg },
3589    { "o4", 4, monitor_get_reg },
3590    { "o5", 5, monitor_get_reg },
3591    { "o6", 6, monitor_get_reg },
3592    { "o7", 7, monitor_get_reg },
3593    { "l0", 8, monitor_get_reg },
3594    { "l1", 9, monitor_get_reg },
3595    { "l2", 10, monitor_get_reg },
3596    { "l3", 11, monitor_get_reg },
3597    { "l4", 12, monitor_get_reg },
3598    { "l5", 13, monitor_get_reg },
3599    { "l6", 14, monitor_get_reg },
3600    { "l7", 15, monitor_get_reg },
3601    { "i0", 16, monitor_get_reg },
3602    { "i1", 17, monitor_get_reg },
3603    { "i2", 18, monitor_get_reg },
3604    { "i3", 19, monitor_get_reg },
3605    { "i4", 20, monitor_get_reg },
3606    { "i5", 21, monitor_get_reg },
3607    { "i6", 22, monitor_get_reg },
3608    { "i7", 23, monitor_get_reg },
3609    { "pc", offsetof(CPUState, pc) },
3610    { "npc", offsetof(CPUState, npc) },
3611    { "y", offsetof(CPUState, y) },
3612#ifndef TARGET_SPARC64
3613    { "psr", 0, &monitor_get_psr, },
3614    { "wim", offsetof(CPUState, wim) },
3615#endif
3616    { "tbr", offsetof(CPUState, tbr) },
3617    { "fsr", offsetof(CPUState, fsr) },
3618    { "f0", offsetof(CPUState, fpr[0]) },
3619    { "f1", offsetof(CPUState, fpr[1]) },
3620    { "f2", offsetof(CPUState, fpr[2]) },
3621    { "f3", offsetof(CPUState, fpr[3]) },
3622    { "f4", offsetof(CPUState, fpr[4]) },
3623    { "f5", offsetof(CPUState, fpr[5]) },
3624    { "f6", offsetof(CPUState, fpr[6]) },
3625    { "f7", offsetof(CPUState, fpr[7]) },
3626    { "f8", offsetof(CPUState, fpr[8]) },
3627    { "f9", offsetof(CPUState, fpr[9]) },
3628    { "f10", offsetof(CPUState, fpr[10]) },
3629    { "f11", offsetof(CPUState, fpr[11]) },
3630    { "f12", offsetof(CPUState, fpr[12]) },
3631    { "f13", offsetof(CPUState, fpr[13]) },
3632    { "f14", offsetof(CPUState, fpr[14]) },
3633    { "f15", offsetof(CPUState, fpr[15]) },
3634    { "f16", offsetof(CPUState, fpr[16]) },
3635    { "f17", offsetof(CPUState, fpr[17]) },
3636    { "f18", offsetof(CPUState, fpr[18]) },
3637    { "f19", offsetof(CPUState, fpr[19]) },
3638    { "f20", offsetof(CPUState, fpr[20]) },
3639    { "f21", offsetof(CPUState, fpr[21]) },
3640    { "f22", offsetof(CPUState, fpr[22]) },
3641    { "f23", offsetof(CPUState, fpr[23]) },
3642    { "f24", offsetof(CPUState, fpr[24]) },
3643    { "f25", offsetof(CPUState, fpr[25]) },
3644    { "f26", offsetof(CPUState, fpr[26]) },
3645    { "f27", offsetof(CPUState, fpr[27]) },
3646    { "f28", offsetof(CPUState, fpr[28]) },
3647    { "f29", offsetof(CPUState, fpr[29]) },
3648    { "f30", offsetof(CPUState, fpr[30]) },
3649    { "f31", offsetof(CPUState, fpr[31]) },
3650#ifdef TARGET_SPARC64
3651    { "f32", offsetof(CPUState, fpr[32]) },
3652    { "f34", offsetof(CPUState, fpr[34]) },
3653    { "f36", offsetof(CPUState, fpr[36]) },
3654    { "f38", offsetof(CPUState, fpr[38]) },
3655    { "f40", offsetof(CPUState, fpr[40]) },
3656    { "f42", offsetof(CPUState, fpr[42]) },
3657    { "f44", offsetof(CPUState, fpr[44]) },
3658    { "f46", offsetof(CPUState, fpr[46]) },
3659    { "f48", offsetof(CPUState, fpr[48]) },
3660    { "f50", offsetof(CPUState, fpr[50]) },
3661    { "f52", offsetof(CPUState, fpr[52]) },
3662    { "f54", offsetof(CPUState, fpr[54]) },
3663    { "f56", offsetof(CPUState, fpr[56]) },
3664    { "f58", offsetof(CPUState, fpr[58]) },
3665    { "f60", offsetof(CPUState, fpr[60]) },
3666    { "f62", offsetof(CPUState, fpr[62]) },
3667    { "asi", offsetof(CPUState, asi) },
3668    { "pstate", offsetof(CPUState, pstate) },
3669    { "cansave", offsetof(CPUState, cansave) },
3670    { "canrestore", offsetof(CPUState, canrestore) },
3671    { "otherwin", offsetof(CPUState, otherwin) },
3672    { "wstate", offsetof(CPUState, wstate) },
3673    { "cleanwin", offsetof(CPUState, cleanwin) },
3674    { "fprs", offsetof(CPUState, fprs) },
3675#endif
3676#endif
3677    { NULL },
3678};
3679
3680static void expr_error(Monitor *mon, const char *msg)
3681{
3682    monitor_printf(mon, "%s\n", msg);
3683    longjmp(expr_env, 1);
3684}
3685
3686/* return 0 if OK, -1 if not found */
3687static int get_monitor_def(target_long *pval, const char *name)
3688{
3689    const MonitorDef *md;
3690    void *ptr;
3691
3692    for(md = monitor_defs; md->name != NULL; md++) {
3693        if (compare_cmd(name, md->name)) {
3694            if (md->get_value) {
3695                *pval = md->get_value(md, md->offset);
3696            } else {
3697                CPUState *env = mon_get_cpu();
3698                ptr = (uint8_t *)env + md->offset;
3699                switch(md->type) {
3700                case MD_I32:
3701                    *pval = *(int32_t *)ptr;
3702                    break;
3703                case MD_TLONG:
3704                    *pval = *(target_long *)ptr;
3705                    break;
3706                default:
3707                    *pval = 0;
3708                    break;
3709                }
3710            }
3711            return 0;
3712        }
3713    }
3714    return -1;
3715}
3716
3717static void next(void)
3718{
3719    if (*pch != '\0') {
3720        pch++;
3721        while (qemu_isspace(*pch))
3722            pch++;
3723    }
3724}
3725
3726static int64_t expr_sum(Monitor *mon);
3727
3728static int64_t expr_unary(Monitor *mon)
3729{
3730    int64_t n;
3731    char *p;
3732    int ret;
3733
3734    switch(*pch) {
3735    case '+':
3736        next();
3737        n = expr_unary(mon);
3738        break;
3739    case '-':
3740        next();
3741        n = -expr_unary(mon);
3742        break;
3743    case '~':
3744        next();
3745        n = ~expr_unary(mon);
3746        break;
3747    case '(':
3748        next();
3749        n = expr_sum(mon);
3750        if (*pch != ')') {
3751            expr_error(mon, "')' expected");
3752        }
3753        next();
3754        break;
3755    case '\'':
3756        pch++;
3757        if (*pch == '\0')
3758            expr_error(mon, "character constant expected");
3759        n = *pch;
3760        pch++;
3761        if (*pch != '\'')
3762            expr_error(mon, "missing terminating \' character");
3763        next();
3764        break;
3765    case '$':
3766        {
3767            char buf[128], *q;
3768            target_long reg=0;
3769
3770            pch++;
3771            q = buf;
3772            while ((*pch >= 'a' && *pch <= 'z') ||
3773                   (*pch >= 'A' && *pch <= 'Z') ||
3774                   (*pch >= '0' && *pch <= '9') ||
3775                   *pch == '_' || *pch == '.') {
3776                if ((q - buf) < sizeof(buf) - 1)
3777                    *q++ = *pch;
3778                pch++;
3779            }
3780            while (qemu_isspace(*pch))
3781                pch++;
3782            *q = 0;
3783            ret = get_monitor_def(&reg, buf);
3784            if (ret < 0)
3785                expr_error(mon, "unknown register");
3786            n = reg;
3787        }
3788        break;
3789    case '\0':
3790        expr_error(mon, "unexpected end of expression");
3791        n = 0;
3792        break;
3793    default:
3794#if TARGET_PHYS_ADDR_BITS > 32
3795        n = strtoull(pch, &p, 0);
3796#else
3797        n = strtoul(pch, &p, 0);
3798#endif
3799        if (pch == p) {
3800            expr_error(mon, "invalid char in expression");
3801        }
3802        pch = p;
3803        while (qemu_isspace(*pch))
3804            pch++;
3805        break;
3806    }
3807    return n;
3808}
3809
3810
3811static int64_t expr_prod(Monitor *mon)
3812{
3813    int64_t val, val2;
3814    int op;
3815
3816    val = expr_unary(mon);
3817    for(;;) {
3818        op = *pch;
3819        if (op != '*' && op != '/' && op != '%')
3820            break;
3821        next();
3822        val2 = expr_unary(mon);
3823        switch(op) {
3824        default:
3825        case '*':
3826            val *= val2;
3827            break;
3828        case '/':
3829        case '%':
3830            if (val2 == 0)
3831                expr_error(mon, "division by zero");
3832            if (op == '/')
3833                val /= val2;
3834            else
3835                val %= val2;
3836            break;
3837        }
3838    }
3839    return val;
3840}
3841
3842static int64_t expr_logic(Monitor *mon)
3843{
3844    int64_t val, val2;
3845    int op;
3846
3847    val = expr_prod(mon);
3848    for(;;) {
3849        op = *pch;
3850        if (op != '&' && op != '|' && op != '^')
3851            break;
3852        next();
3853        val2 = expr_prod(mon);
3854        switch(op) {
3855        default:
3856        case '&':
3857            val &= val2;
3858            break;
3859        case '|':
3860            val |= val2;
3861            break;
3862        case '^':
3863            val ^= val2;
3864            break;
3865        }
3866    }
3867    return val;
3868}
3869
3870static int64_t expr_sum(Monitor *mon)
3871{
3872    int64_t val, val2;
3873    int op;
3874
3875    val = expr_logic(mon);
3876    for(;;) {
3877        op = *pch;
3878        if (op != '+' && op != '-')
3879            break;
3880        next();
3881        val2 = expr_logic(mon);
3882        if (op == '+')
3883            val += val2;
3884        else
3885            val -= val2;
3886    }
3887    return val;
3888}
3889
3890static int get_expr(Monitor *mon, int64_t *pval, const char **pp)
3891{
3892    pch = *pp;
3893    if (setjmp(expr_env)) {
3894        *pp = pch;
3895        return -1;
3896    }
3897    while (qemu_isspace(*pch))
3898        pch++;
3899    *pval = expr_sum(mon);
3900    *pp = pch;
3901    return 0;
3902}
3903
3904static int get_double(Monitor *mon, double *pval, const char **pp)
3905{
3906    const char *p = *pp;
3907    char *tailp;
3908    double d;
3909
3910    d = strtod(p, &tailp);
3911    if (tailp == p) {
3912        monitor_printf(mon, "Number expected\n");
3913        return -1;
3914    }
3915    if (d != d || d - d != 0) {
3916        /* NaN or infinity */
3917        monitor_printf(mon, "Bad number\n");
3918        return -1;
3919    }
3920    *pval = d;
3921    *pp = tailp;
3922    return 0;
3923}
3924
3925static int get_str(char *buf, int buf_size, const char **pp)
3926{
3927    const char *p;
3928    char *q;
3929    int c;
3930
3931    q = buf;
3932    p = *pp;
3933    while (qemu_isspace(*p))
3934        p++;
3935    if (*p == '\0') {
3936    fail:
3937        *q = '\0';
3938        *pp = p;
3939        return -1;
3940    }
3941    if (*p == '\"') {
3942        p++;
3943        while (*p != '\0' && *p != '\"') {
3944            if (*p == '\\') {
3945                p++;
3946                c = *p++;
3947                switch(c) {
3948                case 'n':
3949                    c = '\n';
3950                    break;
3951                case 'r':
3952                    c = '\r';
3953                    break;
3954                case '\\':
3955                case '\'':
3956                case '\"':
3957                    break;
3958                default:
3959                    qemu_printf("unsupported escape code: '\\%c'\n", c);
3960                    goto fail;
3961                }
3962                if ((q - buf) < buf_size - 1) {
3963                    *q++ = c;
3964                }
3965            } else {
3966                if ((q - buf) < buf_size - 1) {
3967                    *q++ = *p;
3968                }
3969                p++;
3970            }
3971        }
3972        if (*p != '\"') {
3973            qemu_printf("unterminated string\n");
3974            goto fail;
3975        }
3976        p++;
3977    } else {
3978        while (*p != '\0' && !qemu_isspace(*p)) {
3979            if ((q - buf) < buf_size - 1) {
3980                *q++ = *p;
3981            }
3982            p++;
3983        }
3984    }
3985    *q = '\0';
3986    *pp = p;
3987    return 0;
3988}
3989
3990/*
3991 * Store the command-name in cmdname, and return a pointer to
3992 * the remaining of the command string.
3993 */
3994static const char *get_command_name(const char *cmdline,
3995                                    char *cmdname, size_t nlen)
3996{
3997    size_t len;
3998    const char *p, *pstart;
3999
4000    p = cmdline;
4001    while (qemu_isspace(*p))
4002        p++;
4003    if (*p == '\0')
4004        return NULL;
4005    pstart = p;
4006    while (*p != '\0' && *p != '/' && !qemu_isspace(*p))
4007        p++;
4008    len = p - pstart;
4009    if (len > nlen - 1)
4010        len = nlen - 1;
4011    memcpy(cmdname, pstart, len);
4012    cmdname[len] = '\0';
4013    return p;
4014}
4015
4016/**
4017 * Read key of 'type' into 'key' and return the current
4018 * 'type' pointer.
4019 */
4020static char *key_get_info(const char *type, char **key)
4021{
4022    size_t len;
4023    char *p, *str;
4024
4025    if (*type == ',')
4026        type++;
4027
4028    p = strchr(type, ':');
4029    if (!p) {
4030        *key = NULL;
4031        return NULL;
4032    }
4033    len = p - type;
4034
4035    str = qemu_malloc(len + 1);
4036    memcpy(str, type, len);
4037    str[len] = '\0';
4038
4039    *key = str;
4040    return ++p;
4041}
4042
4043static int default_fmt_format = 'x';
4044static int default_fmt_size = 4;
4045
4046#define MAX_ARGS 16
4047
4048static int is_valid_option(const char *c, const char *typestr)
4049{
4050    char option[3];
4051  
4052    option[0] = '-';
4053    option[1] = *c;
4054    option[2] = '\0';
4055  
4056    typestr = strstr(typestr, option);
4057    return (typestr != NULL);
4058}
4059
4060static const mon_cmd_t *search_dispatch_table(const mon_cmd_t *disp_table,
4061                                              const char *cmdname)
4062{
4063    const mon_cmd_t *cmd;
4064
4065    for (cmd = disp_table; cmd->name != NULL; cmd++) {
4066        if (compare_cmd(cmdname, cmd->name)) {
4067            return cmd;
4068        }
4069    }
4070
4071    return NULL;
4072}
4073
4074static const mon_cmd_t *monitor_find_command(const char *cmdname)
4075{
4076    return search_dispatch_table(mon_cmds, cmdname);
4077}
4078
4079static const mon_cmd_t *qmp_find_query_cmd(const char *info_item)
4080{
4081    return search_dispatch_table(qmp_query_cmds, info_item);
4082}
4083
4084static const mon_cmd_t *qmp_find_cmd(const char *cmdname)
4085{
4086    return search_dispatch_table(qmp_cmds, cmdname);
4087}
4088
4089static const mon_cmd_t *monitor_parse_command(Monitor *mon,
4090                                              const char *cmdline,
4091                                              QDict *qdict)
4092{
4093    const char *p, *typestr;
4094    int c;
4095    const mon_cmd_t *cmd;
4096    char cmdname[256];
4097    char buf[1024];
4098    char *key;
4099
4100#ifdef DEBUG
4101    monitor_printf(mon, "command='%s'\n", cmdline);
4102#endif
4103
4104    /* extract the command name */
4105    p = get_command_name(cmdline, cmdname, sizeof(cmdname));
4106    if (!p)
4107        return NULL;
4108
4109    cmd = monitor_find_command(cmdname);
4110    if (!cmd) {
4111        monitor_printf(mon, "unknown command: '%s'\n", cmdname);
4112        return NULL;
4113    }
4114
4115    /* parse the parameters */
4116    typestr = cmd->args_type;
4117    for(;;) {
4118        typestr = key_get_info(typestr, &key);
4119        if (!typestr)
4120            break;
4121        c = *typestr;
4122        typestr++;
4123        switch(c) {
4124        case 'F':
4125        case 'B':
4126        case 's':
4127            {
4128                int ret;
4129
4130                while (qemu_isspace(*p))
4131                    p++;
4132                if (*typestr == '?') {
4133                    typestr++;
4134                    if (*p == '\0') {
4135                        /* no optional string: NULL argument */
4136                        break;
4137                    }
4138                }
4139                ret = get_str(buf, sizeof(buf), &p);
4140                if (ret < 0) {
4141                    switch(c) {
4142                    case 'F':
4143                        monitor_printf(mon, "%s: filename expected\n",
4144                                       cmdname);
4145                        break;
4146                    case 'B':
4147                        monitor_printf(mon, "%s: block device name expected\n",
4148                                       cmdname);
4149                        break;
4150                    default:
4151                        monitor_printf(mon, "%s: string expected\n", cmdname);
4152                        break;
4153                    }
4154                    goto fail;
4155                }
4156                qdict_put(qdict, key, qstring_from_str(buf));
4157            }
4158            break;
4159        case 'O':
4160            {
4161                QemuOptsList *opts_list;
4162                QemuOpts *opts;
4163
4164                opts_list = qemu_find_opts(key);
4165                if (!opts_list || opts_list->desc->name) {
4166                    goto bad_type;
4167                }
4168                while (qemu_isspace(*p)) {
4169                    p++;
4170                }
4171                if (!*p)
4172                    break;
4173                if (get_str(buf, sizeof(buf), &p) < 0) {
4174                    goto fail;
4175                }
4176                opts = qemu_opts_parse(opts_list, buf, 1);
4177                if (!opts) {
4178                    goto fail;
4179                }
4180                qemu_opts_to_qdict(opts, qdict);
4181                qemu_opts_del(opts);
4182            }
4183            break;
4184        case '/':
4185            {
4186                int count, format, size;
4187
4188                while (qemu_isspace(*p))
4189                    p++;
4190                if (*p == '/') {
4191                    /* format found */
4192                    p++;
4193                    count = 1;
4194                    if (qemu_isdigit(*p)) {
4195                        count = 0;
4196                        while (qemu_isdigit(*p)) {
4197                            count = count * 10 + (*p - '0');
4198                            p++;
4199                        }
4200                    }
4201                    size = -1;
4202                    format = -1;
4203                    for(;;) {
4204                        switch(*p) {
4205                        case 'o':
4206                        case 'd':
4207                        case 'u':
4208                        case 'x':
4209                        case 'i':
4210                        case 'c':
4211                            format = *p++;
4212                            break;
4213                        case 'b':
4214                            size = 1;
4215                            p++;
4216                            break;
4217                        case 'h':
4218                            size = 2;
4219                            p++;
4220                            break;
4221                        case 'w':
4222                            size = 4;
4223                            p++;
4224                            break;
4225                        case 'g':
4226                        case 'L':
4227                            size = 8;
4228                            p++;
4229                            break;
4230                        default:
4231                            goto next;
4232                        }
4233                    }
4234                next:
4235                    if (*p != '\0' && !qemu_isspace(*p)) {
4236                        monitor_printf(mon, "invalid char in format: '%c'\n",
4237                                       *p);
4238                        goto fail;
4239                    }
4240                    if (format < 0)
4241                        format = default_fmt_format;
4242                    if (format != 'i') {
4243                        /* for 'i', not specifying a size gives -1 as size */
4244                        if (size < 0)
4245                            size = default_fmt_size;
4246                        default_fmt_size = size;
4247                    }
4248                    default_fmt_format = format;
4249                } else {
4250                    count = 1;
4251                    format = default_fmt_format;
4252                    if (format != 'i') {
4253                        size = default_fmt_size;
4254                    } else {
4255                        size = -1;
4256                    }
4257                }
4258                qdict_put(qdict, "count", qint_from_int(count));
4259                qdict_put(qdict, "format", qint_from_int(format));
4260                qdict_put(qdict, "size", qint_from_int(size));
4261            }
4262            break;
4263        case 'i':
4264        case 'l':
4265        case 'M':
4266            {
4267                int64_t val;
4268
4269                while (qemu_isspace(*p))
4270                    p++;
4271                if (*typestr == '?' || *typestr == '.') {
4272                    if (*typestr == '?') {
4273                        if (*p == '\0') {
4274                            typestr++;
4275                            break;
4276                        }
4277                    } else {
4278                        if (*p == '.') {
4279                            p++;
4280                            while (qemu_isspace(*p))
4281                                p++;
4282                        } else {
4283                            typestr++;
4284                            break;
4285                        }
4286                    }
4287                    typestr++;
4288                }
4289                if (get_expr(mon, &val, &p))
4290                    goto fail;
4291                /* Check if 'i' is greater than 32-bit */
4292                if ((c == 'i') && ((val >> 32) & 0xffffffff)) {
4293                    monitor_printf(mon, "\'%s\' has failed: ", cmdname);
4294                    monitor_printf(mon, "integer is for 32-bit values\n");
4295                    goto fail;
4296                } else if (c == 'M') {
4297                    val <<= 20;
4298                }
4299                qdict_put(qdict, key, qint_from_int(val));
4300            }
4301            break;
4302        case 'o':
4303            {
4304                int64_t val;
4305                char *end;
4306
4307                while (qemu_isspace(*p)) {
4308                    p++;
4309                }
4310                if (*typestr == '?') {
4311                    typestr++;
4312                    if (*p == '\0') {
4313                        break;
4314                    }
4315                }
4316                val = strtosz(p, &end);
4317                if (val < 0) {
4318                    monitor_printf(mon, "invalid size\n");
4319                    goto fail;
4320                }
4321                qdict_put(qdict, key, qint_from_int(val));
4322                p = end;
4323            }
4324            break;
4325        case 'T':
4326            {
4327                double val;
4328
4329                while (qemu_isspace(*p))
4330                    p++;
4331                if (*typestr == '?') {
4332                    typestr++;
4333                    if (*p == '\0') {
4334                        break;
4335                    }
4336                }
4337                if (get_double(mon, &val, &p) < 0) {
4338                    goto fail;
4339                }
4340                if (p[0] && p[1] == 's') {
4341                    switch (*p) {
4342                    case 'm':
4343                        val /= 1e3; p += 2; break;
4344                    case 'u':
4345                        val /= 1e6; p += 2; break;
4346                    case 'n':
4347                        val /= 1e9; p += 2; break;
4348                    }
4349                }
4350                if (*p && !qemu_isspace(*p)) {
4351                    monitor_printf(mon, "Unknown unit suffix\n");
4352                    goto fail;
4353                }
4354                qdict_put(qdict, key, qfloat_from_double(val));
4355            }
4356            break;
4357        case 'b':
4358            {
4359                const char *beg;
4360                int val;
4361
4362                while (qemu_isspace(*p)) {
4363                    p++;
4364                }
4365                beg = p;
4366                while (qemu_isgraph(*p)) {
4367                    p++;
4368                }
4369                if (p - beg == 2 && !memcmp(beg, "on", p - beg)) {
4370                    val = 1;
4371                } else if (p - beg == 3 && !memcmp(beg, "off", p - beg)) {
4372                    val = 0;
4373                } else {
4374                    monitor_printf(mon, "Expected 'on' or 'off'\n");
4375                    goto fail;
4376                }
4377                qdict_put(qdict, key, qbool_from_int(val));
4378            }
4379            break;
4380        case '-':
4381            {
4382                const char *tmp = p;
4383                int skip_key = 0;
4384                /* option */
4385
4386                c = *typestr++;
4387                if (c == '\0')
4388                    goto bad_type;
4389                while (qemu_isspace(*p))
4390                    p++;
4391                if (*p == '-') {
4392                    p++;
4393                    if(c != *p) {
4394                        if(!is_valid_option(p, typestr)) {
4395                  
4396                            monitor_printf(mon, "%s: unsupported option -%c\n",
4397                                           cmdname, *p);
4398                            goto fail;
4399                        } else {
4400                            skip_key = 1;
4401                        }
4402                    }
4403                    if(skip_key) {
4404                        p = tmp;
4405                    } else {
4406                        /* has option */
4407                        p++;
4408                        qdict_put(qdict, key, qbool_from_int(1));
4409                    }
4410                }
4411            }
4412            break;
4413        default:
4414        bad_type:
4415            monitor_printf(mon, "%s: unknown type '%c'\n", cmdname, c);
4416            goto fail;
4417        }
4418        qemu_free(key);
4419        key = NULL;
4420    }
4421    /* check that all arguments were parsed */
4422    while (qemu_isspace(*p))
4423        p++;
4424    if (*p != '\0') {
4425        monitor_printf(mon, "%s: extraneous characters at the end of line\n",
4426                       cmdname);
4427        goto fail;
4428    }
4429
4430    return cmd;
4431
4432fail:
4433    qemu_free(key);
4434    return NULL;
4435}
4436
4437void monitor_set_error(Monitor *mon, QError *qerror)
4438{
4439    /* report only the first error */
4440    if (!mon->error) {
4441        mon->error = qerror;
4442    } else {
4443        MON_DEBUG("Additional error report at %s:%d\n",
4444                  qerror->file, qerror->linenr);
4445        QDECREF(qerror);
4446    }
4447}
4448
4449static void handler_audit(Monitor *mon, const mon_cmd_t *cmd, int ret)
4450{
4451    if (ret && !monitor_has_error(mon)) {
4452        /*
4453         * If it returns failure, it must have passed on error.
4454         *
4455         * Action: Report an internal error to the client if in QMP.
4456         */
4457        qerror_report(QERR_UNDEFINED_ERROR);
4458        MON_DEBUG("command '%s' returned failure but did not pass an error\n",
4459                  cmd->name);
4460    }
4461
4462#ifdef CONFIG_DEBUG_MONITOR
4463    if (!ret && monitor_has_error(mon)) {
4464        /*
4465         * If it returns success, it must not have passed an error.
4466         *
4467         * Action: Report the passed error to the client.
4468         */
4469        MON_DEBUG("command '%s' returned success but passed an error\n",
4470                  cmd->name);
4471    }
4472
4473    if (mon_print_count_get(mon) > 0 && strcmp(cmd->name, "info") != 0) {
4474        /*
4475         * Handlers should not call Monitor print functions.
4476         *
4477         * Action: Ignore them in QMP.
4478         *
4479         * (XXX: we don't check any 'info' or 'query' command here
4480         * because the user print function _is_ called by do_info(), hence
4481         * we will trigger this check. This problem will go away when we
4482         * make 'query' commands real and kill do_info())
4483         */
4484        MON_DEBUG("command '%s' called print functions %d time(s)\n",
4485                  cmd->name, mon_print_count_get(mon));
4486    }
4487#endif
4488}
4489
4490static void handle_user_command(Monitor *mon, const char *cmdline)
4491{
4492    QDict *qdict;
4493    const mon_cmd_t *cmd;
4494
4495    qdict = qdict_new();
4496
4497    cmd = monitor_parse_command(mon, cmdline, qdict);
4498    if (!cmd)
4499        goto out;
4500
4501    if (handler_is_async(cmd)) {
4502        user_async_cmd_handler(mon, cmd, qdict);
4503    } else if (handler_is_qobject(cmd)) {
4504        QObject *data = NULL;
4505
4506        /* XXX: ignores the error code */
4507        cmd->mhandler.cmd_new(mon, qdict, &data);
4508        assert(!monitor_has_error(mon));
4509        if (data) {
4510            cmd->user_print(mon, data);
4511            qobject_decref(data);
4512        }
4513    } else {
4514        cmd->mhandler.cmd(mon, qdict);
4515    }
4516
4517out:
4518    QDECREF(qdict);
4519}
4520
4521static void cmd_completion(const char *name, const char *list)
4522{
4523    const char *p, *pstart;
4524    char cmd[128];
4525    int len;
4526
4527    p = list;
4528    for(;;) {
4529        pstart = p;
4530        p = strchr(p, '|');
4531        if (!p)
4532            p = pstart + strlen(pstart);
4533        len = p - pstart;
4534        if (len > sizeof(cmd) - 2)
4535            len = sizeof(cmd) - 2;
4536        memcpy(cmd, pstart, len);
4537        cmd[len] = '\0';
4538        if (name[0] == '\0' || !strncmp(name, cmd, strlen(name))) {
4539            readline_add_completion(cur_mon->rs, cmd);
4540        }
4541        if (*p == '\0')
4542            break;
4543        p++;
4544    }
4545}
4546
4547static void file_completion(const char *input)
4548{
4549    DIR *ffs;
4550    struct dirent *d;
4551    char path[1024];
4552    char file[1024], file_prefix[1024];
4553    int input_path_len;
4554    const char *p;
4555
4556    p = strrchr(input, '/');
4557    if (!p) {
4558        input_path_len = 0;
4559        pstrcpy(file_prefix, sizeof(file_prefix), input);
4560        pstrcpy(path, sizeof(path), ".");
4561    } else {
4562        input_path_len = p - input + 1;
4563        memcpy(path, input, input_path_len);
4564        if (input_path_len > sizeof(path) - 1)
4565            input_path_len = sizeof(path) - 1;
4566        path[input_path_len] = '\0';
4567        pstrcpy(file_prefix, sizeof(file_prefix), p + 1);
4568    }
4569#ifdef DEBUG_COMPLETION
4570    monitor_printf(cur_mon, "input='%s' path='%s' prefix='%s'\n",
4571                   input, path, file_prefix);
4572#endif
4573    ffs = opendir(path);
4574    if (!ffs)
4575        return;
4576    for(;;) {
4577        struct stat sb;
4578        d = readdir(ffs);
4579        if (!d)
4580            break;
4581
4582        if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) {
4583            continue;
4584        }
4585
4586        if (strstart(d->d_name, file_prefix, NULL)) {
4587            memcpy(file, input, input_path_len);
4588            if (input_path_len < sizeof(file))
4589                pstrcpy(file + input_path_len, sizeof(file) - input_path_len,
4590                        d->d_name);
4591            /* stat the file to find out if it's a directory.
4592             * In that case add a slash to speed up typing long paths
4593             */
4594            stat(file, &sb);
4595            if(S_ISDIR(sb.st_mode))
4596                pstrcat(file, sizeof(file), "/");
4597            readline_add_completion(cur_mon->rs, file);
4598        }
4599    }
4600    closedir(ffs);
4601}
4602
4603static void block_completion_it(void *opaque, BlockDriverState *bs)
4604{
4605    const char *name = bdrv_get_device_name(bs);
4606    const char *input = opaque;
4607
4608    if (input[0] == '\0' ||
4609        !strncmp(name, (char *)input, strlen(input))) {
4610        readline_add_completion(cur_mon->rs, name);
4611    }
4612}
4613
4614/* NOTE: this parser is an approximate form of the real command parser */
4615static void parse_cmdline(const char *cmdline,
4616                         int *pnb_args, char **args)
4617{
4618    const char *p;
4619    int nb_args, ret;
4620    char buf[1024];
4621
4622    p = cmdline;
4623    nb_args = 0;
4624    for(;;) {
4625        while (qemu_isspace(*p))
4626            p++;
4627        if (*p == '\0')
4628            break;
4629        if (nb_args >= MAX_ARGS)
4630            break;
4631        ret = get_str(buf, sizeof(buf), &p);
4632        args[nb_args] = qemu_strdup(buf);
4633        nb_args++;
4634        if (ret < 0)
4635            break;
4636    }
4637    *pnb_args = nb_args;
4638}
4639
4640static const char *next_arg_type(const char *typestr)
4641{
4642    const char *p = strchr(typestr, ':');
4643    return (p != NULL ? ++p : typestr);
4644}
4645
4646static void monitor_find_completion(const char *cmdline)
4647{
4648    const char *cmdname;
4649    char *args[MAX_ARGS];
4650    int nb_args, i, len;
4651    const char *ptype, *str;
4652    const mon_cmd_t *cmd;
4653    const KeyDef *key;
4654
4655    parse_cmdline(cmdline, &nb_args, args);
4656#ifdef DEBUG_COMPLETION
4657    for(i = 0; i < nb_args; i++) {
4658        monitor_printf(cur_mon, "arg%d = '%s'\n", i, (char *)args[i]);
4659    }
4660#endif
4661
4662    /* if the line ends with a space, it means we want to complete the
4663       next arg */
4664    len = strlen(cmdline);
4665    if (len > 0 && qemu_isspace(cmdline[len - 1])) {
4666        if (nb_args >= MAX_ARGS) {
4667            goto cleanup;
4668        }
4669        args[nb_args++] = qemu_strdup("");
4670    }
4671    if (nb_args <= 1) {
4672        /* command completion */
4673        if (nb_args == 0)
4674            cmdname = "";
4675        else
4676            cmdname = args[0];
4677        readline_set_completion_index(cur_mon->rs, strlen(cmdname));
4678        for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
4679            cmd_completion(cmdname, cmd->name);
4680        }
4681    } else {
4682        /* find the command */
4683        for (cmd = mon_cmds; cmd->name != NULL; cmd++) {
4684            if (compare_cmd(args[0], cmd->name)) {
4685                break;
4686            }
4687        }
4688        if (!cmd->name) {
4689            goto cleanup;
4690        }
4691
4692        ptype = next_arg_type(cmd->args_type);
4693        for(i = 0; i < nb_args - 2; i++) {
4694            if (*ptype != '\0') {
4695                ptype = next_arg_type(ptype);
4696                while (*ptype == '?')
4697                    ptype = next_arg_type(ptype);
4698            }
4699        }
4700        str = args[nb_args - 1];
4701        if (*ptype == '-' && ptype[1] != '\0') {
4702            ptype = next_arg_type(ptype);
4703        }
4704        switch(*ptype) {
4705        case 'F':
4706            /* file completion */
4707            readline_set_completion_index(cur_mon->rs, strlen(str));
4708            file_completion(str);
4709            break;
4710        case 'B':
4711            /* block device name completion */
4712            readline_set_completion_index(cur_mon->rs, strlen(str));
4713            bdrv_iterate(block_completion_it, (void *)str);
4714            break;
4715        case 's':
4716            /* XXX: more generic ? */
4717            if (!strcmp(cmd->name, "info")) {
4718                readline_set_completion_index(cur_mon->rs, strlen(str));
4719                for(cmd = info_cmds; cmd->name != NULL; cmd++) {
4720                    cmd_completion(str, cmd->name);
4721                }
4722            } else if (!strcmp(cmd->name, "sendkey")) {
4723                char *sep = strrchr(str, '-');
4724                if (sep)
4725                    str = sep + 1;
4726                readline_set_completion_index(cur_mon->rs, strlen(str));
4727                for(key = key_defs; key->name != NULL; key++) {
4728                    cmd_completion(str, key->name);
4729                }
4730            } else if (!strcmp(cmd->name, "help|?")) {
4731                readline_set_completion_index(cur_mon->rs, strlen(str));
4732                for (cmd = mon_cmds; cmd->name != NULL; cmd++) {
4733                    cmd_completion(str, cmd->name);
4734                }
4735            }
4736            break;
4737        default:
4738            break;
4739        }
4740    }
4741
4742cleanup:
4743    for (i = 0; i < nb_args; i++) {
4744        qemu_free(args[i]);
4745    }
4746}
4747
4748static int monitor_can_read(void *opaque)
4749{
4750    Monitor *mon = opaque;
4751
4752    return (mon->suspend_cnt == 0) ? 1 : 0;
4753}
4754
4755static int invalid_qmp_mode(const Monitor *mon, const char *cmd_name)
4756{
4757    int is_cap = compare_cmd(cmd_name, "qmp_capabilities");
4758    return (qmp_cmd_mode(mon) ? is_cap : !is_cap);
4759}
4760
4761/*
4762 * Argument validation rules:
4763 *
4764 * 1. The argument must exist in cmd_args qdict
4765 * 2. The argument type must be the expected one
4766 *
4767 * Special case: If the argument doesn't exist in cmd_args and
4768 *               the QMP_ACCEPT_UNKNOWNS flag is set, then the
4769 *               checking is skipped for it.
4770 */
4771static int check_client_args_type(const QDict *client_args,
4772                                  const QDict *cmd_args, int flags)
4773{
4774    const QDictEntry *ent;
4775
4776    for (ent = qdict_first(client_args); ent;ent = qdict_next(client_args,ent)){
4777        QObject *obj;
4778        QString *arg_type;
4779        const QObject *client_arg = qdict_entry_value(ent);
4780        const char *client_arg_name = qdict_entry_key(ent);
4781
4782        obj = qdict_get(cmd_args, client_arg_name);
4783        if (!obj) {
4784            if (flags & QMP_ACCEPT_UNKNOWNS) {
4785                /* handler accepts unknowns */
4786                continue;
4787            }
4788            /* client arg doesn't exist */
4789            qerror_report(QERR_INVALID_PARAMETER, client_arg_name);
4790            return -1;
4791        }
4792
4793        arg_type = qobject_to_qstring(obj);
4794        assert(arg_type != NULL);
4795
4796        /* check if argument's type is correct */
4797        switch (qstring_get_str(arg_type)[0]) {
4798        case 'F':
4799        case 'B':
4800        case 's':
4801            if (qobject_type(client_arg) != QTYPE_QSTRING) {
4802                qerror_report(QERR_INVALID_PARAMETER_TYPE, client_arg_name,
4803                              "string");
4804                return -1;
4805            }
4806        break;
4807        case 'i':
4808        case 'l':
4809        case 'M':
4810        case 'o':
4811            if (qobject_type(client_arg) != QTYPE_QINT) {
4812                qerror_report(QERR_INVALID_PARAMETER_TYPE, client_arg_name,
4813                              "int");
4814                return -1; 
4815            }
4816            break;
4817        case 'T':
4818            if (qobject_type(client_arg) != QTYPE_QINT &&
4819                qobject_type(client_arg) != QTYPE_QFLOAT) {
4820                qerror_report(QERR_INVALID_PARAMETER_TYPE, client_arg_name,
4821                              "number");
4822               return -1; 
4823            }
4824            break;
4825        case 'b':
4826        case '-':
4827            if (qobject_type(client_arg) != QTYPE_QBOOL) {
4828                qerror_report(QERR_INVALID_PARAMETER_TYPE, client_arg_name,
4829                              "bool");
4830               return -1; 
4831            }
4832            break;
4833        case 'O':
4834            assert(flags & QMP_ACCEPT_UNKNOWNS);
4835            break;
4836        case '/':
4837        case '.':
4838            /*
4839             * These types are not supported by QMP and thus are not
4840             * handled here. Fall through.
4841             */
4842        default:
4843            abort();
4844        }
4845    }
4846
4847    return 0;
4848}
4849
4850/*
4851 * - Check if the client has passed all mandatory args
4852 * - Set special flags for argument validation
4853 */
4854static int check_mandatory_args(const QDict *cmd_args,
4855                                const QDict *client_args, int *flags)
4856{
4857    const QDictEntry *ent;
4858
4859    for (ent = qdict_first(cmd_args); ent; ent = qdict_next(cmd_args, ent)) {
4860        const char *cmd_arg_name = qdict_entry_key(ent);
4861        QString *type = qobject_to_qstring(qdict_entry_value(ent));
4862        assert(type != NULL);
4863
4864        if (qstring_get_str(type)[0] == 'O') {
4865            assert((*flags & QMP_ACCEPT_UNKNOWNS) == 0);
4866            *flags |= QMP_ACCEPT_UNKNOWNS;
4867        } else if (qstring_get_str(type)[0] != '-' &&
4868                   qstring_get_str(type)[1] != '?' &&
4869                   !qdict_haskey(client_args, cmd_arg_name)) {
4870            qerror_report(QERR_MISSING_PARAMETER, cmd_arg_name);
4871            return -1;
4872        }
4873    }
4874
4875    return 0;
4876}
4877
4878static QDict *qdict_from_args_type(const char *args_type)
4879{
4880    int i;
4881    QDict *qdict;
4882    QString *key, *type, *cur_qs;
4883
4884    assert(args_type != NULL);
4885
4886    qdict = qdict_new();
4887
4888    if (args_type == NULL || args_type[0] == '\0') {
4889        /* no args, empty qdict */
4890        goto out;
4891    }
4892
4893    key = qstring_new();
4894    type = qstring_new();
4895
4896    cur_qs = key;
4897
4898    for (i = 0;; i++) {
4899        switch (args_type[i]) {
4900            case ',':
4901            case '\0':
4902                qdict_put(qdict, qstring_get_str(key), type);
4903                QDECREF(key);
4904                if (args_type[i] == '\0') {
4905                    goto out;
4906                }
4907                type = qstring_new(); /* qdict has ref */
4908                cur_qs = key = qstring_new();
4909                break;
4910            case ':':
4911                cur_qs = type;
4912                break;
4913            default:
4914                qstring_append_chr(cur_qs, args_type[i]);
4915                break;
4916        }
4917    }
4918
4919out:
4920    return qdict;
4921}
4922
4923/*
4924 * Client argument checking rules:
4925 *
4926 * 1. Client must provide all mandatory arguments
4927 * 2. Each argument provided by the client must be expected
4928 * 3. Each argument provided by the client must have the type expected
4929 *    by the command
4930 */
4931static int qmp_check_client_args(const mon_cmd_t *cmd, QDict *client_args)
4932{
4933    int flags, err;
4934    QDict *cmd_args;
4935
4936    cmd_args = qdict_from_args_type(cmd->args_type);
4937
4938    flags = 0;
4939    err = check_mandatory_args(cmd_args, client_args, &flags);
4940    if (err) {
4941        goto out;
4942    }
4943
4944    err = check_client_args_type(client_args, cmd_args, flags);
4945
4946out:
4947    QDECREF(cmd_args);
4948    return err;
4949}
4950
4951/*
4952 * Input object checking rules
4953 *
4954 * 1. Input object must be a dict
4955 * 2. The "execute" key must exist
4956 * 3. The "execute" key must be a string
4957 * 4. If the "arguments" key exists, it must be a dict
4958 * 5. If the "id" key exists, it can be anything (ie. json-value)
4959 * 6. Any argument not listed above is considered invalid
4960 */
4961static QDict *qmp_check_input_obj(QObject *input_obj)
4962{
4963    const QDictEntry *ent;
4964    int has_exec_key = 0;
4965    QDict *input_dict;
4966
4967    if (qobject_type(input_obj) != QTYPE_QDICT) {
4968        qerror_report(QERR_QMP_BAD_INPUT_OBJECT, "object");
4969        return NULL;
4970    }
4971
4972    input_dict = qobject_to_qdict(input_obj);
4973
4974    for (ent = qdict_first(input_dict); ent; ent = qdict_next(input_dict, ent)){
4975        const char *arg_name = qdict_entry_key(ent);
4976        const QObject *arg_obj = qdict_entry_value(ent);
4977
4978        if (!strcmp(arg_name, "execute")) {
4979            if (qobject_type(arg_obj) != QTYPE_QSTRING) {
4980                qerror_report(QERR_QMP_BAD_INPUT_OBJECT_MEMBER, "execute",
4981                              "string");
4982                return NULL;
4983            }
4984            has_exec_key = 1;
4985        } else if (!strcmp(arg_name, "arguments")) {
4986            if (qobject_type(arg_obj) != QTYPE_QDICT) {
4987                qerror_report(QERR_QMP_BAD_INPUT_OBJECT_MEMBER, "arguments",
4988                              "object");
4989                return NULL;
4990            }
4991        } else if (!strcmp(arg_name, "id")) {
4992            /* FIXME: check duplicated IDs for async commands */
4993        } else {
4994            qerror_report(QERR_QMP_EXTRA_MEMBER, arg_name);
4995            return NULL;
4996        }
4997    }
4998
4999    if (!has_exec_key) {
5000        qerror_report(QERR_QMP_BAD_INPUT_OBJECT, "execute");
5001        return NULL;
5002    }
5003
5004    return input_dict;
5005}
5006
5007static void qmp_call_query_cmd(Monitor *mon, const mon_cmd_t *cmd)
5008{
5009    QObject *ret_data = NULL;
5010
5011    if (handler_is_async(cmd)) {
5012        qmp_async_info_handler(mon, cmd);
5013        if (monitor_has_error(mon)) {
5014            monitor_protocol_emitter(mon, NULL);
5015        }
5016    } else {
5017        cmd->mhandler.info_new(mon, &ret_data);
5018        monitor_protocol_emitter(mon, ret_data);
5019        qobject_decref(ret_data);
5020    }
5021}
5022
5023static void qmp_call_cmd(Monitor *mon, const mon_cmd_t *cmd,
5024                         const QDict *params)
5025{
5026    int ret;
5027    QObject *data = NULL;
5028
5029    mon_print_count_init(mon);
5030
5031    ret = cmd->mhandler.cmd_new(mon, params, &data);
5032    handler_audit(mon, cmd, ret);
5033    monitor_protocol_emitter(mon, data);
5034    qobject_decref(data);
5035}
5036
5037static void handle_qmp_command(JSONMessageParser *parser, QList *tokens)
5038{
5039    int err;
5040    QObject *obj;
5041    QDict *input, *args;
5042    const mon_cmd_t *cmd;
5043    Monitor *mon = cur_mon;
5044    const char *cmd_name, *query_cmd;
5045
5046    query_cmd = NULL;
5047    args = input = NULL;
5048
5049    obj = json_parser_parse(tokens, NULL);
5050    if (!obj) {
5051        // FIXME: should be triggered in json_parser_parse()
5052        qerror_report(QERR_JSON_PARSING);
5053        goto err_out;
5054    }
5055
5056    input = qmp_check_input_obj(obj);
5057    if (!input) {
5058        qobject_decref(obj);
5059        goto err_out;
5060    }
5061
5062    mon->mc->id = qdict_get(input, "id");
5063    qobject_incref(mon->mc->id);
5064
5065    cmd_name = qdict_get_str(input, "execute");
5066    if (invalid_qmp_mode(mon, cmd_name)) {
5067        qerror_report(QERR_COMMAND_NOT_FOUND, cmd_name);
5068        goto err_out;
5069    }
5070
5071    if (strstart(cmd_name, "query-", &query_cmd)) {
5072        cmd = qmp_find_query_cmd(query_cmd);
5073    } else {
5074        cmd = qmp_find_cmd(cmd_name);
5075    }
5076
5077    if (!cmd) {
5078        qerror_report(QERR_COMMAND_NOT_FOUND, cmd_name);
5079        goto err_out;
5080    }
5081
5082    obj = qdict_get(input, "arguments");
5083    if (!obj) {
5084        args = qdict_new();
5085    } else {
5086        args = qobject_to_qdict(obj);
5087        QINCREF(args);
5088    }
5089
5090    err = qmp_check_client_args(cmd, args);
5091    if (err < 0) {
5092        goto err_out;
5093    }
5094
5095    if (query_cmd) {
5096        qmp_call_query_cmd(mon, cmd);
5097    } else if (handler_is_async(cmd)) {
5098        err = qmp_async_cmd_handler(mon, cmd, args);
5099        if (err) {
5100            /* emit the error response */
5101            goto err_out;
5102        }
5103    } else {
5104        qmp_call_cmd(mon, cmd, args);
5105    }
5106
5107    goto out;
5108
5109err_out:
5110    monitor_protocol_emitter(mon, NULL);
5111out:
5112    QDECREF(input);
5113    QDECREF(args);
5114}
5115
5116/**
5117 * monitor_control_read(): Read and handle QMP input
5118 */
5119static void monitor_control_read(void *opaque, const uint8_t *buf, int size)
5120{
5121    Monitor *old_mon = cur_mon;
5122
5123    cur_mon = opaque;
5124
5125    json_message_parser_feed(&cur_mon->mc->parser, (const char *) buf, size);
5126
5127    cur_mon = old_mon;
5128}
5129
5130static void monitor_read(void *opaque, const uint8_t *buf, int size)
5131{
5132    Monitor *old_mon = cur_mon;
5133    int i;
5134
5135    cur_mon = opaque;
5136
5137    if (cur_mon->rs) {
5138        for (i = 0; i < size; i++)
5139            readline_handle_byte(cur_mon->rs, buf[i]);
5140    } else {
5141        if (size == 0 || buf[size - 1] != 0)
5142            monitor_printf(cur_mon, "corrupted command\n");
5143        else
5144            handle_user_command(cur_mon, (char *)buf);
5145    }
5146
5147    cur_mon = old_mon;
5148}
5149
5150static void monitor_command_cb(Monitor *mon, const char *cmdline, void *opaque)
5151{
5152    monitor_suspend(mon);
5153    handle_user_command(mon, cmdline);
5154    monitor_resume(mon);
5155}
5156
5157int monitor_suspend(Monitor *mon)
5158{
5159    if (!mon->rs)
5160        return -ENOTTY;
5161    mon->suspend_cnt++;
5162    return 0;
5163}
5164
5165void monitor_resume(Monitor *mon)
5166{
5167    if (!mon->rs)
5168        return;
5169    if (--mon->suspend_cnt == 0)
5170        readline_show_prompt(mon->rs);
5171}
5172
5173static QObject *get_qmp_greeting(void)
5174{
5175    QObject *ver;
5176
5177    do_info_version(NULL, &ver);
5178    return qobject_from_jsonf("{'QMP':{'version': %p,'capabilities': []}}",ver);
5179}
5180
5181/**
5182 * monitor_control_event(): Print QMP gretting
5183 */
5184static void monitor_control_event(void *opaque, int event)
5185{
5186    QObject *data;
5187    Monitor *mon = opaque;
5188
5189    switch (event) {
5190    case CHR_EVENT_OPENED:
5191        mon->mc->command_mode = 0;
5192        json_message_parser_init(&mon->mc->parser, handle_qmp_command);
5193        data = get_qmp_greeting();
5194        monitor_json_emitter(mon, data);
5195        qobject_decref(data);
5196        break;
5197    case CHR_EVENT_CLOSED:
5198        json_message_parser_destroy(&mon->mc->parser);
5199        break;
5200    }
5201}
5202
5203static void monitor_event(void *opaque, int event)
5204{
5205    Monitor *mon = opaque;
5206
5207    switch (event) {
5208    case CHR_EVENT_MUX_IN:
5209        mon->mux_out = 0;
5210        if (mon->reset_seen) {
5211            readline_restart(mon->rs);
5212            monitor_resume(mon);
5213            monitor_flush(mon);
5214        } else {
5215            mon->suspend_cnt = 0;
5216        }
5217        break;
5218
5219    case CHR_EVENT_MUX_OUT:
5220        if (mon->reset_seen) {
5221            if (mon->suspend_cnt == 0) {
5222                monitor_printf(mon, "\n");
5223            }
5224            monitor_flush(mon);
5225            monitor_suspend(mon);
5226        } else {
5227            mon->suspend_cnt++;
5228        }
5229        mon->mux_out = 1;
5230        break;
5231
5232    case CHR_EVENT_OPENED:
5233        monitor_printf(mon, "QEMU %s monitor - type 'help' for more "
5234                       "information\n", QEMU_VERSION);
5235        if (!mon->mux_out) {
5236            readline_show_prompt(mon->rs);
5237        }
5238        mon->reset_seen = 1;
5239        break;
5240    }
5241}
5242
5243
5244/*
5245 * Local variables:
5246 *  c-indent-level: 4
5247 *  c-basic-offset: 4
5248 *  tab-width: 8
5249 * End:
5250 */
5251
5252void monitor_init(CharDriverState *chr, int flags)
5253{
5254    static int is_first_init = 1;
5255    Monitor *mon;
5256
5257    if (is_first_init) {
5258        key_timer = qemu_new_timer_ns(vm_clock, release_keys, NULL);
5259        is_first_init = 0;
5260    }
5261
5262    mon = qemu_mallocz(sizeof(*mon));
5263
5264    mon->chr = chr;
5265    mon->flags = flags;
5266    if (flags & MONITOR_USE_READLINE) {
5267        mon->rs = readline_init(mon, monitor_find_completion);
5268        monitor_read_command(mon, 0);
5269    }
5270
5271    if (monitor_ctrl_mode(mon)) {
5272        mon->mc = qemu_mallocz(sizeof(MonitorControl));
5273        /* Control mode requires special handlers */
5274        qemu_chr_add_handlers(chr, monitor_can_read, monitor_control_read,
5275                              monitor_control_event, mon);
5276        qemu_chr_set_echo(chr, true);
5277    } else {
5278        qemu_chr_add_handlers(chr, monitor_can_read, monitor_read,
5279                              monitor_event, mon);
5280    }
5281
5282    QLIST_INSERT_HEAD(&mon_list, mon, entry);
5283    if (!default_mon || (flags & MONITOR_IS_DEFAULT))
5284        default_mon = mon;
5285}
5286
5287static void bdrv_password_cb(Monitor *mon, const char *password, void *opaque)
5288{
5289    BlockDriverState *bs = opaque;
5290    int ret = 0;
5291
5292    if (bdrv_set_key(bs, password) != 0) {
5293        monitor_printf(mon, "invalid password\n");
5294        ret = -EPERM;
5295    }
5296    if (mon->password_completion_cb)
5297        mon->password_completion_cb(mon->password_opaque, ret);
5298
5299    monitor_read_command(mon, 1);
5300}
5301
5302int monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs,
5303                                BlockDriverCompletionFunc *completion_cb,
5304                                void *opaque)
5305{
5306    int err;
5307
5308    if (!bdrv_key_required(bs)) {
5309        if (completion_cb)
5310            completion_cb(opaque, 0);
5311        return 0;
5312    }
5313
5314    if (monitor_ctrl_mode(mon)) {
5315        qerror_report(QERR_DEVICE_ENCRYPTED, bdrv_get_device_name(bs));
5316        return -1;
5317    }
5318
5319    monitor_printf(mon, "%s (%s) is encrypted.\n", bdrv_get_device_name(bs),
5320                   bdrv_get_encrypted_filename(bs));
5321
5322    mon->password_completion_cb = completion_cb;
5323    mon->password_opaque = opaque;
5324
5325    err = monitor_read_password(mon, bdrv_password_cb, bs);
5326
5327    if (err && completion_cb)
5328        completion_cb(opaque, err);
5329
5330    return err;
5331}
5332