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 "sysemu.h"
  38#include "monitor.h"
  39#include "readline.h"
  40#include "console.h"
  41#include "block.h"
  42#include "audio/audio.h"
  43#include "disas.h"
  44#include "balloon.h"
  45#include "qemu-timer.h"
  46#include "migration.h"
  47#include "kvm.h"
  48#include "acl.h"
  49#include "qint.h"
  50#include "qlist.h"
  51#include "qdict.h"
  52#include "qbool.h"
  53#include "qstring.h"
  54#include "qerror.h"
  55#include "qjson.h"
  56#include "json-streamer.h"
  57#include "json-parser.h"
  58#include "osdep.h"
  59
  60//#define DEBUG
  61//#define DEBUG_COMPLETION
  62
  63/*
  64 * Supported types:
  65 *
  66 * 'F'          filename
  67 * 'B'          block device name
  68 * 's'          string (accept optional quote)
  69 * 'i'          32 bit integer
  70 * 'l'          target long (32 or 64 bit)
  71 * '/'          optional gdb-like print format (like "/10x")
  72 *
  73 * '?'          optional type (for all types, except '/')
  74 * '.'          other form of optional type (for 'i' and 'l')
  75 * '-'          optional parameter (eg. '-f')
  76 *
  77 */
  78
  79typedef struct mon_cmd_t {
  80    const char *name;
  81    const char *args_type;
  82    const char *params;
  83    const char *help;
  84    void (*user_print)(Monitor *mon, const QObject *data);
  85    union {
  86        void (*info)(Monitor *mon);
  87        void (*info_new)(Monitor *mon, QObject **ret_data);
  88        void (*cmd)(Monitor *mon, const QDict *qdict);
  89        void (*cmd_new)(Monitor *mon, const QDict *params, QObject **ret_data);
  90    } mhandler;
  91} mon_cmd_t;
  92
  93/* file descriptors passed via SCM_RIGHTS */
  94typedef struct mon_fd_t mon_fd_t;
  95struct mon_fd_t {
  96    char *name;
  97    int fd;
  98    QLIST_ENTRY(mon_fd_t) next;
  99};
 100
 101typedef struct MonitorControl {
 102    QObject *id;
 103    int print_enabled;
 104    JSONMessageParser parser;
 105} MonitorControl;
 106
 107struct Monitor {
 108    CharDriverState *chr;
 109    int mux_out;
 110    int reset_seen;
 111    int flags;
 112    int suspend_cnt;
 113    uint8_t outbuf[1024];
 114    int outbuf_index;
 115    ReadLineState *rs;
 116    MonitorControl *mc;
 117    CPUState *mon_cpu;
 118    BlockDriverCompletionFunc *password_completion_cb;
 119    void *password_opaque;
 120    QError *error;
 121    QLIST_HEAD(,mon_fd_t) fds;
 122    QLIST_ENTRY(Monitor) entry;
 123};
 124
 125static QLIST_HEAD(mon_list, Monitor) mon_list;
 126
 127static const mon_cmd_t mon_cmds[];
 128static const mon_cmd_t info_cmds[];
 129
 130Monitor *cur_mon = NULL;
 131
 132static void monitor_command_cb(Monitor *mon, const char *cmdline,
 133                               void *opaque);
 134
 135/* Return true if in control mode, false otherwise */
 136static inline int monitor_ctrl_mode(const Monitor *mon)
 137{
 138    return (mon->flags & MONITOR_USE_CONTROL);
 139}
 140
 141static void monitor_read_command(Monitor *mon, int show_prompt)
 142{
 143    if (!mon->rs)
 144        return;
 145
 146    readline_start(mon->rs, "(qemu) ", 0, monitor_command_cb, NULL);
 147    if (show_prompt)
 148        readline_show_prompt(mon->rs);
 149}
 150
 151static int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
 152                                 void *opaque)
 153{
 154    if (monitor_ctrl_mode(mon)) {
 155        qemu_error_new(QERR_MISSING_PARAMETER, "password");
 156        return -EINVAL;
 157    } else if (mon->rs) {
 158        readline_start(mon->rs, "Password: ", 1, readline_func, opaque);
 159        /* prompt is printed on return from the command handler */
 160        return 0;
 161    } else {
 162        monitor_printf(mon, "terminal does not support password prompting\n");
 163        return -ENOTTY;
 164    }
 165}
 166
 167void monitor_flush(Monitor *mon)
 168{
 169    if (mon && mon->outbuf_index != 0 && !mon->mux_out) {
 170        qemu_chr_write(mon->chr, mon->outbuf, mon->outbuf_index);
 171        mon->outbuf_index = 0;
 172    }
 173}
 174
 175/* flush at every end of line or if the buffer is full */
 176static void monitor_puts(Monitor *mon, const char *str)
 177{
 178    char c;
 179
 180    for(;;) {
 181        c = *str++;
 182        if (c == '\0')
 183            break;
 184        if (c == '\n')
 185            mon->outbuf[mon->outbuf_index++] = '\r';
 186        mon->outbuf[mon->outbuf_index++] = c;
 187        if (mon->outbuf_index >= (sizeof(mon->outbuf) - 1)
 188            || c == '\n')
 189            monitor_flush(mon);
 190    }
 191}
 192
 193void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
 194{
 195    if (!mon)
 196        return;
 197
 198    if (mon->mc && !mon->mc->print_enabled) {
 199        qemu_error_new(QERR_UNDEFINED_ERROR);
 200    } else {
 201        char buf[4096];
 202        vsnprintf(buf, sizeof(buf), fmt, ap);
 203        monitor_puts(mon, buf);
 204    }
 205}
 206
 207void monitor_printf(Monitor *mon, const char *fmt, ...)
 208{
 209    va_list ap;
 210    va_start(ap, fmt);
 211    monitor_vprintf(mon, fmt, ap);
 212    va_end(ap);
 213}
 214
 215void monitor_print_filename(Monitor *mon, const char *filename)
 216{
 217    int i;
 218
 219    for (i = 0; filename[i]; i++) {
 220        switch (filename[i]) {
 221        case ' ':
 222        case '"':
 223        case '\\':
 224            monitor_printf(mon, "\\%c", filename[i]);
 225            break;
 226        case '\t':
 227            monitor_printf(mon, "\\t");
 228            break;
 229        case '\r':
 230            monitor_printf(mon, "\\r");
 231            break;
 232        case '\n':
 233            monitor_printf(mon, "\\n");
 234            break;
 235        default:
 236            monitor_printf(mon, "%c", filename[i]);
 237            break;
 238        }
 239    }
 240}
 241
 242static int monitor_fprintf(FILE *stream, const char *fmt, ...)
 243{
 244    va_list ap;
 245    va_start(ap, fmt);
 246    monitor_vprintf((Monitor *)stream, fmt, ap);
 247    va_end(ap);
 248    return 0;
 249}
 250
 251static void monitor_user_noop(Monitor *mon, const QObject *data) { }
 252
 253static inline int monitor_handler_ported(const mon_cmd_t *cmd)
 254{
 255    return cmd->user_print != NULL;
 256}
 257
 258static inline int monitor_has_error(const Monitor *mon)
 259{
 260    return mon->error != NULL;
 261}
 262
 263static void monitor_json_emitter(Monitor *mon, const QObject *data)
 264{
 265    QString *json;
 266
 267    json = qobject_to_json(data);
 268    assert(json != NULL);
 269
 270    mon->mc->print_enabled = 1;
 271    monitor_printf(mon, "%s\n", qstring_get_str(json));
 272    mon->mc->print_enabled = 0;
 273
 274    QDECREF(json);
 275}
 276
 277static void monitor_protocol_emitter(Monitor *mon, QObject *data)
 278{
 279    QDict *qmp;
 280
 281    qmp = qdict_new();
 282
 283    if (!monitor_has_error(mon)) {
 284        /* success response */
 285        if (data) {
 286            assert(qobject_type(data) == QTYPE_QDICT);
 287            qobject_incref(data);
 288            qdict_put_obj(qmp, "return", data);
 289        } else {
 290            /* return an empty QDict by default */
 291            qdict_put(qmp, "return", qdict_new());
 292        }
 293    } else {
 294        /* error response */
 295        qdict_put(mon->error->error, "desc", qerror_human(mon->error));
 296        qdict_put(qmp, "error", mon->error->error);
 297        QINCREF(mon->error->error);
 298        QDECREF(mon->error);
 299        mon->error = NULL;
 300    }
 301
 302    if (mon->mc->id) {
 303        qdict_put_obj(qmp, "id", mon->mc->id);
 304        mon->mc->id = NULL;
 305    }
 306
 307    monitor_json_emitter(mon, QOBJECT(qmp));
 308    QDECREF(qmp);
 309}
 310
 311static void timestamp_put(QDict *qdict)
 312{
 313    int err;
 314    QObject *obj;
 315    qemu_timeval tv;
 316
 317    err = qemu_gettimeofday(&tv);
 318    if (err < 0)
 319        return;
 320
 321    obj = qobject_from_jsonf("{ 'seconds': %" PRId64 ", "
 322                                "'microseconds': %" PRId64 " }",
 323                                (int64_t) tv.tv_sec, (int64_t) tv.tv_usec);
 324    assert(obj != NULL);
 325
 326    qdict_put_obj(qdict, "timestamp", obj);
 327}
 328
 329/**
 330 * monitor_protocol_event(): Generate a Monitor event
 331 *
 332 * Event-specific data can be emitted through the (optional) 'data' parameter.
 333 */
 334void monitor_protocol_event(MonitorEvent event, QObject *data)
 335{
 336    QDict *qmp;
 337    const char *event_name;
 338    Monitor *mon = cur_mon;
 339
 340    assert(event < QEVENT_MAX);
 341
 342    if (!monitor_ctrl_mode(mon))
 343        return;
 344
 345    switch (event) {
 346        case QEVENT_DEBUG:
 347            event_name = "DEBUG";
 348            break;
 349        case QEVENT_SHUTDOWN:
 350            event_name = "SHUTDOWN";
 351            break;
 352        case QEVENT_RESET:
 353            event_name = "RESET";
 354            break;
 355        case QEVENT_POWERDOWN:
 356            event_name = "POWERDOWN";
 357            break;
 358        case QEVENT_STOP:
 359            event_name = "STOP";
 360            break;
 361        default:
 362            abort();
 363            break;
 364    }
 365
 366    qmp = qdict_new();
 367    timestamp_put(qmp);
 368    qdict_put(qmp, "event", qstring_from_str(event_name));
 369    if (data)
 370        qdict_put_obj(qmp, "data", data);
 371
 372    monitor_json_emitter(mon, QOBJECT(qmp));
 373    QDECREF(qmp);
 374}
 375
 376static int compare_cmd(const char *name, const char *list)
 377{
 378    const char *p, *pstart;
 379    int len;
 380    len = strlen(name);
 381    p = list;
 382    for(;;) {
 383        pstart = p;
 384        p = strchr(p, '|');
 385        if (!p)
 386            p = pstart + strlen(pstart);
 387        if ((p - pstart) == len && !memcmp(pstart, name, len))
 388            return 1;
 389        if (*p == '\0')
 390            break;
 391        p++;
 392    }
 393    return 0;
 394}
 395
 396static void help_cmd_dump(Monitor *mon, const mon_cmd_t *cmds,
 397                          const char *prefix, const char *name)
 398{
 399    const mon_cmd_t *cmd;
 400
 401    for(cmd = cmds; cmd->name != NULL; cmd++) {
 402        if (!name || !strcmp(name, cmd->name))
 403            monitor_printf(mon, "%s%s %s -- %s\n", prefix, cmd->name,
 404                           cmd->params, cmd->help);
 405    }
 406}
 407
 408static void help_cmd(Monitor *mon, const char *name)
 409{
 410    if (name && !strcmp(name, "info")) {
 411        help_cmd_dump(mon, info_cmds, "info ", NULL);
 412    } else {
 413        help_cmd_dump(mon, mon_cmds, "", name);
 414        if (name && !strcmp(name, "log")) {
 415            const CPULogItem *item;
 416            monitor_printf(mon, "Log items (comma separated):\n");
 417            monitor_printf(mon, "%-10s %s\n", "none", "remove all logs");
 418            for(item = cpu_log_items; item->mask != 0; item++) {
 419                monitor_printf(mon, "%-10s %s\n", item->name, item->help);
 420            }
 421        }
 422    }
 423}
 424
 425static void do_help_cmd(Monitor *mon, const QDict *qdict)
 426{
 427    help_cmd(mon, qdict_get_try_str(qdict, "name"));
 428}
 429
 430static void do_commit(Monitor *mon, const QDict *qdict)
 431{
 432    int all_devices;
 433    DriveInfo *dinfo;
 434    const char *device = qdict_get_str(qdict, "device");
 435
 436    all_devices = !strcmp(device, "all");
 437    QTAILQ_FOREACH(dinfo, &drives, next) {
 438        if (!all_devices)
 439            if (strcmp(bdrv_get_device_name(dinfo->bdrv), device))
 440                continue;
 441        bdrv_commit(dinfo->bdrv);
 442    }
 443}
 444
 445static void do_info(Monitor *mon, const QDict *qdict, QObject **ret_data)
 446{
 447    const mon_cmd_t *cmd;
 448    const char *item = qdict_get_try_str(qdict, "item");
 449
 450    if (!item) {
 451        assert(monitor_ctrl_mode(mon) == 0);
 452        goto help;
 453    }
 454
 455    for (cmd = info_cmds; cmd->name != NULL; cmd++) {
 456        if (compare_cmd(item, cmd->name))
 457            break;
 458    }
 459
 460    if (cmd->name == NULL) {
 461        if (monitor_ctrl_mode(mon)) {
 462            qemu_error_new(QERR_COMMAND_NOT_FOUND, item);
 463            return;
 464        }
 465        goto help;
 466    }
 467
 468    if (monitor_handler_ported(cmd)) {
 469        cmd->mhandler.info_new(mon, ret_data);
 470
 471        if (!monitor_ctrl_mode(mon)) {
 472            /*
 473             * User Protocol function is called here, Monitor Protocol is
 474             * handled by monitor_call_handler()
 475             */
 476            if (*ret_data)
 477                cmd->user_print(mon, *ret_data);
 478        }
 479    } else {
 480        if (monitor_ctrl_mode(mon)) {
 481            /* handler not converted yet */
 482            qemu_error_new(QERR_COMMAND_NOT_FOUND, item);
 483        } else {
 484            cmd->mhandler.info(mon);
 485        }
 486    }
 487
 488    return;
 489
 490help:
 491    help_cmd(mon, "info");
 492}
 493
 494static void do_info_version_print(Monitor *mon, const QObject *data)
 495{
 496    QDict *qdict;
 497
 498    qdict = qobject_to_qdict(data);
 499
 500    monitor_printf(mon, "%s%s\n", qdict_get_str(qdict, "qemu"),
 501                                  qdict_get_str(qdict, "package"));
 502}
 503
 504/**
 505 * do_info_version(): Show QEMU version
 506 *
 507 * Return a QDict with the following information:
 508 *
 509 * - "qemu": QEMU's version
 510 * - "package": package's version
 511 *
 512 * Example:
 513 *
 514 * { "qemu": "0.11.50", "package": "" }
 515 */
 516static void do_info_version(Monitor *mon, QObject **ret_data)
 517{
 518    *ret_data = qobject_from_jsonf("{ 'qemu': %s, 'package': %s }",
 519                                   QEMU_VERSION, QEMU_PKGVERSION);
 520}
 521
 522static void do_info_name_print(Monitor *mon, const QObject *data)
 523{
 524    QDict *qdict;
 525
 526    qdict = qobject_to_qdict(data);
 527    if (qdict_size(qdict) == 0) {
 528        return;
 529    }
 530
 531    monitor_printf(mon, "%s\n", qdict_get_str(qdict, "name"));
 532}
 533
 534/**
 535 * do_info_name(): Show VM name
 536 *
 537 * Return a QDict with the following information:
 538 *
 539 * - "name": VM's name (optional)
 540 *
 541 * Example:
 542 *
 543 * { "name": "qemu-name" }
 544 */
 545static void do_info_name(Monitor *mon, QObject **ret_data)
 546{
 547    *ret_data = qemu_name ? qobject_from_jsonf("{'name': %s }", qemu_name) :
 548                            qobject_from_jsonf("{}");
 549}
 550
 551static QObject *get_cmd_dict(const char *name)
 552{
 553    const char *p;
 554
 555    /* Remove '|' from some commands */
 556    p = strchr(name, '|');
 557    if (p) {
 558        p++;
 559    } else {
 560        p = name;
 561    }
 562
 563    return qobject_from_jsonf("{ 'name': %s }", p);
 564}
 565
 566/**
 567 * do_info_commands(): List QMP available commands
 568 *
 569 * Each command is represented by a QDict, the returned QObject is a QList
 570 * of all commands.
 571 *
 572 * The QDict contains:
 573 *
 574 * - "name": command's name
 575 *
 576 * Example:
 577 *
 578 * { [ { "name": "query-balloon" }, { "name": "system_powerdown" } ] }
 579 */
 580static void do_info_commands(Monitor *mon, QObject **ret_data)
 581{
 582    QList *cmd_list;
 583    const mon_cmd_t *cmd;
 584
 585    cmd_list = qlist_new();
 586
 587    for (cmd = mon_cmds; cmd->name != NULL; cmd++) {
 588        if (monitor_handler_ported(cmd) && !compare_cmd(cmd->name, "info")) {
 589            qlist_append_obj(cmd_list, get_cmd_dict(cmd->name));
 590        }
 591    }
 592
 593    for (cmd = info_cmds; cmd->name != NULL; cmd++) {
 594        if (monitor_handler_ported(cmd)) {
 595            char buf[128];
 596            snprintf(buf, sizeof(buf), "query-%s", cmd->name);
 597            qlist_append_obj(cmd_list, get_cmd_dict(buf));
 598        }
 599    }
 600
 601    *ret_data = QOBJECT(cmd_list);
 602}
 603
 604#if defined(TARGET_I386)
 605static void do_info_hpet_print(Monitor *mon, const QObject *data)
 606{
 607    monitor_printf(mon, "HPET is %s by QEMU\n",
 608                   qdict_get_bool(qobject_to_qdict(data), "enabled") ?
 609                   "enabled" : "disabled");
 610}
 611
 612/**
 613 * do_info_hpet(): Show HPET state
 614 *
 615 * Return a QDict with the following information:
 616 *
 617 * - "enabled": true if hpet if enabled, false otherwise
 618 *
 619 * Example:
 620 *
 621 * { "enabled": true }
 622 */
 623static void do_info_hpet(Monitor *mon, QObject **ret_data)
 624{
 625    *ret_data = qobject_from_jsonf("{ 'enabled': %i }", !no_hpet);
 626}
 627#endif
 628
 629static void do_info_uuid_print(Monitor *mon, const QObject *data)
 630{
 631    monitor_printf(mon, "%s\n", qdict_get_str(qobject_to_qdict(data), "UUID"));
 632}
 633
 634/**
 635 * do_info_uuid(): Show VM UUID
 636 *
 637 * Return a QDict with the following information:
 638 *
 639 * - "UUID": Universally Unique Identifier
 640 *
 641 * Example:
 642 *
 643 * { "UUID": "550e8400-e29b-41d4-a716-446655440000" }
 644 */
 645static void do_info_uuid(Monitor *mon, QObject **ret_data)
 646{
 647    char uuid[64];
 648
 649    snprintf(uuid, sizeof(uuid), UUID_FMT, qemu_uuid[0], qemu_uuid[1],
 650                   qemu_uuid[2], qemu_uuid[3], qemu_uuid[4], qemu_uuid[5],
 651                   qemu_uuid[6], qemu_uuid[7], qemu_uuid[8], qemu_uuid[9],
 652                   qemu_uuid[10], qemu_uuid[11], qemu_uuid[12], qemu_uuid[13],
 653                   qemu_uuid[14], qemu_uuid[15]);
 654    *ret_data = qobject_from_jsonf("{ 'UUID': %s }", uuid);
 655}
 656
 657/* get the current CPU defined by the user */
 658static int mon_set_cpu(int cpu_index)
 659{
 660    CPUState *env;
 661
 662    for(env = first_cpu; env != NULL; env = env->next_cpu) {
 663        if (env->cpu_index == cpu_index) {
 664            cur_mon->mon_cpu = env;
 665            return 0;
 666        }
 667    }
 668    return -1;
 669}
 670
 671static CPUState *mon_get_cpu(void)
 672{
 673    if (!cur_mon->mon_cpu) {
 674        mon_set_cpu(0);
 675    }
 676    cpu_synchronize_state(cur_mon->mon_cpu);
 677    return cur_mon->mon_cpu;
 678}
 679
 680static void do_info_registers(Monitor *mon)
 681{
 682    CPUState *env;
 683    env = mon_get_cpu();
 684    if (!env)
 685        return;
 686#ifdef TARGET_I386
 687    cpu_dump_state(env, (FILE *)mon, monitor_fprintf,
 688                   X86_DUMP_FPU);
 689#else
 690    cpu_dump_state(env, (FILE *)mon, monitor_fprintf,
 691                   0);
 692#endif
 693}
 694
 695static void print_cpu_iter(QObject *obj, void *opaque)
 696{
 697    QDict *cpu;
 698    int active = ' ';
 699    Monitor *mon = opaque;
 700
 701    assert(qobject_type(obj) == QTYPE_QDICT);
 702    cpu = qobject_to_qdict(obj);
 703
 704    if (qdict_get_bool(cpu, "current")) {
 705        active = '*';
 706    }
 707
 708    monitor_printf(mon, "%c CPU #%d: ", active, (int)qdict_get_int(cpu, "CPU"));
 709
 710#if defined(TARGET_I386)
 711    monitor_printf(mon, "pc=0x" TARGET_FMT_lx,
 712                   (target_ulong) qdict_get_int(cpu, "pc"));
 713#elif defined(TARGET_PPC)
 714    monitor_printf(mon, "nip=0x" TARGET_FMT_lx,
 715                   (target_long) qdict_get_int(cpu, "nip"));
 716#elif defined(TARGET_SPARC)
 717    monitor_printf(mon, "pc=0x " TARGET_FMT_lx,
 718                   (target_long) qdict_get_int(cpu, "pc"));
 719    monitor_printf(mon, "npc=0x" TARGET_FMT_lx,
 720                   (target_long) qdict_get_int(cpu, "npc"));
 721#elif defined(TARGET_MIPS)
 722    monitor_printf(mon, "PC=0x" TARGET_FMT_lx,
 723                   (target_long) qdict_get_int(cpu, "PC"));
 724#endif
 725
 726    if (qdict_get_bool(cpu, "halted")) {
 727        monitor_printf(mon, " (halted)");
 728    }
 729
 730    monitor_printf(mon, "\n");
 731}
 732
 733static void monitor_print_cpus(Monitor *mon, const QObject *data)
 734{
 735    QList *cpu_list;
 736
 737    assert(qobject_type(data) == QTYPE_QLIST);
 738    cpu_list = qobject_to_qlist(data);
 739    qlist_iter(cpu_list, print_cpu_iter, mon);
 740}
 741
 742/**
 743 * do_info_cpus(): Show CPU information
 744 *
 745 * Return a QList. Each CPU is represented by a QDict, which contains:
 746 *
 747 * - "cpu": CPU index
 748 * - "current": true if this is the current CPU, false otherwise
 749 * - "halted": true if the cpu is halted, false otherwise
 750 * - Current program counter. The key's name depends on the architecture:
 751 *      "pc": i386/x86)64
 752 *      "nip": PPC
 753 *      "pc" and "npc": sparc
 754 *      "PC": mips
 755 *
 756 * Example:
 757 *
 758 * [ { "CPU": 0, "current": true, "halted": false, "pc": 3227107138 },
 759 *   { "CPU": 1, "current": false, "halted": true, "pc": 7108165 } ]
 760 */
 761static void do_info_cpus(Monitor *mon, QObject **ret_data)
 762{
 763    CPUState *env;
 764    QList *cpu_list;
 765
 766    cpu_list = qlist_new();
 767
 768    /* just to set the default cpu if not already done */
 769    mon_get_cpu();
 770
 771    for(env = first_cpu; env != NULL; env = env->next_cpu) {
 772        QDict *cpu;
 773        QObject *obj;
 774
 775        cpu_synchronize_state(env);
 776
 777        obj = qobject_from_jsonf("{ 'CPU': %d, 'current': %i, 'halted': %i }",
 778                                 env->cpu_index, env == mon->mon_cpu,
 779                                 env->halted);
 780        assert(obj != NULL);
 781
 782        cpu = qobject_to_qdict(obj);
 783
 784#if defined(TARGET_I386)
 785        qdict_put(cpu, "pc", qint_from_int(env->eip + env->segs[R_CS].base));
 786#elif defined(TARGET_PPC)
 787        qdict_put(cpu, "nip", qint_from_int(env->nip));
 788#elif defined(TARGET_SPARC)
 789        qdict_put(cpu, "pc", qint_from_int(env->pc));
 790        qdict_put(cpu, "npc", qint_from_int(env->npc));
 791#elif defined(TARGET_MIPS)
 792        qdict_put(cpu, "PC", qint_from_int(env->active_tc.PC));
 793#endif
 794
 795        qlist_append(cpu_list, cpu);
 796    }
 797
 798    *ret_data = QOBJECT(cpu_list);
 799}
 800
 801static void do_cpu_set(Monitor *mon, const QDict *qdict)
 802{
 803    int index = qdict_get_int(qdict, "index");
 804    if (mon_set_cpu(index) < 0)
 805        monitor_printf(mon, "Invalid CPU index\n");
 806}
 807
 808static void do_info_jit(Monitor *mon)
 809{
 810    dump_exec_info((FILE *)mon, monitor_fprintf);
 811}
 812
 813static void do_info_history(Monitor *mon)
 814{
 815    int i;
 816    const char *str;
 817
 818    if (!mon->rs)
 819        return;
 820    i = 0;
 821    for(;;) {
 822        str = readline_get_history(mon->rs, i);
 823        if (!str)
 824            break;
 825        monitor_printf(mon, "%d: '%s'\n", i, str);
 826        i++;
 827    }
 828}
 829
 830#if defined(TARGET_PPC)
 831/* XXX: not implemented in other targets */
 832static void do_info_cpu_stats(Monitor *mon)
 833{
 834    CPUState *env;
 835
 836    env = mon_get_cpu();
 837    cpu_dump_statistics(env, (FILE *)mon, &monitor_fprintf, 0);
 838}
 839#endif
 840
 841/**
 842 * do_quit(): Quit QEMU execution
 843 */
 844static void do_quit(Monitor *mon, const QDict *qdict, QObject **ret_data)
 845{
 846    exit(0);
 847}
 848
 849static int eject_device(Monitor *mon, BlockDriverState *bs, int force)
 850{
 851    if (bdrv_is_inserted(bs)) {
 852        if (!force) {
 853            if (!bdrv_is_removable(bs)) {
 854                qemu_error_new(QERR_DEVICE_NOT_REMOVABLE,
 855                               bdrv_get_device_name(bs));
 856                return -1;
 857            }
 858            if (bdrv_is_locked(bs)) {
 859                qemu_error_new(QERR_DEVICE_LOCKED, bdrv_get_device_name(bs));
 860                return -1;
 861            }
 862        }
 863        bdrv_close(bs);
 864    }
 865    return 0;
 866}
 867
 868static void do_eject(Monitor *mon, const QDict *qdict, QObject **ret_data)
 869{
 870    BlockDriverState *bs;
 871    int force = qdict_get_int(qdict, "force");
 872    const char *filename = qdict_get_str(qdict, "device");
 873
 874    bs = bdrv_find(filename);
 875    if (!bs) {
 876        qemu_error_new(QERR_DEVICE_NOT_FOUND, filename);
 877        return;
 878    }
 879    eject_device(mon, bs, force);
 880}
 881
 882static void do_block_set_passwd(Monitor *mon, const QDict *qdict,
 883                                QObject **ret_data)
 884{
 885    BlockDriverState *bs;
 886
 887    bs = bdrv_find(qdict_get_str(qdict, "device"));
 888    if (!bs) {
 889        qemu_error_new(QERR_DEVICE_NOT_FOUND, qdict_get_str(qdict, "device"));
 890        return;
 891    }
 892
 893    if (bdrv_set_key(bs, qdict_get_str(qdict, "password")) < 0) {
 894        qemu_error_new(QERR_INVALID_PASSWORD);
 895    }
 896}
 897
 898static void do_change_block(Monitor *mon, const char *device,
 899                            const char *filename, const char *fmt)
 900{
 901    BlockDriverState *bs;
 902    BlockDriver *drv = NULL;
 903
 904    bs = bdrv_find(device);
 905    if (!bs) {
 906        qemu_error_new(QERR_DEVICE_NOT_FOUND, device);
 907        return;
 908    }
 909    if (fmt) {
 910        drv = bdrv_find_whitelisted_format(fmt);
 911        if (!drv) {
 912            qemu_error_new(QERR_INVALID_BLOCK_FORMAT, fmt);
 913            return;
 914        }
 915    }
 916    if (eject_device(mon, bs, 0) < 0)
 917        return;
 918    bdrv_open2(bs, filename, 0, drv);
 919    monitor_read_bdrv_key_start(mon, bs, NULL, NULL);
 920}
 921
 922static void change_vnc_password(const char *password)
 923{
 924    if (vnc_display_password(NULL, password) < 0)
 925        qemu_error_new(QERR_SET_PASSWD_FAILED);
 926
 927}
 928
 929static void change_vnc_password_cb(Monitor *mon, const char *password,
 930                                   void *opaque)
 931{
 932    change_vnc_password(password);
 933    monitor_read_command(mon, 1);
 934}
 935
 936static void do_change_vnc(Monitor *mon, const char *target, const char *arg)
 937{
 938    if (strcmp(target, "passwd") == 0 ||
 939        strcmp(target, "password") == 0) {
 940        if (arg) {
 941            char password[9];
 942            strncpy(password, arg, sizeof(password));
 943            password[sizeof(password) - 1] = '\0';
 944            change_vnc_password(password);
 945        } else {
 946            monitor_read_password(mon, change_vnc_password_cb, NULL);
 947        }
 948    } else {
 949        if (vnc_display_open(NULL, target) < 0)
 950            qemu_error_new(QERR_VNC_SERVER_FAILED, target);
 951    }
 952}
 953
 954/**
 955 * do_change(): Change a removable medium, or VNC configuration
 956 */
 957static void do_change(Monitor *mon, const QDict *qdict, QObject **ret_data)
 958{
 959    const char *device = qdict_get_str(qdict, "device");
 960    const char *target = qdict_get_str(qdict, "target");
 961    const char *arg = qdict_get_try_str(qdict, "arg");
 962    if (strcmp(device, "vnc") == 0) {
 963        do_change_vnc(mon, target, arg);
 964    } else {
 965        do_change_block(mon, device, target, arg);
 966    }
 967}
 968
 969static void do_screen_dump(Monitor *mon, const QDict *qdict)
 970{
 971    vga_hw_screen_dump(qdict_get_str(qdict, "filename"));
 972}
 973
 974static void do_logfile(Monitor *mon, const QDict *qdict)
 975{
 976    cpu_set_log_filename(qdict_get_str(qdict, "filename"));
 977}
 978
 979static void do_log(Monitor *mon, const QDict *qdict)
 980{
 981    int mask;
 982    const char *items = qdict_get_str(qdict, "items");
 983
 984    if (!strcmp(items, "none")) {
 985        mask = 0;
 986    } else {
 987        mask = cpu_str_to_log_mask(items);
 988        if (!mask) {
 989            help_cmd(mon, "log");
 990            return;
 991        }
 992    }
 993    cpu_set_log(mask);
 994}
 995
 996static void do_singlestep(Monitor *mon, const QDict *qdict)
 997{
 998    const char *option = qdict_get_try_str(qdict, "option");
 999    if (!option || !strcmp(option, "on")) {
1000        singlestep = 1;
1001    } else if (!strcmp(option, "off")) {
1002        singlestep = 0;
1003    } else {
1004        monitor_printf(mon, "unexpected option %s\n", option);
1005    }
1006}
1007
1008/**
1009 * do_stop(): Stop VM execution
1010 */
1011static void do_stop(Monitor *mon, const QDict *qdict, QObject **ret_data)
1012{
1013    vm_stop(EXCP_INTERRUPT);
1014}
1015
1016static void encrypted_bdrv_it(void *opaque, BlockDriverState *bs);
1017
1018struct bdrv_iterate_context {
1019    Monitor *mon;
1020    int err;
1021};
1022
1023/**
1024 * do_cont(): Resume emulation.
1025 */
1026static void do_cont(Monitor *mon, const QDict *qdict, QObject **ret_data)
1027{
1028    struct bdrv_iterate_context context = { mon, 0 };
1029
1030    bdrv_iterate(encrypted_bdrv_it, &context);
1031    /* only resume the vm if all keys are set and valid */
1032    if (!context.err)
1033        vm_start();
1034}
1035
1036static void bdrv_key_cb(void *opaque, int err)
1037{
1038    Monitor *mon = opaque;
1039
1040    /* another key was set successfully, retry to continue */
1041    if (!err)
1042        do_cont(mon, NULL, NULL);
1043}
1044
1045static void encrypted_bdrv_it(void *opaque, BlockDriverState *bs)
1046{
1047    struct bdrv_iterate_context *context = opaque;
1048
1049    if (!context->err && bdrv_key_required(bs)) {
1050        context->err = -EBUSY;
1051        monitor_read_bdrv_key_start(context->mon, bs, bdrv_key_cb,
1052                                    context->mon);
1053    }
1054}
1055
1056static void do_gdbserver(Monitor *mon, const QDict *qdict)
1057{
1058    const char *device = qdict_get_try_str(qdict, "device");
1059    if (!device)
1060        device = "tcp::" DEFAULT_GDBSTUB_PORT;
1061    if (gdbserver_start(device) < 0) {
1062        monitor_printf(mon, "Could not open gdbserver on device '%s'\n",
1063                       device);
1064    } else if (strcmp(device, "none") == 0) {
1065        monitor_printf(mon, "Disabled gdbserver\n");
1066    } else {
1067        monitor_printf(mon, "Waiting for gdb connection on device '%s'\n",
1068                       device);
1069    }
1070}
1071
1072static void do_watchdog_action(Monitor *mon, const QDict *qdict)
1073{
1074    const char *action = qdict_get_str(qdict, "action");
1075    if (select_watchdog_action(action) == -1) {
1076        monitor_printf(mon, "Unknown watchdog action '%s'\n", action);
1077    }
1078}
1079
1080static void monitor_printc(Monitor *mon, int c)
1081{
1082    monitor_printf(mon, "'");
1083    switch(c) {
1084    case '\'':
1085        monitor_printf(mon, "\\'");
1086        break;
1087    case '\\':
1088        monitor_printf(mon, "\\\\");
1089        break;
1090    case '\n':
1091        monitor_printf(mon, "\\n");
1092        break;
1093    case '\r':
1094        monitor_printf(mon, "\\r");
1095        break;
1096    default:
1097        if (c >= 32 && c <= 126) {
1098            monitor_printf(mon, "%c", c);
1099        } else {
1100            monitor_printf(mon, "\\x%02x", c);
1101        }
1102        break;
1103    }
1104    monitor_printf(mon, "'");
1105}
1106
1107static void memory_dump(Monitor *mon, int count, int format, int wsize,
1108                        target_phys_addr_t addr, int is_physical)
1109{
1110    CPUState *env;
1111    int nb_per_line, l, line_size, i, max_digits, len;
1112    uint8_t buf[16];
1113    uint64_t v;
1114
1115    if (format == 'i') {
1116        int flags;
1117        flags = 0;
1118        env = mon_get_cpu();
1119        if (!env && !is_physical)
1120            return;
1121#ifdef TARGET_I386
1122        if (wsize == 2) {
1123            flags = 1;
1124        } else if (wsize == 4) {
1125            flags = 0;
1126        } else {
1127            /* as default we use the current CS size */
1128            flags = 0;
1129            if (env) {
1130#ifdef TARGET_X86_64
1131                if ((env->efer & MSR_EFER_LMA) &&
1132                    (env->segs[R_CS].flags & DESC_L_MASK))
1133                    flags = 2;
1134                else
1135#endif
1136                if (!(env->segs[R_CS].flags & DESC_B_MASK))
1137                    flags = 1;
1138            }
1139        }
1140#endif
1141        monitor_disas(mon, env, addr, count, is_physical, flags);
1142        return;
1143    }
1144
1145    len = wsize * count;
1146    if (wsize == 1)
1147        line_size = 8;
1148    else
1149        line_size = 16;
1150    nb_per_line = line_size / wsize;
1151    max_digits = 0;
1152
1153    switch(format) {
1154    case 'o':
1155        max_digits = (wsize * 8 + 2) / 3;
1156        break;
1157    default:
1158    case 'x':
1159        max_digits = (wsize * 8) / 4;
1160        break;
1161    case 'u':
1162    case 'd':
1163        max_digits = (wsize * 8 * 10 + 32) / 33;
1164        break;
1165    case 'c':
1166        wsize = 1;
1167        break;
1168    }
1169
1170    while (len > 0) {
1171        if (is_physical)
1172            monitor_printf(mon, TARGET_FMT_plx ":", addr);
1173        else
1174            monitor_printf(mon, TARGET_FMT_lx ":", (target_ulong)addr);
1175        l = len;
1176        if (l > line_size)
1177            l = line_size;
1178        if (is_physical) {
1179            cpu_physical_memory_rw(addr, buf, l, 0);
1180        } else {
1181            env = mon_get_cpu();
1182            if (!env)
1183                break;
1184            if (cpu_memory_rw_debug(env, addr, buf, l, 0) < 0) {
1185                monitor_printf(mon, " Cannot access memory\n");
1186                break;
1187            }
1188        }
1189        i = 0;
1190        while (i < l) {
1191            switch(wsize) {
1192            default:
1193            case 1:
1194                v = ldub_raw(buf + i);
1195                break;
1196            case 2:
1197                v = lduw_raw(buf + i);
1198                break;
1199            case 4:
1200                v = (uint32_t)ldl_raw(buf + i);
1201                break;
1202            case 8:
1203                v = ldq_raw(buf + i);
1204                break;
1205            }
1206            monitor_printf(mon, " ");
1207            switch(format) {
1208            case 'o':
1209                monitor_printf(mon, "%#*" PRIo64, max_digits, v);
1210                break;
1211            case 'x':
1212                monitor_printf(mon, "0x%0*" PRIx64, max_digits, v);
1213                break;
1214            case 'u':
1215                monitor_printf(mon, "%*" PRIu64, max_digits, v);
1216                break;
1217            case 'd':
1218                monitor_printf(mon, "%*" PRId64, max_digits, v);
1219                break;
1220            case 'c':
1221                monitor_printc(mon, v);
1222                break;
1223            }
1224            i += wsize;
1225        }
1226        monitor_printf(mon, "\n");
1227        addr += l;
1228        len -= l;
1229    }
1230}
1231
1232static void do_memory_dump(Monitor *mon, const QDict *qdict)
1233{
1234    int count = qdict_get_int(qdict, "count");
1235    int format = qdict_get_int(qdict, "format");
1236    int size = qdict_get_int(qdict, "size");
1237    target_long addr = qdict_get_int(qdict, "addr");
1238
1239    memory_dump(mon, count, format, size, addr, 0);
1240}
1241
1242static void do_physical_memory_dump(Monitor *mon, const QDict *qdict)
1243{
1244    int count = qdict_get_int(qdict, "count");
1245    int format = qdict_get_int(qdict, "format");
1246    int size = qdict_get_int(qdict, "size");
1247    target_phys_addr_t addr = qdict_get_int(qdict, "addr");
1248
1249    memory_dump(mon, count, format, size, addr, 1);
1250}
1251
1252static void do_print(Monitor *mon, const QDict *qdict)
1253{
1254    int format = qdict_get_int(qdict, "format");
1255    target_phys_addr_t val = qdict_get_int(qdict, "val");
1256
1257#if TARGET_PHYS_ADDR_BITS == 32
1258    switch(format) {
1259    case 'o':
1260        monitor_printf(mon, "%#o", val);
1261        break;
1262    case 'x':
1263        monitor_printf(mon, "%#x", val);
1264        break;
1265    case 'u':
1266        monitor_printf(mon, "%u", val);
1267        break;
1268    default:
1269    case 'd':
1270        monitor_printf(mon, "%d", val);
1271        break;
1272    case 'c':
1273        monitor_printc(mon, val);
1274        break;
1275    }
1276#else
1277    switch(format) {
1278    case 'o':
1279        monitor_printf(mon, "%#" PRIo64, val);
1280        break;
1281    case 'x':
1282        monitor_printf(mon, "%#" PRIx64, val);
1283        break;
1284    case 'u':
1285        monitor_printf(mon, "%" PRIu64, val);
1286        break;
1287    default:
1288    case 'd':
1289        monitor_printf(mon, "%" PRId64, val);
1290        break;
1291    case 'c':
1292        monitor_printc(mon, val);
1293        break;
1294    }
1295#endif
1296    monitor_printf(mon, "\n");
1297}
1298
1299static void do_memory_save(Monitor *mon, const QDict *qdict, QObject **ret_data)
1300{
1301    FILE *f;
1302    uint32_t size = qdict_get_int(qdict, "size");
1303    const char *filename = qdict_get_str(qdict, "filename");
1304    target_long addr = qdict_get_int(qdict, "val");
1305    uint32_t l;
1306    CPUState *env;
1307    uint8_t buf[1024];
1308
1309    env = mon_get_cpu();
1310    if (!env)
1311        return;
1312
1313    f = fopen(filename, "wb");
1314    if (!f) {
1315        monitor_printf(mon, "could not open '%s'\n", filename);
1316        return;
1317    }
1318    while (size != 0) {
1319        l = sizeof(buf);
1320        if (l > size)
1321            l = size;
1322        cpu_memory_rw_debug(env, addr, buf, l, 0);
1323        fwrite(buf, 1, l, f);
1324        addr += l;
1325        size -= l;
1326    }
1327    fclose(f);
1328}
1329
1330static void do_physical_memory_save(Monitor *mon, const QDict *qdict,
1331                                    QObject **ret_data)
1332{
1333    FILE *f;
1334    uint32_t l;
1335    uint8_t buf[1024];
1336    uint32_t size = qdict_get_int(qdict, "size");
1337    const char *filename = qdict_get_str(qdict, "filename");
1338    target_phys_addr_t addr = qdict_get_int(qdict, "val");
1339
1340    f = fopen(filename, "wb");
1341    if (!f) {
1342        monitor_printf(mon, "could not open '%s'\n", filename);
1343        return;
1344    }
1345    while (size != 0) {
1346        l = sizeof(buf);
1347        if (l > size)
1348            l = size;
1349        cpu_physical_memory_rw(addr, buf, l, 0);
1350        fwrite(buf, 1, l, f);
1351        fflush(f);
1352        addr += l;
1353        size -= l;
1354    }
1355    fclose(f);
1356}
1357
1358static void do_sum(Monitor *mon, const QDict *qdict)
1359{
1360    uint32_t addr;
1361    uint8_t buf[1];
1362    uint16_t sum;
1363    uint32_t start = qdict_get_int(qdict, "start");
1364    uint32_t size = qdict_get_int(qdict, "size");
1365
1366    sum = 0;
1367    for(addr = start; addr < (start + size); addr++) {
1368        cpu_physical_memory_rw(addr, buf, 1, 0);
1369        /* BSD sum algorithm ('sum' Unix command) */
1370        sum = (sum >> 1) | (sum << 15);
1371        sum += buf[0];
1372    }
1373    monitor_printf(mon, "%05d\n", sum);
1374}
1375
1376typedef struct {
1377    int keycode;
1378    const char *name;
1379} KeyDef;
1380
1381static const KeyDef key_defs[] = {
1382    { 0x2a, "shift" },
1383    { 0x36, "shift_r" },
1384
1385    { 0x38, "alt" },
1386    { 0xb8, "alt_r" },
1387    { 0x64, "altgr" },
1388    { 0xe4, "altgr_r" },
1389    { 0x1d, "ctrl" },
1390    { 0x9d, "ctrl_r" },
1391
1392    { 0xdd, "menu" },
1393
1394    { 0x01, "esc" },
1395
1396    { 0x02, "1" },
1397    { 0x03, "2" },
1398    { 0x04, "3" },
1399    { 0x05, "4" },
1400    { 0x06, "5" },
1401    { 0x07, "6" },
1402    { 0x08, "7" },
1403    { 0x09, "8" },
1404    { 0x0a, "9" },
1405    { 0x0b, "0" },
1406    { 0x0c, "minus" },
1407    { 0x0d, "equal" },
1408    { 0x0e, "backspace" },
1409
1410    { 0x0f, "tab" },
1411    { 0x10, "q" },
1412    { 0x11, "w" },
1413    { 0x12, "e" },
1414    { 0x13, "r" },
1415    { 0x14, "t" },
1416    { 0x15, "y" },
1417    { 0x16, "u" },
1418    { 0x17, "i" },
1419    { 0x18, "o" },
1420    { 0x19, "p" },
1421
1422    { 0x1c, "ret" },
1423
1424    { 0x1e, "a" },
1425    { 0x1f, "s" },
1426    { 0x20, "d" },
1427    { 0x21, "f" },
1428    { 0x22, "g" },
1429    { 0x23, "h" },
1430    { 0x24, "j" },
1431    { 0x25, "k" },
1432    { 0x26, "l" },
1433
1434    { 0x2c, "z" },
1435    { 0x2d, "x" },
1436    { 0x2e, "c" },
1437    { 0x2f, "v" },
1438    { 0x30, "b" },
1439    { 0x31, "n" },
1440    { 0x32, "m" },
1441    { 0x33, "comma" },
1442    { 0x34, "dot" },
1443    { 0x35, "slash" },
1444
1445    { 0x37, "asterisk" },
1446
1447    { 0x39, "spc" },
1448    { 0x3a, "caps_lock" },
1449    { 0x3b, "f1" },
1450    { 0x3c, "f2" },
1451    { 0x3d, "f3" },
1452    { 0x3e, "f4" },
1453    { 0x3f, "f5" },
1454    { 0x40, "f6" },
1455    { 0x41, "f7" },
1456    { 0x42, "f8" },
1457    { 0x43, "f9" },
1458    { 0x44, "f10" },
1459    { 0x45, "num_lock" },
1460    { 0x46, "scroll_lock" },
1461
1462    { 0xb5, "kp_divide" },
1463    { 0x37, "kp_multiply" },
1464    { 0x4a, "kp_subtract" },
1465    { 0x4e, "kp_add" },
1466    { 0x9c, "kp_enter" },
1467    { 0x53, "kp_decimal" },
1468    { 0x54, "sysrq" },
1469
1470    { 0x52, "kp_0" },
1471    { 0x4f, "kp_1" },
1472    { 0x50, "kp_2" },
1473    { 0x51, "kp_3" },
1474    { 0x4b, "kp_4" },
1475    { 0x4c, "kp_5" },
1476    { 0x4d, "kp_6" },
1477    { 0x47, "kp_7" },
1478    { 0x48, "kp_8" },
1479    { 0x49, "kp_9" },
1480
1481    { 0x56, "<" },
1482
1483    { 0x57, "f11" },
1484    { 0x58, "f12" },
1485
1486    { 0xb7, "print" },
1487
1488    { 0xc7, "home" },
1489    { 0xc9, "pgup" },
1490    { 0xd1, "pgdn" },
1491    { 0xcf, "end" },
1492
1493    { 0xcb, "left" },
1494    { 0xc8, "up" },
1495    { 0xd0, "down" },
1496    { 0xcd, "right" },
1497
1498    { 0xd2, "insert" },
1499    { 0xd3, "delete" },
1500#if defined(TARGET_SPARC) && !defined(TARGET_SPARC64)
1501    { 0xf0, "stop" },
1502    { 0xf1, "again" },
1503    { 0xf2, "props" },
1504    { 0xf3, "undo" },
1505    { 0xf4, "front" },
1506    { 0xf5, "copy" },
1507    { 0xf6, "open" },
1508    { 0xf7, "paste" },
1509    { 0xf8, "find" },
1510    { 0xf9, "cut" },
1511    { 0xfa, "lf" },
1512    { 0xfb, "help" },
1513    { 0xfc, "meta_l" },
1514    { 0xfd, "meta_r" },
1515    { 0xfe, "compose" },
1516#endif
1517    { 0, NULL },
1518};
1519
1520static int get_keycode(const char *key)
1521{
1522    const KeyDef *p;
1523    char *endp;
1524    int ret;
1525
1526    for(p = key_defs; p->name != NULL; p++) {
1527        if (!strcmp(key, p->name))
1528            return p->keycode;
1529    }
1530    if (strstart(key, "0x", NULL)) {
1531        ret = strtoul(key, &endp, 0);
1532        if (*endp == '\0' && ret >= 0x01 && ret <= 0xff)
1533            return ret;
1534    }
1535    return -1;
1536}
1537
1538#define MAX_KEYCODES 16
1539static uint8_t keycodes[MAX_KEYCODES];
1540static int nb_pending_keycodes;
1541static QEMUTimer *key_timer;
1542
1543static void release_keys(void *opaque)
1544{
1545    int keycode;
1546
1547    while (nb_pending_keycodes > 0) {
1548        nb_pending_keycodes--;
1549        keycode = keycodes[nb_pending_keycodes];
1550        if (keycode & 0x80)
1551            kbd_put_keycode(0xe0);
1552        kbd_put_keycode(keycode | 0x80);
1553    }
1554}
1555
1556static void do_sendkey(Monitor *mon, const QDict *qdict)
1557{
1558    char keyname_buf[16];
1559    char *separator;
1560    int keyname_len, keycode, i;
1561    const char *string = qdict_get_str(qdict, "string");
1562    int has_hold_time = qdict_haskey(qdict, "hold_time");
1563    int hold_time = qdict_get_try_int(qdict, "hold_time", -1);
1564
1565    if (nb_pending_keycodes > 0) {
1566        qemu_del_timer(key_timer);
1567        release_keys(NULL);
1568    }
1569    if (!has_hold_time)
1570        hold_time = 100;
1571    i = 0;
1572    while (1) {
1573        separator = strchr(string, '-');
1574        keyname_len = separator ? separator - string : strlen(string);
1575        if (keyname_len > 0) {
1576            pstrcpy(keyname_buf, sizeof(keyname_buf), string);
1577            if (keyname_len > sizeof(keyname_buf) - 1) {
1578                monitor_printf(mon, "invalid key: '%s...'\n", keyname_buf);
1579                return;
1580            }
1581            if (i == MAX_KEYCODES) {
1582                monitor_printf(mon, "too many keys\n");
1583                return;
1584            }
1585            keyname_buf[keyname_len] = 0;
1586            keycode = get_keycode(keyname_buf);
1587            if (keycode < 0) {
1588                monitor_printf(mon, "unknown key: '%s'\n", keyname_buf);
1589                return;
1590            }
1591            keycodes[i++] = keycode;
1592        }
1593        if (!separator)
1594            break;
1595        string = separator + 1;
1596    }
1597    nb_pending_keycodes = i;
1598    /* key down events */
1599    for (i = 0; i < nb_pending_keycodes; i++) {
1600        keycode = keycodes[i];
1601        if (keycode & 0x80)
1602            kbd_put_keycode(0xe0);
1603        kbd_put_keycode(keycode & 0x7f);
1604    }
1605    /* delayed key up events */
1606    qemu_mod_timer(key_timer, qemu_get_clock(vm_clock) +
1607                   muldiv64(get_ticks_per_sec(), hold_time, 1000));
1608}
1609
1610static int mouse_button_state;
1611
1612static void do_mouse_move(Monitor *mon, const QDict *qdict)
1613{
1614    int dx, dy, dz;
1615    const char *dx_str = qdict_get_str(qdict, "dx_str");
1616    const char *dy_str = qdict_get_str(qdict, "dy_str");
1617    const char *dz_str = qdict_get_try_str(qdict, "dz_str");
1618    dx = strtol(dx_str, NULL, 0);
1619    dy = strtol(dy_str, NULL, 0);
1620    dz = 0;
1621    if (dz_str)
1622        dz = strtol(dz_str, NULL, 0);
1623    kbd_mouse_event(dx, dy, dz, mouse_button_state);
1624}
1625
1626static void do_mouse_button(Monitor *mon, const QDict *qdict)
1627{
1628    int button_state = qdict_get_int(qdict, "button_state");
1629    mouse_button_state = button_state;
1630    kbd_mouse_event(0, 0, 0, mouse_button_state);
1631}
1632
1633static void do_ioport_read(Monitor *mon, const QDict *qdict)
1634{
1635    int size = qdict_get_int(qdict, "size");
1636    int addr = qdict_get_int(qdict, "addr");
1637    int has_index = qdict_haskey(qdict, "index");
1638    uint32_t val;
1639    int suffix;
1640
1641    if (has_index) {
1642        int index = qdict_get_int(qdict, "index");
1643        cpu_outb(addr & IOPORTS_MASK, index & 0xff);
1644        addr++;
1645    }
1646    addr &= 0xffff;
1647
1648    switch(size) {
1649    default:
1650    case 1:
1651        val = cpu_inb(addr);
1652        suffix = 'b';
1653        break;
1654    case 2:
1655        val = cpu_inw(addr);
1656        suffix = 'w';
1657        break;
1658    case 4:
1659        val = cpu_inl(addr);
1660        suffix = 'l';
1661        break;
1662    }
1663    monitor_printf(mon, "port%c[0x%04x] = %#0*x\n",
1664                   suffix, addr, size * 2, val);
1665}
1666
1667static void do_ioport_write(Monitor *mon, const QDict *qdict)
1668{
1669    int size = qdict_get_int(qdict, "size");
1670    int addr = qdict_get_int(qdict, "addr");
1671    int val = qdict_get_int(qdict, "val");
1672
1673    addr &= IOPORTS_MASK;
1674
1675    switch (size) {
1676    default:
1677    case 1:
1678        cpu_outb(addr, val);
1679        break;
1680    case 2:
1681        cpu_outw(addr, val);
1682        break;
1683    case 4:
1684        cpu_outl(addr, val);
1685        break;
1686    }
1687}
1688
1689static void do_boot_set(Monitor *mon, const QDict *qdict)
1690{
1691    int res;
1692    const char *bootdevice = qdict_get_str(qdict, "bootdevice");
1693
1694    res = qemu_boot_set(bootdevice);
1695    if (res == 0) {
1696        monitor_printf(mon, "boot device list now set to %s\n", bootdevice);
1697    } else if (res > 0) {
1698        monitor_printf(mon, "setting boot device list failed\n");
1699    } else {
1700        monitor_printf(mon, "no function defined to set boot device list for "
1701                       "this architecture\n");
1702    }
1703}
1704
1705/**
1706 * do_system_reset(): Issue a machine reset
1707 */
1708static void do_system_reset(Monitor *mon, const QDict *qdict,
1709                            QObject **ret_data)
1710{
1711    qemu_system_reset_request();
1712}
1713
1714/**
1715 * do_system_powerdown(): Issue a machine powerdown
1716 */
1717static void do_system_powerdown(Monitor *mon, const QDict *qdict,
1718                                QObject **ret_data)
1719{
1720    qemu_system_powerdown_request();
1721}
1722
1723#if defined(TARGET_I386)
1724static void print_pte(Monitor *mon, uint32_t addr, uint32_t pte, uint32_t mask)
1725{
1726    monitor_printf(mon, "%08x: %08x %c%c%c%c%c%c%c%c\n",
1727                   addr,
1728                   pte & mask,
1729                   pte & PG_GLOBAL_MASK ? 'G' : '-',
1730                   pte & PG_PSE_MASK ? 'P' : '-',
1731                   pte & PG_DIRTY_MASK ? 'D' : '-',
1732                   pte & PG_ACCESSED_MASK ? 'A' : '-',
1733                   pte & PG_PCD_MASK ? 'C' : '-',
1734                   pte & PG_PWT_MASK ? 'T' : '-',
1735                   pte & PG_USER_MASK ? 'U' : '-',
1736                   pte & PG_RW_MASK ? 'W' : '-');
1737}
1738
1739static void tlb_info(Monitor *mon)
1740{
1741    CPUState *env;
1742    int l1, l2;
1743    uint32_t pgd, pde, pte;
1744
1745    env = mon_get_cpu();
1746    if (!env)
1747        return;
1748
1749    if (!(env->cr[0] & CR0_PG_MASK)) {
1750        monitor_printf(mon, "PG disabled\n");
1751        return;
1752    }
1753    pgd = env->cr[3] & ~0xfff;
1754    for(l1 = 0; l1 < 1024; l1++) {
1755        cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4);
1756        pde = le32_to_cpu(pde);
1757        if (pde & PG_PRESENT_MASK) {
1758            if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
1759                print_pte(mon, (l1 << 22), pde, ~((1 << 20) - 1));
1760            } else {
1761                for(l2 = 0; l2 < 1024; l2++) {
1762                    cpu_physical_memory_read((pde & ~0xfff) + l2 * 4,
1763                                             (uint8_t *)&pte, 4);
1764                    pte = le32_to_cpu(pte);
1765                    if (pte & PG_PRESENT_MASK) {
1766                        print_pte(mon, (l1 << 22) + (l2 << 12),
1767                                  pte & ~PG_PSE_MASK,
1768                                  ~0xfff);
1769                    }
1770                }
1771            }
1772        }
1773    }
1774}
1775
1776static void mem_print(Monitor *mon, uint32_t *pstart, int *plast_prot,
1777                      uint32_t end, int prot)
1778{
1779    int prot1;
1780    prot1 = *plast_prot;
1781    if (prot != prot1) {
1782        if (*pstart != -1) {
1783            monitor_printf(mon, "%08x-%08x %08x %c%c%c\n",
1784                           *pstart, end, end - *pstart,
1785                           prot1 & PG_USER_MASK ? 'u' : '-',
1786                           'r',
1787                           prot1 & PG_RW_MASK ? 'w' : '-');
1788        }
1789        if (prot != 0)
1790            *pstart = end;
1791        else
1792            *pstart = -1;
1793        *plast_prot = prot;
1794    }
1795}
1796
1797static void mem_info(Monitor *mon)
1798{
1799    CPUState *env;
1800    int l1, l2, prot, last_prot;
1801    uint32_t pgd, pde, pte, start, end;
1802
1803    env = mon_get_cpu();
1804    if (!env)
1805        return;
1806
1807    if (!(env->cr[0] & CR0_PG_MASK)) {
1808        monitor_printf(mon, "PG disabled\n");
1809        return;
1810    }
1811    pgd = env->cr[3] & ~0xfff;
1812    last_prot = 0;
1813    start = -1;
1814    for(l1 = 0; l1 < 1024; l1++) {
1815        cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4);
1816        pde = le32_to_cpu(pde);
1817        end = l1 << 22;
1818        if (pde & PG_PRESENT_MASK) {
1819            if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
1820                prot = pde & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
1821                mem_print(mon, &start, &last_prot, end, prot);
1822            } else {
1823                for(l2 = 0; l2 < 1024; l2++) {
1824                    cpu_physical_memory_read((pde & ~0xfff) + l2 * 4,
1825                                             (uint8_t *)&pte, 4);
1826                    pte = le32_to_cpu(pte);
1827                    end = (l1 << 22) + (l2 << 12);
1828                    if (pte & PG_PRESENT_MASK) {
1829                        prot = pte & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
1830                    } else {
1831                        prot = 0;
1832                    }
1833                    mem_print(mon, &start, &last_prot, end, prot);
1834                }
1835            }
1836        } else {
1837            prot = 0;
1838            mem_print(mon, &start, &last_prot, end, prot);
1839        }
1840    }
1841}
1842#endif
1843
1844#if defined(TARGET_SH4)
1845
1846static void print_tlb(Monitor *mon, int idx, tlb_t *tlb)
1847{
1848    monitor_printf(mon, " tlb%i:\t"
1849                   "asid=%hhu vpn=%x\tppn=%x\tsz=%hhu size=%u\t"
1850                   "v=%hhu shared=%hhu cached=%hhu prot=%hhu "
1851                   "dirty=%hhu writethrough=%hhu\n",
1852                   idx,
1853                   tlb->asid, tlb->vpn, tlb->ppn, tlb->sz, tlb->size,
1854                   tlb->v, tlb->sh, tlb->c, tlb->pr,
1855                   tlb->d, tlb->wt);
1856}
1857
1858static void tlb_info(Monitor *mon)
1859{
1860    CPUState *env = mon_get_cpu();
1861    int i;
1862
1863    monitor_printf (mon, "ITLB:\n");
1864    for (i = 0 ; i < ITLB_SIZE ; i++)
1865        print_tlb (mon, i, &env->itlb[i]);
1866    monitor_printf (mon, "UTLB:\n");
1867    for (i = 0 ; i < UTLB_SIZE ; i++)
1868        print_tlb (mon, i, &env->utlb[i]);
1869}
1870
1871#endif
1872
1873static void do_info_kvm_print(Monitor *mon, const QObject *data)
1874{
1875    QDict *qdict;
1876
1877    qdict = qobject_to_qdict(data);
1878
1879    monitor_printf(mon, "kvm support: ");
1880    if (qdict_get_bool(qdict, "present")) {
1881        monitor_printf(mon, "%s\n", qdict_get_bool(qdict, "enabled") ?
1882                                    "enabled" : "disabled");
1883    } else {
1884        monitor_printf(mon, "not compiled\n");
1885    }
1886}
1887
1888/**
1889 * do_info_kvm(): Show KVM information
1890 *
1891 * Return a QDict with the following information:
1892 *
1893 * - "enabled": true if KVM support is enabled, false otherwise
1894 * - "present": true if QEMU has KVM support, false otherwise
1895 *
1896 * Example:
1897 *
1898 * { "enabled": true, "present": true }
1899 */
1900static void do_info_kvm(Monitor *mon, QObject **ret_data)
1901{
1902#ifdef CONFIG_KVM
1903    *ret_data = qobject_from_jsonf("{ 'enabled': %i, 'present': true }",
1904                                   kvm_enabled());
1905#else
1906    *ret_data = qobject_from_jsonf("{ 'enabled': false, 'present': false }");
1907#endif
1908}
1909
1910static void do_info_numa(Monitor *mon)
1911{
1912    int i;
1913    CPUState *env;
1914
1915    monitor_printf(mon, "%d nodes\n", nb_numa_nodes);
1916    for (i = 0; i < nb_numa_nodes; i++) {
1917        monitor_printf(mon, "node %d cpus:", i);
1918        for (env = first_cpu; env != NULL; env = env->next_cpu) {
1919            if (env->numa_node == i) {
1920                monitor_printf(mon, " %d", env->cpu_index);
1921            }
1922        }
1923        monitor_printf(mon, "\n");
1924        monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i,
1925            node_mem[i] >> 20);
1926    }
1927}
1928
1929#ifdef CONFIG_PROFILER
1930
1931int64_t qemu_time;
1932int64_t dev_time;
1933
1934static void do_info_profile(Monitor *mon)
1935{
1936    int64_t total;
1937    total = qemu_time;
1938    if (total == 0)
1939        total = 1;
1940    monitor_printf(mon, "async time  %" PRId64 " (%0.3f)\n",
1941                   dev_time, dev_time / (double)get_ticks_per_sec());
1942    monitor_printf(mon, "qemu time   %" PRId64 " (%0.3f)\n",
1943                   qemu_time, qemu_time / (double)get_ticks_per_sec());
1944    qemu_time = 0;
1945    dev_time = 0;
1946}
1947#else
1948static void do_info_profile(Monitor *mon)
1949{
1950    monitor_printf(mon, "Internal profiler not compiled\n");
1951}
1952#endif
1953
1954/* Capture support */
1955static QLIST_HEAD (capture_list_head, CaptureState) capture_head;
1956
1957static void do_info_capture(Monitor *mon)
1958{
1959    int i;
1960    CaptureState *s;
1961
1962    for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1963        monitor_printf(mon, "[%d]: ", i);
1964        s->ops.info (s->opaque);
1965    }
1966}
1967
1968#ifdef HAS_AUDIO
1969static void do_stop_capture(Monitor *mon, const QDict *qdict)
1970{
1971    int i;
1972    int n = qdict_get_int(qdict, "n");
1973    CaptureState *s;
1974
1975    for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1976        if (i == n) {
1977            s->ops.destroy (s->opaque);
1978            QLIST_REMOVE (s, entries);
1979            qemu_free (s);
1980            return;
1981        }
1982    }
1983}
1984
1985static void do_wav_capture(Monitor *mon, const QDict *qdict)
1986{
1987    const char *path = qdict_get_str(qdict, "path");
1988    int has_freq = qdict_haskey(qdict, "freq");
1989    int freq = qdict_get_try_int(qdict, "freq", -1);
1990    int has_bits = qdict_haskey(qdict, "bits");
1991    int bits = qdict_get_try_int(qdict, "bits", -1);
1992    int has_channels = qdict_haskey(qdict, "nchannels");
1993    int nchannels = qdict_get_try_int(qdict, "nchannels", -1);
1994    CaptureState *s;
1995
1996    s = qemu_mallocz (sizeof (*s));
1997
1998    freq = has_freq ? freq : 44100;
1999    bits = has_bits ? bits : 16;
2000    nchannels = has_channels ? nchannels : 2;
2001
2002    if (wav_start_capture (s, path, freq, bits, nchannels)) {
2003        monitor_printf(mon, "Faied to add wave capture\n");
2004        qemu_free (s);
2005    }
2006    QLIST_INSERT_HEAD (&capture_head, s, entries);
2007}
2008#endif
2009
2010#if defined(TARGET_I386)
2011static void do_inject_nmi(Monitor *mon, const QDict *qdict)
2012{
2013    CPUState *env;
2014    int cpu_index = qdict_get_int(qdict, "cpu_index");
2015
2016    for (env = first_cpu; env != NULL; env = env->next_cpu)
2017        if (env->cpu_index == cpu_index) {
2018            cpu_interrupt(env, CPU_INTERRUPT_NMI);
2019            break;
2020        }
2021}
2022#endif
2023
2024static void do_info_status_print(Monitor *mon, const QObject *data)
2025{
2026    QDict *qdict;
2027
2028    qdict = qobject_to_qdict(data);
2029
2030    monitor_printf(mon, "VM status: ");
2031    if (qdict_get_bool(qdict, "running")) {
2032        monitor_printf(mon, "running");
2033        if (qdict_get_bool(qdict, "singlestep")) {
2034            monitor_printf(mon, " (single step mode)");
2035        }
2036    } else {
2037        monitor_printf(mon, "paused");
2038    }
2039
2040    monitor_printf(mon, "\n");
2041}
2042
2043/**
2044 * do_info_status(): VM status
2045 *
2046 * Return a QDict with the following information:
2047 *
2048 * - "running": true if the VM is running, or false if it is paused
2049 * - "singlestep": true if the VM is in single step mode, false otherwise
2050 *
2051 * Example:
2052 *
2053 * { "running": true, "singlestep": false }
2054 */
2055static void do_info_status(Monitor *mon, QObject **ret_data)
2056{
2057    *ret_data = qobject_from_jsonf("{ 'running': %i, 'singlestep': %i }",
2058                                    vm_running, singlestep);
2059}
2060
2061static ram_addr_t balloon_get_value(void)
2062{
2063    ram_addr_t actual;
2064
2065    if (kvm_enabled() && !kvm_has_sync_mmu()) {
2066        qemu_error_new(QERR_KVM_MISSING_CAP, "synchronous MMU", "balloon");
2067        return 0;
2068    }
2069
2070    actual = qemu_balloon_status();
2071    if (actual == 0) {
2072        qemu_error_new(QERR_DEVICE_NOT_ACTIVE, "balloon");
2073        return 0;
2074    }
2075
2076    return actual;
2077}
2078
2079/**
2080 * do_balloon(): Request VM to change its memory allocation
2081 */
2082static void do_balloon(Monitor *mon, const QDict *qdict, QObject **ret_data)
2083{
2084    if (balloon_get_value()) {
2085        /* ballooning is active */
2086        qemu_balloon(qdict_get_int(qdict, "value"));
2087    }
2088}
2089
2090static void monitor_print_balloon(Monitor *mon, const QObject *data)
2091{
2092    QDict *qdict;
2093
2094    qdict = qobject_to_qdict(data);
2095
2096    monitor_printf(mon, "balloon: actual=%" PRId64 "\n",
2097                        qdict_get_int(qdict, "balloon") >> 20);
2098}
2099
2100/**
2101 * do_info_balloon(): Balloon information
2102 *
2103 * Return a QDict with the following information:
2104 *
2105 * - "balloon": current balloon value in bytes
2106 *
2107 * Example:
2108 *
2109 * { "balloon": 1073741824 }
2110 */
2111static void do_info_balloon(Monitor *mon, QObject **ret_data)
2112{
2113    ram_addr_t actual;
2114
2115    actual = balloon_get_value();
2116    if (actual != 0) {
2117        *ret_data = qobject_from_jsonf("{ 'balloon': %" PRId64 "}",
2118                                       (int64_t) actual);
2119    }
2120}
2121
2122static qemu_acl *find_acl(Monitor *mon, const char *name)
2123{
2124    qemu_acl *acl = qemu_acl_find(name);
2125
2126    if (!acl) {
2127        monitor_printf(mon, "acl: unknown list '%s'\n", name);
2128    }
2129    return acl;
2130}
2131
2132static void do_acl_show(Monitor *mon, const QDict *qdict)
2133{
2134    const char *aclname = qdict_get_str(qdict, "aclname");
2135    qemu_acl *acl = find_acl(mon, aclname);
2136    qemu_acl_entry *entry;
2137    int i = 0;
2138
2139    if (acl) {
2140        monitor_printf(mon, "policy: %s\n",
2141                       acl->defaultDeny ? "deny" : "allow");
2142        QTAILQ_FOREACH(entry, &acl->entries, next) {
2143            i++;
2144            monitor_printf(mon, "%d: %s %s\n", i,
2145                           entry->deny ? "deny" : "allow", entry->match);
2146        }
2147    }
2148}
2149
2150static void do_acl_reset(Monitor *mon, const QDict *qdict)
2151{
2152    const char *aclname = qdict_get_str(qdict, "aclname");
2153    qemu_acl *acl = find_acl(mon, aclname);
2154
2155    if (acl) {
2156        qemu_acl_reset(acl);
2157        monitor_printf(mon, "acl: removed all rules\n");
2158    }
2159}
2160
2161static void do_acl_policy(Monitor *mon, const QDict *qdict)
2162{
2163    const char *aclname = qdict_get_str(qdict, "aclname");
2164    const char *policy = qdict_get_str(qdict, "policy");
2165    qemu_acl *acl = find_acl(mon, aclname);
2166
2167    if (acl) {
2168        if (strcmp(policy, "allow") == 0) {
2169            acl->defaultDeny = 0;
2170            monitor_printf(mon, "acl: policy set to 'allow'\n");
2171        } else if (strcmp(policy, "deny") == 0) {
2172            acl->defaultDeny = 1;
2173            monitor_printf(mon, "acl: policy set to 'deny'\n");
2174        } else {
2175            monitor_printf(mon, "acl: unknown policy '%s', "
2176                           "expected 'deny' or 'allow'\n", policy);
2177        }
2178    }
2179}
2180
2181static void do_acl_add(Monitor *mon, const QDict *qdict)
2182{
2183    const char *aclname = qdict_get_str(qdict, "aclname");
2184    const char *match = qdict_get_str(qdict, "match");
2185    const char *policy = qdict_get_str(qdict, "policy");
2186    int has_index = qdict_haskey(qdict, "index");
2187    int index = qdict_get_try_int(qdict, "index", -1);
2188    qemu_acl *acl = find_acl(mon, aclname);
2189    int deny, ret;
2190
2191    if (acl) {
2192        if (strcmp(policy, "allow") == 0) {
2193            deny = 0;
2194        } else if (strcmp(policy, "deny") == 0) {
2195            deny = 1;
2196        } else {
2197            monitor_printf(mon, "acl: unknown policy '%s', "
2198                           "expected 'deny' or 'allow'\n", policy);
2199            return;
2200        }
2201        if (has_index)
2202            ret = qemu_acl_insert(acl, deny, match, index);
2203        else
2204            ret = qemu_acl_append(acl, deny, match);
2205        if (ret < 0)
2206            monitor_printf(mon, "acl: unable to add acl entry\n");
2207        else
2208            monitor_printf(mon, "acl: added rule at position %d\n", ret);
2209    }
2210}
2211
2212static void do_acl_remove(Monitor *mon, const QDict *qdict)
2213{
2214    const char *aclname = qdict_get_str(qdict, "aclname");
2215    const char *match = qdict_get_str(qdict, "match");
2216    qemu_acl *acl = find_acl(mon, aclname);
2217    int ret;
2218
2219    if (acl) {
2220        ret = qemu_acl_remove(acl, match);
2221        if (ret < 0)
2222            monitor_printf(mon, "acl: no matching acl entry\n");
2223        else
2224            monitor_printf(mon, "acl: removed rule at position %d\n", ret);
2225    }
2226}
2227
2228#if defined(TARGET_I386)
2229static void do_inject_mce(Monitor *mon, const QDict *qdict)
2230{
2231    CPUState *cenv;
2232    int cpu_index = qdict_get_int(qdict, "cpu_index");
2233    int bank = qdict_get_int(qdict, "bank");
2234    uint64_t status = qdict_get_int(qdict, "status");
2235    uint64_t mcg_status = qdict_get_int(qdict, "mcg_status");
2236    uint64_t addr = qdict_get_int(qdict, "addr");
2237    uint64_t misc = qdict_get_int(qdict, "misc");
2238
2239    for (cenv = first_cpu; cenv != NULL; cenv = cenv->next_cpu)
2240        if (cenv->cpu_index == cpu_index && cenv->mcg_cap) {
2241            cpu_inject_x86_mce(cenv, bank, status, mcg_status, addr, misc);
2242            break;
2243        }
2244}
2245#endif
2246
2247static void do_getfd(Monitor *mon, const QDict *qdict, QObject **ret_data)
2248{
2249    const char *fdname = qdict_get_str(qdict, "fdname");
2250    mon_fd_t *monfd;
2251    int fd;
2252
2253    fd = qemu_chr_get_msgfd(mon->chr);
2254    if (fd == -1) {
2255        qemu_error_new(QERR_FD_NOT_SUPPLIED);
2256        return;
2257    }
2258
2259    if (qemu_isdigit(fdname[0])) {
2260        qemu_error_new(QERR_INVALID_PARAMETER, "fdname");
2261        return;
2262    }
2263
2264    fd = dup(fd);
2265    if (fd == -1) {
2266        if (errno == EMFILE)
2267            qemu_error_new(QERR_TOO_MANY_FILES);
2268        else
2269            qemu_error_new(QERR_UNDEFINED_ERROR);
2270        return;
2271    }
2272
2273    QLIST_FOREACH(monfd, &mon->fds, next) {
2274        if (strcmp(monfd->name, fdname) != 0) {
2275            continue;
2276        }
2277
2278        close(monfd->fd);
2279        monfd->fd = fd;
2280        return;
2281    }
2282
2283    monfd = qemu_mallocz(sizeof(mon_fd_t));
2284    monfd->name = qemu_strdup(fdname);
2285    monfd->fd = fd;
2286
2287    QLIST_INSERT_HEAD(&mon->fds, monfd, next);
2288}
2289
2290static void do_closefd(Monitor *mon, const QDict *qdict, QObject **ret_data)
2291{
2292    const char *fdname = qdict_get_str(qdict, "fdname");
2293    mon_fd_t *monfd;
2294
2295    QLIST_FOREACH(monfd, &mon->fds, next) {
2296        if (strcmp(monfd->name, fdname) != 0) {
2297            continue;
2298        }
2299
2300        QLIST_REMOVE(monfd, next);
2301        close(monfd->fd);
2302        qemu_free(monfd->name);
2303        qemu_free(monfd);
2304        return;
2305    }
2306
2307    qemu_error_new(QERR_FD_NOT_FOUND, fdname);
2308}
2309
2310static void do_loadvm(Monitor *mon, const QDict *qdict)
2311{
2312    int saved_vm_running  = vm_running;
2313    const char *name = qdict_get_str(qdict, "name");
2314
2315    vm_stop(0);
2316
2317    if (load_vmstate(mon, name) >= 0 && saved_vm_running)
2318        vm_start();
2319}
2320
2321int monitor_get_fd(Monitor *mon, const char *fdname)
2322{
2323    mon_fd_t *monfd;
2324
2325    QLIST_FOREACH(monfd, &mon->fds, next) {
2326        int fd;
2327
2328        if (strcmp(monfd->name, fdname) != 0) {
2329            continue;
2330        }
2331
2332        fd = monfd->fd;
2333
2334        /* caller takes ownership of fd */
2335        QLIST_REMOVE(monfd, next);
2336        qemu_free(monfd->name);
2337        qemu_free(monfd);
2338
2339        return fd;
2340    }
2341
2342    return -1;
2343}
2344
2345static const mon_cmd_t mon_cmds[] = {
2346#include "qemu-monitor.h"
2347    { NULL, NULL, },
2348};
2349
2350/* Please update qemu-monitor.hx when adding or changing commands */
2351static const mon_cmd_t info_cmds[] = {
2352    {
2353        .name       = "version",
2354        .args_type  = "",
2355        .params     = "",
2356        .help       = "show the version of QEMU",
2357        .user_print = do_info_version_print,
2358        .mhandler.info_new = do_info_version,
2359    },
2360    {
2361        .name       = "commands",
2362        .args_type  = "",
2363        .params     = "",
2364        .help       = "list QMP available commands",
2365        .user_print = monitor_user_noop,
2366        .mhandler.info_new = do_info_commands,
2367    },
2368    {
2369        .name       = "network",
2370        .args_type  = "",
2371        .params     = "",
2372        .help       = "show the network state",
2373        .mhandler.info = do_info_network,
2374    },
2375    {
2376        .name       = "chardev",
2377        .args_type  = "",
2378        .params     = "",
2379        .help       = "show the character devices",
2380        .user_print = qemu_chr_info_print,
2381        .mhandler.info_new = qemu_chr_info,
2382    },
2383    {
2384        .name       = "block",
2385        .args_type  = "",
2386        .params     = "",
2387        .help       = "show the block devices",
2388        .user_print = bdrv_info_print,
2389        .mhandler.info_new = bdrv_info,
2390    },
2391    {
2392        .name       = "blockstats",
2393        .args_type  = "",
2394        .params     = "",
2395        .help       = "show block device statistics",
2396        .user_print = bdrv_stats_print,
2397        .mhandler.info_new = bdrv_info_stats,
2398    },
2399    {
2400        .name       = "registers",
2401        .args_type  = "",
2402        .params     = "",
2403        .help       = "show the cpu registers",
2404        .mhandler.info = do_info_registers,
2405    },
2406    {
2407        .name       = "cpus",
2408        .args_type  = "",
2409        .params     = "",
2410        .help       = "show infos for each CPU",
2411        .user_print = monitor_print_cpus,
2412        .mhandler.info_new = do_info_cpus,
2413    },
2414    {
2415        .name       = "history",
2416        .args_type  = "",
2417        .params     = "",
2418        .help       = "show the command line history",
2419        .mhandler.info = do_info_history,
2420    },
2421    {
2422        .name       = "irq",
2423        .args_type  = "",
2424        .params     = "",
2425        .help       = "show the interrupts statistics (if available)",
2426        .mhandler.info = irq_info,
2427    },
2428    {
2429        .name       = "pic",
2430        .args_type  = "",
2431        .params     = "",
2432        .help       = "show i8259 (PIC) state",
2433        .mhandler.info = pic_info,
2434    },
2435    {
2436        .name       = "pci",
2437        .args_type  = "",
2438        .params     = "",
2439        .help       = "show PCI info",
2440        .mhandler.info = pci_info,
2441    },
2442#if defined(TARGET_I386) || defined(TARGET_SH4)
2443    {
2444        .name       = "tlb",
2445        .args_type  = "",
2446        .params     = "",
2447        .help       = "show virtual to physical memory mappings",
2448        .mhandler.info = tlb_info,
2449    },
2450#endif
2451#if defined(TARGET_I386)
2452    {
2453        .name       = "mem",
2454        .args_type  = "",
2455        .params     = "",
2456        .help       = "show the active virtual memory mappings",
2457        .mhandler.info = mem_info,
2458    },
2459    {
2460        .name       = "hpet",
2461        .args_type  = "",
2462        .params     = "",
2463        .help       = "show state of HPET",
2464        .user_print = do_info_hpet_print,
2465        .mhandler.info_new = do_info_hpet,
2466    },
2467#endif
2468    {
2469        .name       = "jit",
2470        .args_type  = "",
2471        .params     = "",
2472        .help       = "show dynamic compiler info",
2473        .mhandler.info = do_info_jit,
2474    },
2475    {
2476        .name       = "kvm",
2477        .args_type  = "",
2478        .params     = "",
2479        .help       = "show KVM information",
2480        .user_print = do_info_kvm_print,
2481        .mhandler.info_new = do_info_kvm,
2482    },
2483    {
2484        .name       = "numa",
2485        .args_type  = "",
2486        .params     = "",
2487        .help       = "show NUMA information",
2488        .mhandler.info = do_info_numa,
2489    },
2490    {
2491        .name       = "usb",
2492        .args_type  = "",
2493        .params     = "",
2494        .help       = "show guest USB devices",
2495        .mhandler.info = usb_info,
2496    },
2497    {
2498        .name       = "usbhost",
2499        .args_type  = "",
2500        .params     = "",
2501        .help       = "show host USB devices",
2502        .mhandler.info = usb_host_info,
2503    },
2504    {
2505        .name       = "profile",
2506        .args_type  = "",
2507        .params     = "",
2508        .help       = "show profiling information",
2509        .mhandler.info = do_info_profile,
2510    },
2511    {
2512        .name       = "capture",
2513        .args_type  = "",
2514        .params     = "",
2515        .help       = "show capture information",
2516        .mhandler.info = do_info_capture,
2517    },
2518    {
2519        .name       = "snapshots",
2520        .args_type  = "",
2521        .params     = "",
2522        .help       = "show the currently saved VM snapshots",
2523        .mhandler.info = do_info_snapshots,
2524    },
2525    {
2526        .name       = "status",
2527        .args_type  = "",
2528        .params     = "",
2529        .help       = "show the current VM status (running|paused)",
2530        .user_print = do_info_status_print,
2531        .mhandler.info_new = do_info_status,
2532    },
2533    {
2534        .name       = "pcmcia",
2535        .args_type  = "",
2536        .params     = "",
2537        .help       = "show guest PCMCIA status",
2538        .mhandler.info = pcmcia_info,
2539    },
2540    {
2541        .name       = "mice",
2542        .args_type  = "",
2543        .params     = "",
2544        .help       = "show which guest mouse is receiving events",
2545        .user_print = do_info_mice_print,
2546        .mhandler.info_new = do_info_mice,
2547    },
2548    {
2549        .name       = "vnc",
2550        .args_type  = "",
2551        .params     = "",
2552        .help       = "show the vnc server status",
2553        .user_print = do_info_vnc_print,
2554        .mhandler.info_new = do_info_vnc,
2555    },
2556    {
2557        .name       = "name",
2558        .args_type  = "",
2559        .params     = "",
2560        .help       = "show the current VM name",
2561        .user_print = do_info_name_print,
2562        .mhandler.info_new = do_info_name,
2563    },
2564    {
2565        .name       = "uuid",
2566        .args_type  = "",
2567        .params     = "",
2568        .help       = "show the current VM UUID",
2569        .user_print = do_info_uuid_print,
2570        .mhandler.info_new = do_info_uuid,
2571    },
2572#if defined(TARGET_PPC)
2573    {
2574        .name       = "cpustats",
2575        .args_type  = "",
2576        .params     = "",
2577        .help       = "show CPU statistics",
2578        .mhandler.info = do_info_cpu_stats,
2579    },
2580#endif
2581#if defined(CONFIG_SLIRP)
2582    {
2583        .name       = "usernet",
2584        .args_type  = "",
2585        .params     = "",
2586        .help       = "show user network stack connection states",
2587        .mhandler.info = do_info_usernet,
2588    },
2589#endif
2590    {
2591        .name       = "migrate",
2592        .args_type  = "",
2593        .params     = "",
2594        .help       = "show migration status",
2595        .user_print = do_info_migrate_print,
2596        .mhandler.info_new = do_info_migrate,
2597    },
2598    {
2599        .name       = "balloon",
2600        .args_type  = "",
2601        .params     = "",
2602        .help       = "show balloon information",
2603        .user_print = monitor_print_balloon,
2604        .mhandler.info_new = do_info_balloon,
2605    },
2606    {
2607        .name       = "qtree",
2608        .args_type  = "",
2609        .params     = "",
2610        .help       = "show device tree",
2611        .mhandler.info = do_info_qtree,
2612    },
2613    {
2614        .name       = "qdm",
2615        .args_type  = "",
2616        .params     = "",
2617        .help       = "show qdev device model list",
2618        .mhandler.info = do_info_qdm,
2619    },
2620    {
2621        .name       = "roms",
2622        .args_type  = "",
2623        .params     = "",
2624        .help       = "show roms",
2625        .mhandler.info = do_info_roms,
2626    },
2627    {
2628        .name       = NULL,
2629    },
2630};
2631
2632/*******************************************************************/
2633
2634static const char *pch;
2635static jmp_buf expr_env;
2636
2637#define MD_TLONG 0
2638#define MD_I32   1
2639
2640typedef struct MonitorDef {
2641    const char *name;
2642    int offset;
2643    target_long (*get_value)(const struct MonitorDef *md, int val);
2644    int type;
2645} MonitorDef;
2646
2647#if defined(TARGET_I386)
2648static target_long monitor_get_pc (const struct MonitorDef *md, int val)
2649{
2650    CPUState *env = mon_get_cpu();
2651    if (!env)
2652        return 0;
2653    return env->eip + env->segs[R_CS].base;
2654}
2655#endif
2656
2657#if defined(TARGET_PPC)
2658static target_long monitor_get_ccr (const struct MonitorDef *md, int val)
2659{
2660    CPUState *env = mon_get_cpu();
2661    unsigned int u;
2662    int i;
2663
2664    if (!env)
2665        return 0;
2666
2667    u = 0;
2668    for (i = 0; i < 8; i++)
2669        u |= env->crf[i] << (32 - (4 * i));
2670
2671    return u;
2672}
2673
2674static target_long monitor_get_msr (const struct MonitorDef *md, int val)
2675{
2676    CPUState *env = mon_get_cpu();
2677    if (!env)
2678        return 0;
2679    return env->msr;
2680}
2681
2682static target_long monitor_get_xer (const struct MonitorDef *md, int val)
2683{
2684    CPUState *env = mon_get_cpu();
2685    if (!env)
2686        return 0;
2687    return env->xer;
2688}
2689
2690static target_long monitor_get_decr (const struct MonitorDef *md, int val)
2691{
2692    CPUState *env = mon_get_cpu();
2693    if (!env)
2694        return 0;
2695    return cpu_ppc_load_decr(env);
2696}
2697
2698static target_long monitor_get_tbu (const struct MonitorDef *md, int val)
2699{
2700    CPUState *env = mon_get_cpu();
2701    if (!env)
2702        return 0;
2703    return cpu_ppc_load_tbu(env);
2704}
2705
2706static target_long monitor_get_tbl (const struct MonitorDef *md, int val)
2707{
2708    CPUState *env = mon_get_cpu();
2709    if (!env)
2710        return 0;
2711    return cpu_ppc_load_tbl(env);
2712}
2713#endif
2714
2715#if defined(TARGET_SPARC)
2716#ifndef TARGET_SPARC64
2717static target_long monitor_get_psr (const struct MonitorDef *md, int val)
2718{
2719    CPUState *env = mon_get_cpu();
2720    if (!env)
2721        return 0;
2722    return GET_PSR(env);
2723}
2724#endif
2725
2726static target_long monitor_get_reg(const struct MonitorDef *md, int val)
2727{
2728    CPUState *env = mon_get_cpu();
2729    if (!env)
2730        return 0;
2731    return env->regwptr[val];
2732}
2733#endif
2734
2735static const MonitorDef monitor_defs[] = {
2736#ifdef TARGET_I386
2737
2738#define SEG(name, seg) \
2739    { name, offsetof(CPUState, segs[seg].selector), NULL, MD_I32 },\
2740    { name ".base", offsetof(CPUState, segs[seg].base) },\
2741    { name ".limit", offsetof(CPUState, segs[seg].limit), NULL, MD_I32 },
2742
2743    { "eax", offsetof(CPUState, regs[0]) },
2744    { "ecx", offsetof(CPUState, regs[1]) },
2745    { "edx", offsetof(CPUState, regs[2]) },
2746    { "ebx", offsetof(CPUState, regs[3]) },
2747    { "esp|sp", offsetof(CPUState, regs[4]) },
2748    { "ebp|fp", offsetof(CPUState, regs[5]) },
2749    { "esi", offsetof(CPUState, regs[6]) },
2750    { "edi", offsetof(CPUState, regs[7]) },
2751#ifdef TARGET_X86_64
2752    { "r8", offsetof(CPUState, regs[8]) },
2753    { "r9", offsetof(CPUState, regs[9]) },
2754    { "r10", offsetof(CPUState, regs[10]) },
2755    { "r11", offsetof(CPUState, regs[11]) },
2756    { "r12", offsetof(CPUState, regs[12]) },
2757    { "r13", offsetof(CPUState, regs[13]) },
2758    { "r14", offsetof(CPUState, regs[14]) },
2759    { "r15", offsetof(CPUState, regs[15]) },
2760#endif
2761    { "eflags", offsetof(CPUState, eflags) },
2762    { "eip", offsetof(CPUState, eip) },
2763    SEG("cs", R_CS)
2764    SEG("ds", R_DS)
2765    SEG("es", R_ES)
2766    SEG("ss", R_SS)
2767    SEG("fs", R_FS)
2768    SEG("gs", R_GS)
2769    { "pc", 0, monitor_get_pc, },
2770#elif defined(TARGET_PPC)
2771    /* General purpose registers */
2772    { "r0", offsetof(CPUState, gpr[0]) },
2773    { "r1", offsetof(CPUState, gpr[1]) },
2774    { "r2", offsetof(CPUState, gpr[2]) },
2775    { "r3", offsetof(CPUState, gpr[3]) },
2776    { "r4", offsetof(CPUState, gpr[4]) },
2777    { "r5", offsetof(CPUState, gpr[5]) },
2778    { "r6", offsetof(CPUState, gpr[6]) },
2779    { "r7", offsetof(CPUState, gpr[7]) },
2780    { "r8", offsetof(CPUState, gpr[8]) },
2781    { "r9", offsetof(CPUState, gpr[9]) },
2782    { "r10", offsetof(CPUState, gpr[10]) },
2783    { "r11", offsetof(CPUState, gpr[11]) },
2784    { "r12", offsetof(CPUState, gpr[12]) },
2785    { "r13", offsetof(CPUState, gpr[13]) },
2786    { "r14", offsetof(CPUState, gpr[14]) },
2787    { "r15", offsetof(CPUState, gpr[15]) },
2788    { "r16", offsetof(CPUState, gpr[16]) },
2789    { "r17", offsetof(CPUState, gpr[17]) },
2790    { "r18", offsetof(CPUState, gpr[18]) },
2791    { "r19", offsetof(CPUState, gpr[19]) },
2792    { "r20", offsetof(CPUState, gpr[20]) },
2793    { "r21", offsetof(CPUState, gpr[21]) },
2794    { "r22", offsetof(CPUState, gpr[22]) },
2795    { "r23", offsetof(CPUState, gpr[23]) },
2796    { "r24", offsetof(CPUState, gpr[24]) },
2797    { "r25", offsetof(CPUState, gpr[25]) },
2798    { "r26", offsetof(CPUState, gpr[26]) },
2799    { "r27", offsetof(CPUState, gpr[27]) },
2800    { "r28", offsetof(CPUState, gpr[28]) },
2801    { "r29", offsetof(CPUState, gpr[29]) },
2802    { "r30", offsetof(CPUState, gpr[30]) },
2803    { "r31", offsetof(CPUState, gpr[31]) },
2804    /* Floating point registers */
2805    { "f0", offsetof(CPUState, fpr[0]) },
2806    { "f1", offsetof(CPUState, fpr[1]) },
2807    { "f2", offsetof(CPUState, fpr[2]) },
2808    { "f3", offsetof(CPUState, fpr[3]) },
2809    { "f4", offsetof(CPUState, fpr[4]) },
2810    { "f5", offsetof(CPUState, fpr[5]) },
2811    { "f6", offsetof(CPUState, fpr[6]) },
2812    { "f7", offsetof(CPUState, fpr[7]) },
2813    { "f8", offsetof(CPUState, fpr[8]) },
2814    { "f9", offsetof(CPUState, fpr[9]) },
2815    { "f10", offsetof(CPUState, fpr[10]) },
2816    { "f11", offsetof(CPUState, fpr[11]) },
2817    { "f12", offsetof(CPUState, fpr[12]) },
2818    { "f13", offsetof(CPUState, fpr[13]) },
2819    { "f14", offsetof(CPUState, fpr[14]) },
2820    { "f15", offsetof(CPUState, fpr[15]) },
2821    { "f16", offsetof(CPUState, fpr[16]) },
2822    { "f17", offsetof(CPUState, fpr[17]) },
2823    { "f18", offsetof(CPUState, fpr[18]) },
2824    { "f19", offsetof(CPUState, fpr[19]) },
2825    { "f20", offsetof(CPUState, fpr[20]) },
2826    { "f21", offsetof(CPUState, fpr[21]) },
2827    { "f22", offsetof(CPUState, fpr[22]) },
2828    { "f23", offsetof(CPUState, fpr[23]) },
2829    { "f24", offsetof(CPUState, fpr[24]) },
2830    { "f25", offsetof(CPUState, fpr[25]) },
2831    { "f26", offsetof(CPUState, fpr[26]) },
2832    { "f27", offsetof(CPUState, fpr[27]) },
2833    { "f28", offsetof(CPUState, fpr[28]) },
2834    { "f29", offsetof(CPUState, fpr[29]) },
2835    { "f30", offsetof(CPUState, fpr[30]) },
2836    { "f31", offsetof(CPUState, fpr[31]) },
2837    { "fpscr", offsetof(CPUState, fpscr) },
2838    /* Next instruction pointer */
2839    { "nip|pc", offsetof(CPUState, nip) },
2840    { "lr", offsetof(CPUState, lr) },
2841    { "ctr", offsetof(CPUState, ctr) },
2842    { "decr", 0, &monitor_get_decr, },
2843    { "ccr", 0, &monitor_get_ccr, },
2844    /* Machine state register */
2845    { "msr", 0, &monitor_get_msr, },
2846    { "xer", 0, &monitor_get_xer, },
2847    { "tbu", 0, &monitor_get_tbu, },
2848    { "tbl", 0, &monitor_get_tbl, },
2849#if defined(TARGET_PPC64)
2850    /* Address space register */
2851    { "asr", offsetof(CPUState, asr) },
2852#endif
2853    /* Segment registers */
2854    { "sdr1", offsetof(CPUState, sdr1) },
2855    { "sr0", offsetof(CPUState, sr[0]) },
2856    { "sr1", offsetof(CPUState, sr[1]) },
2857    { "sr2", offsetof(CPUState, sr[2]) },
2858    { "sr3", offsetof(CPUState, sr[3]) },
2859    { "sr4", offsetof(CPUState, sr[4]) },
2860    { "sr5", offsetof(CPUState, sr[5]) },
2861    { "sr6", offsetof(CPUState, sr[6]) },
2862    { "sr7", offsetof(CPUState, sr[7]) },
2863    { "sr8", offsetof(CPUState, sr[8]) },
2864    { "sr9", offsetof(CPUState, sr[9]) },
2865    { "sr10", offsetof(CPUState, sr[10]) },
2866    { "sr11", offsetof(CPUState, sr[11]) },
2867    { "sr12", offsetof(CPUState, sr[12]) },
2868    { "sr13", offsetof(CPUState, sr[13]) },
2869    { "sr14", offsetof(CPUState, sr[14]) },
2870    { "sr15", offsetof(CPUState, sr[15]) },
2871    /* Too lazy to put BATs and SPRs ... */
2872#elif defined(TARGET_SPARC)
2873    { "g0", offsetof(CPUState, gregs[0]) },
2874    { "g1", offsetof(CPUState, gregs[1]) },
2875    { "g2", offsetof(CPUState, gregs[2]) },
2876    { "g3", offsetof(CPUState, gregs[3]) },
2877    { "g4", offsetof(CPUState, gregs[4]) },
2878    { "g5", offsetof(CPUState, gregs[5]) },
2879    { "g6", offsetof(CPUState, gregs[6]) },
2880    { "g7", offsetof(CPUState, gregs[7]) },
2881    { "o0", 0, monitor_get_reg },
2882    { "o1", 1, monitor_get_reg },
2883    { "o2", 2, monitor_get_reg },
2884    { "o3", 3, monitor_get_reg },
2885    { "o4", 4, monitor_get_reg },
2886    { "o5", 5, monitor_get_reg },
2887    { "o6", 6, monitor_get_reg },
2888    { "o7", 7, monitor_get_reg },
2889    { "l0", 8, monitor_get_reg },
2890    { "l1", 9, monitor_get_reg },
2891    { "l2", 10, monitor_get_reg },
2892    { "l3", 11, monitor_get_reg },
2893    { "l4", 12, monitor_get_reg },
2894    { "l5", 13, monitor_get_reg },
2895    { "l6", 14, monitor_get_reg },
2896    { "l7", 15, monitor_get_reg },
2897    { "i0", 16, monitor_get_reg },
2898    { "i1", 17, monitor_get_reg },
2899    { "i2", 18, monitor_get_reg },
2900    { "i3", 19, monitor_get_reg },
2901    { "i4", 20, monitor_get_reg },
2902    { "i5", 21, monitor_get_reg },
2903    { "i6", 22, monitor_get_reg },
2904    { "i7", 23, monitor_get_reg },
2905    { "pc", offsetof(CPUState, pc) },
2906    { "npc", offsetof(CPUState, npc) },
2907    { "y", offsetof(CPUState, y) },
2908#ifndef TARGET_SPARC64
2909    { "psr", 0, &monitor_get_psr, },
2910    { "wim", offsetof(CPUState, wim) },
2911#endif
2912    { "tbr", offsetof(CPUState, tbr) },
2913    { "fsr", offsetof(CPUState, fsr) },
2914    { "f0", offsetof(CPUState, fpr[0]) },
2915    { "f1", offsetof(CPUState, fpr[1]) },
2916    { "f2", offsetof(CPUState, fpr[2]) },
2917    { "f3", offsetof(CPUState, fpr[3]) },
2918    { "f4", offsetof(CPUState, fpr[4]) },
2919    { "f5", offsetof(CPUState, fpr[5]) },
2920    { "f6", offsetof(CPUState, fpr[6]) },
2921    { "f7", offsetof(CPUState, fpr[7]) },
2922    { "f8", offsetof(CPUState, fpr[8]) },
2923    { "f9", offsetof(CPUState, fpr[9]) },
2924    { "f10", offsetof(CPUState, fpr[10]) },
2925    { "f11", offsetof(CPUState, fpr[11]) },
2926    { "f12", offsetof(CPUState, fpr[12]) },
2927    { "f13", offsetof(CPUState, fpr[13]) },
2928    { "f14", offsetof(CPUState, fpr[14]) },
2929    { "f15", offsetof(CPUState, fpr[15]) },
2930    { "f16", offsetof(CPUState, fpr[16]) },
2931    { "f17", offsetof(CPUState, fpr[17]) },
2932    { "f18", offsetof(CPUState, fpr[18]) },
2933    { "f19", offsetof(CPUState, fpr[19]) },
2934    { "f20", offsetof(CPUState, fpr[20]) },
2935    { "f21", offsetof(CPUState, fpr[21]) },
2936    { "f22", offsetof(CPUState, fpr[22]) },
2937    { "f23", offsetof(CPUState, fpr[23]) },
2938    { "f24", offsetof(CPUState, fpr[24]) },
2939    { "f25", offsetof(CPUState, fpr[25]) },
2940    { "f26", offsetof(CPUState, fpr[26]) },
2941    { "f27", offsetof(CPUState, fpr[27]) },
2942    { "f28", offsetof(CPUState, fpr[28]) },
2943    { "f29", offsetof(CPUState, fpr[29]) },
2944    { "f30", offsetof(CPUState, fpr[30]) },
2945    { "f31", offsetof(CPUState, fpr[31]) },
2946#ifdef TARGET_SPARC64
2947    { "f32", offsetof(CPUState, fpr[32]) },
2948    { "f34", offsetof(CPUState, fpr[34]) },
2949    { "f36", offsetof(CPUState, fpr[36]) },
2950    { "f38", offsetof(CPUState, fpr[38]) },
2951    { "f40", offsetof(CPUState, fpr[40]) },
2952    { "f42", offsetof(CPUState, fpr[42]) },
2953    { "f44", offsetof(CPUState, fpr[44]) },
2954    { "f46", offsetof(CPUState, fpr[46]) },
2955    { "f48", offsetof(CPUState, fpr[48]) },
2956    { "f50", offsetof(CPUState, fpr[50]) },
2957    { "f52", offsetof(CPUState, fpr[52]) },
2958    { "f54", offsetof(CPUState, fpr[54]) },
2959    { "f56", offsetof(CPUState, fpr[56]) },
2960    { "f58", offsetof(CPUState, fpr[58]) },
2961    { "f60", offsetof(CPUState, fpr[60]) },
2962    { "f62", offsetof(CPUState, fpr[62]) },
2963    { "asi", offsetof(CPUState, asi) },
2964    { "pstate", offsetof(CPUState, pstate) },
2965    { "cansave", offsetof(CPUState, cansave) },
2966    { "canrestore", offsetof(CPUState, canrestore) },
2967    { "otherwin", offsetof(CPUState, otherwin) },
2968    { "wstate", offsetof(CPUState, wstate) },
2969    { "cleanwin", offsetof(CPUState, cleanwin) },
2970    { "fprs", offsetof(CPUState, fprs) },
2971#endif
2972#endif
2973    { NULL },
2974};
2975
2976static void expr_error(Monitor *mon, const char *msg)
2977{
2978    monitor_printf(mon, "%s\n", msg);
2979    longjmp(expr_env, 1);
2980}
2981
2982/* return 0 if OK, -1 if not found, -2 if no CPU defined */
2983static int get_monitor_def(target_long *pval, const char *name)
2984{
2985    const MonitorDef *md;
2986    void *ptr;
2987
2988    for(md = monitor_defs; md->name != NULL; md++) {
2989        if (compare_cmd(name, md->name)) {
2990            if (md->get_value) {
2991                *pval = md->get_value(md, md->offset);
2992            } else {
2993                CPUState *env = mon_get_cpu();
2994                if (!env)
2995                    return -2;
2996                ptr = (uint8_t *)env + md->offset;
2997                switch(md->type) {
2998                case MD_I32:
2999                    *pval = *(int32_t *)ptr;
3000                    break;
3001                case MD_TLONG:
3002                    *pval = *(target_long *)ptr;
3003                    break;
3004                default:
3005                    *pval = 0;
3006                    break;
3007                }
3008            }
3009            return 0;
3010        }
3011    }
3012    return -1;
3013}
3014
3015static void next(void)
3016{
3017    if (*pch != '\0') {
3018        pch++;
3019        while (qemu_isspace(*pch))
3020            pch++;
3021    }
3022}
3023
3024static int64_t expr_sum(Monitor *mon);
3025
3026static int64_t expr_unary(Monitor *mon)
3027{
3028    int64_t n;
3029    char *p;
3030    int ret;
3031
3032    switch(*pch) {
3033    case '+':
3034        next();
3035        n = expr_unary(mon);
3036        break;
3037    case '-':
3038        next();
3039        n = -expr_unary(mon);
3040        break;
3041    case '~':
3042        next();
3043        n = ~expr_unary(mon);
3044        break;
3045    case '(':
3046        next();
3047        n = expr_sum(mon);
3048        if (*pch != ')') {
3049            expr_error(mon, "')' expected");
3050        }
3051        next();
3052        break;
3053    case '\'':
3054        pch++;
3055        if (*pch == '\0')
3056            expr_error(mon, "character constant expected");
3057        n = *pch;
3058        pch++;
3059        if (*pch != '\'')
3060            expr_error(mon, "missing terminating \' character");
3061        next();
3062        break;
3063    case '$':
3064        {
3065            char buf[128], *q;
3066            target_long reg=0;
3067
3068            pch++;
3069            q = buf;
3070            while ((*pch >= 'a' && *pch <= 'z') ||
3071                   (*pch >= 'A' && *pch <= 'Z') ||
3072                   (*pch >= '0' && *pch <= '9') ||
3073                   *pch == '_' || *pch == '.') {
3074                if ((q - buf) < sizeof(buf) - 1)
3075                    *q++ = *pch;
3076                pch++;
3077            }
3078            while (qemu_isspace(*pch))
3079                pch++;
3080            *q = 0;
3081            ret = get_monitor_def(&reg, buf);
3082            if (ret == -1)
3083                expr_error(mon, "unknown register");
3084            else if (ret == -2)
3085                expr_error(mon, "no cpu defined");
3086            n = reg;
3087        }
3088        break;
3089    case '\0':
3090        expr_error(mon, "unexpected end of expression");
3091        n = 0;
3092        break;
3093    default:
3094#if TARGET_PHYS_ADDR_BITS > 32
3095        n = strtoull(pch, &p, 0);
3096#else
3097        n = strtoul(pch, &p, 0);
3098#endif
3099        if (pch == p) {
3100            expr_error(mon, "invalid char in expression");
3101        }
3102        pch = p;
3103        while (qemu_isspace(*pch))
3104            pch++;
3105        break;
3106    }
3107    return n;
3108}
3109
3110
3111static int64_t expr_prod(Monitor *mon)
3112{
3113    int64_t val, val2;
3114    int op;
3115
3116    val = expr_unary(mon);
3117    for(;;) {
3118        op = *pch;
3119        if (op != '*' && op != '/' && op != '%')
3120            break;
3121        next();
3122        val2 = expr_unary(mon);
3123        switch(op) {
3124        default:
3125        case '*':
3126            val *= val2;
3127            break;
3128        case '/':
3129        case '%':
3130            if (val2 == 0)
3131                expr_error(mon, "division by zero");
3132            if (op == '/')
3133                val /= val2;
3134            else
3135                val %= val2;
3136            break;
3137        }
3138    }
3139    return val;
3140}
3141
3142static int64_t expr_logic(Monitor *mon)
3143{
3144    int64_t val, val2;
3145    int op;
3146
3147    val = expr_prod(mon);
3148    for(;;) {
3149        op = *pch;
3150        if (op != '&' && op != '|' && op != '^')
3151            break;
3152        next();
3153        val2 = expr_prod(mon);
3154        switch(op) {
3155        default:
3156        case '&':
3157            val &= val2;
3158            break;
3159        case '|':
3160            val |= val2;
3161            break;
3162        case '^':
3163            val ^= val2;
3164            break;
3165        }
3166    }
3167    return val;
3168}
3169
3170static int64_t expr_sum(Monitor *mon)
3171{
3172    int64_t val, val2;
3173    int op;
3174
3175    val = expr_logic(mon);
3176    for(;;) {
3177        op = *pch;
3178        if (op != '+' && op != '-')
3179            break;
3180        next();
3181        val2 = expr_logic(mon);
3182        if (op == '+')
3183            val += val2;
3184        else
3185            val -= val2;
3186    }
3187    return val;
3188}
3189
3190static int get_expr(Monitor *mon, int64_t *pval, const char **pp)
3191{
3192    pch = *pp;
3193    if (setjmp(expr_env)) {
3194        *pp = pch;
3195        return -1;
3196    }
3197    while (qemu_isspace(*pch))
3198        pch++;
3199    *pval = expr_sum(mon);
3200    *pp = pch;
3201    return 0;
3202}
3203
3204static int get_str(char *buf, int buf_size, const char **pp)
3205{
3206    const char *p;
3207    char *q;
3208    int c;
3209
3210    q = buf;
3211    p = *pp;
3212    while (qemu_isspace(*p))
3213        p++;
3214    if (*p == '\0') {
3215    fail:
3216        *q = '\0';
3217        *pp = p;
3218        return -1;
3219    }
3220    if (*p == '\"') {
3221        p++;
3222        while (*p != '\0' && *p != '\"') {
3223            if (*p == '\\') {
3224                p++;
3225                c = *p++;
3226                switch(c) {
3227                case 'n':
3228                    c = '\n';
3229                    break;
3230                case 'r':
3231                    c = '\r';
3232                    break;
3233                case '\\':
3234                case '\'':
3235                case '\"':
3236                    break;
3237                default:
3238                    qemu_printf("unsupported escape code: '\\%c'\n", c);
3239                    goto fail;
3240                }
3241                if ((q - buf) < buf_size - 1) {
3242                    *q++ = c;
3243                }
3244            } else {
3245                if ((q - buf) < buf_size - 1) {
3246                    *q++ = *p;
3247                }
3248                p++;
3249            }
3250        }
3251        if (*p != '\"') {
3252            qemu_printf("unterminated string\n");
3253            goto fail;
3254        }
3255        p++;
3256    } else {
3257        while (*p != '\0' && !qemu_isspace(*p)) {
3258            if ((q - buf) < buf_size - 1) {
3259                *q++ = *p;
3260            }
3261            p++;
3262        }
3263    }
3264    *q = '\0';
3265    *pp = p;
3266    return 0;
3267}
3268
3269/*
3270 * Store the command-name in cmdname, and return a pointer to
3271 * the remaining of the command string.
3272 */
3273static const char *get_command_name(const char *cmdline,
3274                                    char *cmdname, size_t nlen)
3275{
3276    size_t len;
3277    const char *p, *pstart;
3278
3279    p = cmdline;
3280    while (qemu_isspace(*p))
3281        p++;
3282    if (*p == '\0')
3283        return NULL;
3284    pstart = p;
3285    while (*p != '\0' && *p != '/' && !qemu_isspace(*p))
3286        p++;
3287    len = p - pstart;
3288    if (len > nlen - 1)
3289        len = nlen - 1;
3290    memcpy(cmdname, pstart, len);
3291    cmdname[len] = '\0';
3292    return p;
3293}
3294
3295/**
3296 * Read key of 'type' into 'key' and return the current
3297 * 'type' pointer.
3298 */
3299static char *key_get_info(const char *type, char **key)
3300{
3301    size_t len;
3302    char *p, *str;
3303
3304    if (*type == ',')
3305        type++;
3306
3307    p = strchr(type, ':');
3308    if (!p) {
3309        *key = NULL;
3310        return NULL;
3311    }
3312    len = p - type;
3313
3314    str = qemu_malloc(len + 1);
3315    memcpy(str, type, len);
3316    str[len] = '\0';
3317
3318    *key = str;
3319    return ++p;
3320}
3321
3322static int default_fmt_format = 'x';
3323static int default_fmt_size = 4;
3324
3325#define MAX_ARGS 16
3326
3327static int is_valid_option(const char *c, const char *typestr)
3328{
3329    char option[3];
3330  
3331    option[0] = '-';
3332    option[1] = *c;
3333    option[2] = '\0';
3334  
3335    typestr = strstr(typestr, option);
3336    return (typestr != NULL);
3337}
3338
3339static const mon_cmd_t *monitor_find_command(const char *cmdname)
3340{
3341    const mon_cmd_t *cmd;
3342
3343    for (cmd = mon_cmds; cmd->name != NULL; cmd++) {
3344        if (compare_cmd(cmdname, cmd->name)) {
3345            return cmd;
3346        }
3347    }
3348
3349    return NULL;
3350}
3351
3352static const mon_cmd_t *monitor_parse_command(Monitor *mon,
3353                                              const char *cmdline,
3354                                              QDict *qdict)
3355{
3356    const char *p, *typestr;
3357    int c;
3358    const mon_cmd_t *cmd;
3359    char cmdname[256];
3360    char buf[1024];
3361    char *key;
3362
3363#ifdef DEBUG
3364    monitor_printf(mon, "command='%s'\n", cmdline);
3365#endif
3366
3367    /* extract the command name */
3368    p = get_command_name(cmdline, cmdname, sizeof(cmdname));
3369    if (!p)
3370        return NULL;
3371
3372    cmd = monitor_find_command(cmdname);
3373    if (!cmd) {
3374        monitor_printf(mon, "unknown command: '%s'\n", cmdname);
3375        return NULL;
3376    }
3377
3378    /* parse the parameters */
3379    typestr = cmd->args_type;
3380    for(;;) {
3381        typestr = key_get_info(typestr, &key);
3382        if (!typestr)
3383            break;
3384        c = *typestr;
3385        typestr++;
3386        switch(c) {
3387        case 'F':
3388        case 'B':
3389        case 's':
3390            {
3391                int ret;
3392
3393                while (qemu_isspace(*p))
3394                    p++;
3395                if (*typestr == '?') {
3396                    typestr++;
3397                    if (*p == '\0') {
3398                        /* no optional string: NULL argument */
3399                        break;
3400                    }
3401                }
3402                ret = get_str(buf, sizeof(buf), &p);
3403                if (ret < 0) {
3404                    switch(c) {
3405                    case 'F':
3406                        monitor_printf(mon, "%s: filename expected\n",
3407                                       cmdname);
3408                        break;
3409                    case 'B':
3410                        monitor_printf(mon, "%s: block device name expected\n",
3411                                       cmdname);
3412                        break;
3413                    default:
3414                        monitor_printf(mon, "%s: string expected\n", cmdname);
3415                        break;
3416                    }
3417                    goto fail;
3418                }
3419                qdict_put(qdict, key, qstring_from_str(buf));
3420            }
3421            break;
3422        case '/':
3423            {
3424                int count, format, size;
3425
3426                while (qemu_isspace(*p))
3427                    p++;
3428                if (*p == '/') {
3429                    /* format found */
3430                    p++;
3431                    count = 1;
3432                    if (qemu_isdigit(*p)) {
3433                        count = 0;
3434                        while (qemu_isdigit(*p)) {
3435                            count = count * 10 + (*p - '0');
3436                            p++;
3437                        }
3438                    }
3439                    size = -1;
3440                    format = -1;
3441                    for(;;) {
3442                        switch(*p) {
3443                        case 'o':
3444                        case 'd':
3445                        case 'u':
3446                        case 'x':
3447                        case 'i':
3448                        case 'c':
3449                            format = *p++;
3450                            break;
3451                        case 'b':
3452                            size = 1;
3453                            p++;
3454                            break;
3455                        case 'h':
3456                            size = 2;
3457                            p++;
3458                            break;
3459                        case 'w':
3460                            size = 4;
3461                            p++;
3462                            break;
3463                        case 'g':
3464                        case 'L':
3465                            size = 8;
3466                            p++;
3467                            break;
3468                        default:
3469                            goto next;
3470                        }
3471                    }
3472                next:
3473                    if (*p != '\0' && !qemu_isspace(*p)) {
3474                        monitor_printf(mon, "invalid char in format: '%c'\n",
3475                                       *p);
3476                        goto fail;
3477                    }
3478                    if (format < 0)
3479                        format = default_fmt_format;
3480                    if (format != 'i') {
3481                        /* for 'i', not specifying a size gives -1 as size */
3482                        if (size < 0)
3483                            size = default_fmt_size;
3484                        default_fmt_size = size;
3485                    }
3486                    default_fmt_format = format;
3487                } else {
3488                    count = 1;
3489                    format = default_fmt_format;
3490                    if (format != 'i') {
3491                        size = default_fmt_size;
3492                    } else {
3493                        size = -1;
3494                    }
3495                }
3496                qdict_put(qdict, "count", qint_from_int(count));
3497                qdict_put(qdict, "format", qint_from_int(format));
3498                qdict_put(qdict, "size", qint_from_int(size));
3499            }
3500            break;
3501        case 'i':
3502        case 'l':
3503        case 'M':
3504            {
3505                int64_t val;
3506
3507                while (qemu_isspace(*p))
3508                    p++;
3509                if (*typestr == '?' || *typestr == '.') {
3510                    if (*typestr == '?') {
3511                        if (*p == '\0') {
3512                            typestr++;
3513                            break;
3514                        }
3515                    } else {
3516                        if (*p == '.') {
3517                            p++;
3518                            while (qemu_isspace(*p))
3519                                p++;
3520                        } else {
3521                            typestr++;
3522                            break;
3523                        }
3524                    }
3525                    typestr++;
3526                }
3527                if (get_expr(mon, &val, &p))
3528                    goto fail;
3529                /* Check if 'i' is greater than 32-bit */
3530                if ((c == 'i') && ((val >> 32) & 0xffffffff)) {
3531                    monitor_printf(mon, "\'%s\' has failed: ", cmdname);
3532                    monitor_printf(mon, "integer is for 32-bit values\n");
3533                    goto fail;
3534                } else if (c == 'M') {
3535                    val <<= 20;
3536                }
3537                qdict_put(qdict, key, qint_from_int(val));
3538            }
3539            break;
3540        case '-':
3541            {
3542                const char *tmp = p;
3543                int has_option, skip_key = 0;
3544                /* option */
3545
3546                c = *typestr++;
3547                if (c == '\0')
3548                    goto bad_type;
3549                while (qemu_isspace(*p))
3550                    p++;
3551                has_option = 0;
3552                if (*p == '-') {
3553                    p++;
3554                    if(c != *p) {
3555                        if(!is_valid_option(p, typestr)) {
3556                  
3557                            monitor_printf(mon, "%s: unsupported option -%c\n",
3558                                           cmdname, *p);
3559                            goto fail;
3560                        } else {
3561                            skip_key = 1;
3562                        }
3563                    }
3564                    if(skip_key) {
3565                        p = tmp;
3566                    } else {
3567                        p++;
3568                        has_option = 1;
3569                    }
3570                }
3571                qdict_put(qdict, key, qint_from_int(has_option));
3572            }
3573            break;
3574        default:
3575        bad_type:
3576            monitor_printf(mon, "%s: unknown type '%c'\n", cmdname, c);
3577            goto fail;
3578        }
3579        qemu_free(key);
3580        key = NULL;
3581    }
3582    /* check that all arguments were parsed */
3583    while (qemu_isspace(*p))
3584        p++;
3585    if (*p != '\0') {
3586        monitor_printf(mon, "%s: extraneous characters at the end of line\n",
3587                       cmdname);
3588        goto fail;
3589    }
3590
3591    return cmd;
3592
3593fail:
3594    qemu_free(key);
3595    return NULL;
3596}
3597
3598static void monitor_print_error(Monitor *mon)
3599{
3600    qerror_print(mon->error);
3601    QDECREF(mon->error);
3602    mon->error = NULL;
3603}
3604
3605static void monitor_call_handler(Monitor *mon, const mon_cmd_t *cmd,
3606                                 const QDict *params)
3607{
3608    QObject *data = NULL;
3609
3610    cmd->mhandler.cmd_new(mon, params, &data);
3611
3612    if (monitor_ctrl_mode(mon)) {
3613        /* Monitor Protocol */
3614        monitor_protocol_emitter(mon, data);
3615    } else {
3616        /* User Protocol */
3617         if (data)
3618            cmd->user_print(mon, data);
3619    }
3620
3621    qobject_decref(data);
3622}
3623
3624static void handle_user_command(Monitor *mon, const char *cmdline)
3625{
3626    QDict *qdict;
3627    const mon_cmd_t *cmd;
3628
3629    qdict = qdict_new();
3630
3631    cmd = monitor_parse_command(mon, cmdline, qdict);
3632    if (!cmd)
3633        goto out;
3634
3635    qemu_errors_to_mon(mon);
3636
3637    if (monitor_handler_ported(cmd)) {
3638        monitor_call_handler(mon, cmd, qdict);
3639    } else {
3640        cmd->mhandler.cmd(mon, qdict);
3641    }
3642
3643    if (monitor_has_error(mon))
3644        monitor_print_error(mon);
3645
3646    qemu_errors_to_previous();
3647
3648out:
3649    QDECREF(qdict);
3650}
3651
3652static void cmd_completion(const char *name, const char *list)
3653{
3654    const char *p, *pstart;
3655    char cmd[128];
3656    int len;
3657
3658    p = list;
3659    for(;;) {
3660        pstart = p;
3661        p = strchr(p, '|');
3662        if (!p)
3663            p = pstart + strlen(pstart);
3664        len = p - pstart;
3665        if (len > sizeof(cmd) - 2)
3666            len = sizeof(cmd) - 2;
3667        memcpy(cmd, pstart, len);
3668        cmd[len] = '\0';
3669        if (name[0] == '\0' || !strncmp(name, cmd, strlen(name))) {
3670            readline_add_completion(cur_mon->rs, cmd);
3671        }
3672        if (*p == '\0')
3673            break;
3674        p++;
3675    }
3676}
3677
3678static void file_completion(const char *input)
3679{
3680    DIR *ffs;
3681    struct dirent *d;
3682    char path[1024];
3683    char file[1024], file_prefix[1024];
3684    int input_path_len;
3685    const char *p;
3686
3687    p = strrchr(input, '/');
3688    if (!p) {
3689        input_path_len = 0;
3690        pstrcpy(file_prefix, sizeof(file_prefix), input);
3691        pstrcpy(path, sizeof(path), ".");
3692    } else {
3693        input_path_len = p - input + 1;
3694        memcpy(path, input, input_path_len);
3695        if (input_path_len > sizeof(path) - 1)
3696            input_path_len = sizeof(path) - 1;
3697        path[input_path_len] = '\0';
3698        pstrcpy(file_prefix, sizeof(file_prefix), p + 1);
3699    }
3700#ifdef DEBUG_COMPLETION
3701    monitor_printf(cur_mon, "input='%s' path='%s' prefix='%s'\n",
3702                   input, path, file_prefix);
3703#endif
3704    ffs = opendir(path);
3705    if (!ffs)
3706        return;
3707    for(;;) {
3708        struct stat sb;
3709        d = readdir(ffs);
3710        if (!d)
3711            break;
3712        if (strstart(d->d_name, file_prefix, NULL)) {
3713            memcpy(file, input, input_path_len);
3714            if (input_path_len < sizeof(file))
3715                pstrcpy(file + input_path_len, sizeof(file) - input_path_len,
3716                        d->d_name);
3717            /* stat the file to find out if it's a directory.
3718             * In that case add a slash to speed up typing long paths
3719             */
3720            stat(file, &sb);
3721            if(S_ISDIR(sb.st_mode))
3722                pstrcat(file, sizeof(file), "/");
3723            readline_add_completion(cur_mon->rs, file);
3724        }
3725    }
3726    closedir(ffs);
3727}
3728
3729static void block_completion_it(void *opaque, BlockDriverState *bs)
3730{
3731    const char *name = bdrv_get_device_name(bs);
3732    const char *input = opaque;
3733
3734    if (input[0] == '\0' ||
3735        !strncmp(name, (char *)input, strlen(input))) {
3736        readline_add_completion(cur_mon->rs, name);
3737    }
3738}
3739
3740/* NOTE: this parser is an approximate form of the real command parser */
3741static void parse_cmdline(const char *cmdline,
3742                         int *pnb_args, char **args)
3743{
3744    const char *p;
3745    int nb_args, ret;
3746    char buf[1024];
3747
3748    p = cmdline;
3749    nb_args = 0;
3750    for(;;) {
3751        while (qemu_isspace(*p))
3752            p++;
3753        if (*p == '\0')
3754            break;
3755        if (nb_args >= MAX_ARGS)
3756            break;
3757        ret = get_str(buf, sizeof(buf), &p);
3758        args[nb_args] = qemu_strdup(buf);
3759        nb_args++;
3760        if (ret < 0)
3761            break;
3762    }
3763    *pnb_args = nb_args;
3764}
3765
3766static const char *next_arg_type(const char *typestr)
3767{
3768    const char *p = strchr(typestr, ':');
3769    return (p != NULL ? ++p : typestr);
3770}
3771
3772static void monitor_find_completion(const char *cmdline)
3773{
3774    const char *cmdname;
3775    char *args[MAX_ARGS];
3776    int nb_args, i, len;
3777    const char *ptype, *str;
3778    const mon_cmd_t *cmd;
3779    const KeyDef *key;
3780
3781    parse_cmdline(cmdline, &nb_args, args);
3782#ifdef DEBUG_COMPLETION
3783    for(i = 0; i < nb_args; i++) {
3784        monitor_printf(cur_mon, "arg%d = '%s'\n", i, (char *)args[i]);
3785    }
3786#endif
3787
3788    /* if the line ends with a space, it means we want to complete the
3789       next arg */
3790    len = strlen(cmdline);
3791    if (len > 0 && qemu_isspace(cmdline[len - 1])) {
3792        if (nb_args >= MAX_ARGS)
3793            return;
3794        args[nb_args++] = qemu_strdup("");
3795    }
3796    if (nb_args <= 1) {
3797        /* command completion */
3798        if (nb_args == 0)
3799            cmdname = "";
3800        else
3801            cmdname = args[0];
3802        readline_set_completion_index(cur_mon->rs, strlen(cmdname));
3803        for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
3804            cmd_completion(cmdname, cmd->name);
3805        }
3806    } else {
3807        /* find the command */
3808        for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
3809            if (compare_cmd(args[0], cmd->name))
3810                goto found;
3811        }
3812        return;
3813    found:
3814        ptype = next_arg_type(cmd->args_type);
3815        for(i = 0; i < nb_args - 2; i++) {
3816            if (*ptype != '\0') {
3817                ptype = next_arg_type(ptype);
3818                while (*ptype == '?')
3819                    ptype = next_arg_type(ptype);
3820            }
3821        }
3822        str = args[nb_args - 1];
3823        if (*ptype == '-' && ptype[1] != '\0') {
3824            ptype += 2;
3825        }
3826        switch(*ptype) {
3827        case 'F':
3828            /* file completion */
3829            readline_set_completion_index(cur_mon->rs, strlen(str));
3830            file_completion(str);
3831            break;
3832        case 'B':
3833            /* block device name completion */
3834            readline_set_completion_index(cur_mon->rs, strlen(str));
3835            bdrv_iterate(block_completion_it, (void *)str);
3836            break;
3837        case 's':
3838            /* XXX: more generic ? */
3839            if (!strcmp(cmd->name, "info")) {
3840                readline_set_completion_index(cur_mon->rs, strlen(str));
3841                for(cmd = info_cmds; cmd->name != NULL; cmd++) {
3842                    cmd_completion(str, cmd->name);
3843                }
3844            } else if (!strcmp(cmd->name, "sendkey")) {
3845                char *sep = strrchr(str, '-');
3846                if (sep)
3847                    str = sep + 1;
3848                readline_set_completion_index(cur_mon->rs, strlen(str));
3849                for(key = key_defs; key->name != NULL; key++) {
3850                    cmd_completion(str, key->name);
3851                }
3852            } else if (!strcmp(cmd->name, "help|?")) {
3853                readline_set_completion_index(cur_mon->rs, strlen(str));
3854                for (cmd = mon_cmds; cmd->name != NULL; cmd++) {
3855                    cmd_completion(str, cmd->name);
3856                }
3857            }
3858            break;
3859        default:
3860            break;
3861        }
3862    }
3863    for(i = 0; i < nb_args; i++)
3864        qemu_free(args[i]);
3865}
3866
3867static int monitor_can_read(void *opaque)
3868{
3869    Monitor *mon = opaque;
3870
3871    return (mon->suspend_cnt == 0) ? 1 : 0;
3872}
3873
3874typedef struct CmdArgs {
3875    QString *name;
3876    int type;
3877    int flag;
3878    int optional;
3879} CmdArgs;
3880
3881static int check_opt(const CmdArgs *cmd_args, const char *name, QDict *args)
3882{
3883    if (!cmd_args->optional) {
3884        qemu_error_new(QERR_MISSING_PARAMETER, name);
3885        return -1;
3886    }
3887
3888    if (cmd_args->type == '-') {
3889        /* handlers expect a value, they need to be changed */
3890        qdict_put(args, name, qint_from_int(0));
3891    }
3892
3893    return 0;
3894}
3895
3896static int check_arg(const CmdArgs *cmd_args, QDict *args)
3897{
3898    QObject *value;
3899    const char *name;
3900
3901    name = qstring_get_str(cmd_args->name);
3902
3903    if (!args) {
3904        return check_opt(cmd_args, name, args);
3905    }
3906
3907    value = qdict_get(args, name);
3908    if (!value) {
3909        return check_opt(cmd_args, name, args);
3910    }
3911
3912    switch (cmd_args->type) {
3913        case 'F':
3914        case 'B':
3915        case 's':
3916            if (qobject_type(value) != QTYPE_QSTRING) {
3917                qemu_error_new(QERR_INVALID_PARAMETER_TYPE, name, "string");
3918                return -1;
3919            }
3920            break;
3921        case '/': {
3922            int i;
3923            const char *keys[] = { "count", "format", "size", NULL };
3924
3925            for (i = 0; keys[i]; i++) {
3926                QObject *obj = qdict_get(args, keys[i]);
3927                if (!obj) {
3928                    qemu_error_new(QERR_MISSING_PARAMETER, name);
3929                    return -1;
3930                }
3931                if (qobject_type(obj) != QTYPE_QINT) {
3932                    qemu_error_new(QERR_INVALID_PARAMETER_TYPE, name, "int");
3933                    return -1;
3934                }
3935            }
3936            break;
3937        }
3938        case 'i':
3939        case 'l':
3940        case 'M':
3941            if (qobject_type(value) != QTYPE_QINT) {
3942                qemu_error_new(QERR_INVALID_PARAMETER_TYPE, name, "int");
3943                return -1;
3944            }
3945            break;
3946        case '-':
3947            if (qobject_type(value) != QTYPE_QINT &&
3948                qobject_type(value) != QTYPE_QBOOL) {
3949                qemu_error_new(QERR_INVALID_PARAMETER_TYPE, name, "bool");
3950                return -1;
3951            }
3952            if (qobject_type(value) == QTYPE_QBOOL) {
3953                /* handlers expect a QInt, they need to be changed */
3954                qdict_put(args, name,
3955                         qint_from_int(qbool_get_int(qobject_to_qbool(value))));
3956            }
3957            break;
3958        default:
3959            /* impossible */
3960            abort();
3961    }
3962
3963    return 0;
3964}
3965
3966static void cmd_args_init(CmdArgs *cmd_args)
3967{
3968    cmd_args->name = qstring_new();
3969    cmd_args->type = cmd_args->flag = cmd_args->optional = 0;
3970}
3971
3972/*
3973 * This is not trivial, we have to parse Monitor command's argument
3974 * type syntax to be able to check the arguments provided by clients.
3975 *
3976 * In the near future we will be using an array for that and will be
3977 * able to drop all this parsing...
3978 */
3979static int monitor_check_qmp_args(const mon_cmd_t *cmd, QDict *args)
3980{
3981    int err;
3982    const char *p;
3983    CmdArgs cmd_args;
3984
3985    if (cmd->args_type == NULL) {
3986        return (qdict_size(args) == 0 ? 0 : -1);
3987    }
3988
3989    err = 0;
3990    cmd_args_init(&cmd_args);
3991
3992    for (p = cmd->args_type;; p++) {
3993        if (*p == ':') {
3994            cmd_args.type = *++p;
3995            p++;
3996            if (cmd_args.type == '-') {
3997                cmd_args.flag = *p++;
3998                cmd_args.optional = 1;
3999            } else if (*p == '?') {
4000                cmd_args.optional = 1;
4001                p++;
4002            }
4003
4004            assert(*p == ',' || *p == '\0');
4005            err = check_arg(&cmd_args, args);
4006
4007            QDECREF(cmd_args.name);
4008            cmd_args_init(&cmd_args);
4009
4010            if (err < 0) {
4011                break;
4012            }
4013        } else {
4014            qstring_append_chr(cmd_args.name, *p);
4015        }
4016
4017        if (*p == '\0') {
4018            break;
4019        }
4020    }
4021
4022    QDECREF(cmd_args.name);
4023    return err;
4024}
4025
4026static void handle_qmp_command(JSONMessageParser *parser, QList *tokens)
4027{
4028    int err;
4029    QObject *obj;
4030    QDict *input, *args;
4031    const mon_cmd_t *cmd;
4032    Monitor *mon = cur_mon;
4033    const char *cmd_name, *info_item;
4034
4035    args = NULL;
4036    qemu_errors_to_mon(mon);
4037
4038    obj = json_parser_parse(tokens, NULL);
4039    if (!obj) {
4040        // FIXME: should be triggered in json_parser_parse()
4041        qemu_error_new(QERR_JSON_PARSING);
4042        goto err_out;
4043    } else if (qobject_type(obj) != QTYPE_QDICT) {
4044        qemu_error_new(QERR_QMP_BAD_INPUT_OBJECT, "object");
4045        qobject_decref(obj);
4046        goto err_out;
4047    }
4048
4049    input = qobject_to_qdict(obj);
4050
4051    mon->mc->id = qdict_get(input, "id");
4052    qobject_incref(mon->mc->id);
4053
4054    obj = qdict_get(input, "execute");
4055    if (!obj) {
4056        qemu_error_new(QERR_QMP_BAD_INPUT_OBJECT, "execute");
4057        goto err_input;
4058    } else if (qobject_type(obj) != QTYPE_QSTRING) {
4059        qemu_error_new(QERR_QMP_BAD_INPUT_OBJECT, "string");
4060        goto err_input;
4061    }
4062
4063    cmd_name = qstring_get_str(qobject_to_qstring(obj));
4064
4065    /*
4066     * XXX: We need this special case until we get info handlers
4067     * converted into 'query-' commands
4068     */
4069    if (compare_cmd(cmd_name, "info")) {
4070        qemu_error_new(QERR_COMMAND_NOT_FOUND, cmd_name);
4071        goto err_input;
4072    } else if (strstart(cmd_name, "query-", &info_item)) {
4073        cmd = monitor_find_command("info");
4074        qdict_put_obj(input, "arguments",
4075                      qobject_from_jsonf("{ 'item': %s }", info_item));
4076    } else {
4077        cmd = monitor_find_command(cmd_name);
4078        if (!cmd || !monitor_handler_ported(cmd)) {
4079            qemu_error_new(QERR_COMMAND_NOT_FOUND, cmd_name);
4080            goto err_input;
4081        }
4082    }
4083
4084    obj = qdict_get(input, "arguments");
4085    if (!obj) {
4086        args = qdict_new();
4087    } else {
4088        args = qobject_to_qdict(obj);
4089        QINCREF(args);
4090    }
4091
4092    QDECREF(input);
4093
4094    err = monitor_check_qmp_args(cmd, args);
4095    if (err < 0) {
4096        goto err_out;
4097    }
4098
4099    monitor_call_handler(mon, cmd, args);
4100    goto out;
4101
4102err_input:
4103    QDECREF(input);
4104err_out:
4105    monitor_protocol_emitter(mon, NULL);
4106out:
4107    QDECREF(args);
4108    qemu_errors_to_previous();
4109}
4110
4111/**
4112 * monitor_control_read(): Read and handle QMP input
4113 */
4114static void monitor_control_read(void *opaque, const uint8_t *buf, int size)
4115{
4116    Monitor *old_mon = cur_mon;
4117
4118    cur_mon = opaque;
4119
4120    json_message_parser_feed(&cur_mon->mc->parser, (const char *) buf, size);
4121
4122    cur_mon = old_mon;
4123}
4124
4125static void monitor_read(void *opaque, const uint8_t *buf, int size)
4126{
4127    Monitor *old_mon = cur_mon;
4128    int i;
4129
4130    cur_mon = opaque;
4131
4132    if (cur_mon->rs) {
4133        for (i = 0; i < size; i++)
4134            readline_handle_byte(cur_mon->rs, buf[i]);
4135    } else {
4136        if (size == 0 || buf[size - 1] != 0)
4137            monitor_printf(cur_mon, "corrupted command\n");
4138        else
4139            handle_user_command(cur_mon, (char *)buf);
4140    }
4141
4142    cur_mon = old_mon;
4143}
4144
4145static void monitor_command_cb(Monitor *mon, const char *cmdline, void *opaque)
4146{
4147    monitor_suspend(mon);
4148    handle_user_command(mon, cmdline);
4149    monitor_resume(mon);
4150}
4151
4152int monitor_suspend(Monitor *mon)
4153{
4154    if (!mon->rs)
4155        return -ENOTTY;
4156    mon->suspend_cnt++;
4157    return 0;
4158}
4159
4160void monitor_resume(Monitor *mon)
4161{
4162    if (!mon->rs)
4163        return;
4164    if (--mon->suspend_cnt == 0)
4165        readline_show_prompt(mon->rs);
4166}
4167
4168/**
4169 * monitor_control_event(): Print QMP gretting
4170 */
4171static void monitor_control_event(void *opaque, int event)
4172{
4173    if (event == CHR_EVENT_OPENED) {
4174        QObject *data;
4175        Monitor *mon = opaque;
4176
4177        json_message_parser_init(&mon->mc->parser, handle_qmp_command);
4178
4179        data = qobject_from_jsonf("{ 'QMP': { 'capabilities': [] } }");
4180        assert(data != NULL);
4181
4182        monitor_json_emitter(mon, data);
4183        qobject_decref(data);
4184    }
4185}
4186
4187static void monitor_event(void *opaque, int event)
4188{
4189    Monitor *mon = opaque;
4190
4191    switch (event) {
4192    case CHR_EVENT_MUX_IN:
4193        mon->mux_out = 0;
4194        if (mon->reset_seen) {
4195            readline_restart(mon->rs);
4196            monitor_resume(mon);
4197            monitor_flush(mon);
4198        } else {
4199            mon->suspend_cnt = 0;
4200        }
4201        break;
4202
4203    case CHR_EVENT_MUX_OUT:
4204        if (mon->reset_seen) {
4205            if (mon->suspend_cnt == 0) {
4206                monitor_printf(mon, "\n");
4207            }
4208            monitor_flush(mon);
4209            monitor_suspend(mon);
4210        } else {
4211            mon->suspend_cnt++;
4212        }
4213        mon->mux_out = 1;
4214        break;
4215
4216    case CHR_EVENT_OPENED:
4217        monitor_printf(mon, "QEMU %s monitor - type 'help' for more "
4218                       "information\n", QEMU_VERSION);
4219        if (!mon->mux_out) {
4220            readline_show_prompt(mon->rs);
4221        }
4222        mon->reset_seen = 1;
4223        break;
4224    }
4225}
4226
4227
4228/*
4229 * Local variables:
4230 *  c-indent-level: 4
4231 *  c-basic-offset: 4
4232 *  tab-width: 8
4233 * End:
4234 */
4235
4236void monitor_init(CharDriverState *chr, int flags)
4237{
4238    static int is_first_init = 1;
4239    Monitor *mon;
4240
4241    if (is_first_init) {
4242        key_timer = qemu_new_timer(vm_clock, release_keys, NULL);
4243        is_first_init = 0;
4244    }
4245
4246    mon = qemu_mallocz(sizeof(*mon));
4247
4248    mon->chr = chr;
4249    mon->flags = flags;
4250    if (flags & MONITOR_USE_READLINE) {
4251        mon->rs = readline_init(mon, monitor_find_completion);
4252        monitor_read_command(mon, 0);
4253    }
4254
4255    if (monitor_ctrl_mode(mon)) {
4256        mon->mc = qemu_mallocz(sizeof(MonitorControl));
4257        /* Control mode requires special handlers */
4258        qemu_chr_add_handlers(chr, monitor_can_read, monitor_control_read,
4259                              monitor_control_event, mon);
4260    } else {
4261        qemu_chr_add_handlers(chr, monitor_can_read, monitor_read,
4262                              monitor_event, mon);
4263    }
4264
4265    QLIST_INSERT_HEAD(&mon_list, mon, entry);
4266    if (!cur_mon || (flags & MONITOR_IS_DEFAULT))
4267        cur_mon = mon;
4268}
4269
4270static void bdrv_password_cb(Monitor *mon, const char *password, void *opaque)
4271{
4272    BlockDriverState *bs = opaque;
4273    int ret = 0;
4274
4275    if (bdrv_set_key(bs, password) != 0) {
4276        monitor_printf(mon, "invalid password\n");
4277        ret = -EPERM;
4278    }
4279    if (mon->password_completion_cb)
4280        mon->password_completion_cb(mon->password_opaque, ret);
4281
4282    monitor_read_command(mon, 1);
4283}
4284
4285void monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs,
4286                                 BlockDriverCompletionFunc *completion_cb,
4287                                 void *opaque)
4288{
4289    int err;
4290
4291    if (!bdrv_key_required(bs)) {
4292        if (completion_cb)
4293            completion_cb(opaque, 0);
4294        return;
4295    }
4296
4297    if (monitor_ctrl_mode(mon)) {
4298        qemu_error_new(QERR_DEVICE_ENCRYPTED, bdrv_get_device_name(bs));
4299        return;
4300    }
4301
4302    monitor_printf(mon, "%s (%s) is encrypted.\n", bdrv_get_device_name(bs),
4303                   bdrv_get_encrypted_filename(bs));
4304
4305    mon->password_completion_cb = completion_cb;
4306    mon->password_opaque = opaque;
4307
4308    err = monitor_read_password(mon, bdrv_password_cb, bs);
4309
4310    if (err && completion_cb)
4311        completion_cb(opaque, err);
4312}
4313
4314typedef struct QemuErrorSink QemuErrorSink;
4315struct QemuErrorSink {
4316    enum {
4317        ERR_SINK_FILE,
4318        ERR_SINK_MONITOR,
4319    } dest;
4320    union {
4321        FILE    *fp;
4322        Monitor *mon;
4323    };
4324    QemuErrorSink *previous;
4325};
4326
4327static QemuErrorSink *qemu_error_sink;
4328
4329void qemu_errors_to_file(FILE *fp)
4330{
4331    QemuErrorSink *sink;
4332
4333    sink = qemu_mallocz(sizeof(*sink));
4334    sink->dest = ERR_SINK_FILE;
4335    sink->fp = fp;
4336    sink->previous = qemu_error_sink;
4337    qemu_error_sink = sink;
4338}
4339
4340void qemu_errors_to_mon(Monitor *mon)
4341{
4342    QemuErrorSink *sink;
4343
4344    sink = qemu_mallocz(sizeof(*sink));
4345    sink->dest = ERR_SINK_MONITOR;
4346    sink->mon = mon;
4347    sink->previous = qemu_error_sink;
4348    qemu_error_sink = sink;
4349}
4350
4351void qemu_errors_to_previous(void)
4352{
4353    QemuErrorSink *sink;
4354
4355    assert(qemu_error_sink != NULL);
4356    sink = qemu_error_sink;
4357    qemu_error_sink = sink->previous;
4358    qemu_free(sink);
4359}
4360
4361void qemu_error(const char *fmt, ...)
4362{
4363    va_list args;
4364
4365    assert(qemu_error_sink != NULL);
4366    switch (qemu_error_sink->dest) {
4367    case ERR_SINK_FILE:
4368        va_start(args, fmt);
4369        vfprintf(qemu_error_sink->fp, fmt, args);
4370        va_end(args);
4371        break;
4372    case ERR_SINK_MONITOR:
4373        va_start(args, fmt);
4374        monitor_vprintf(qemu_error_sink->mon, fmt, args);
4375        va_end(args);
4376        break;
4377    }
4378}
4379
4380void qemu_error_internal(const char *file, int linenr, const char *func,
4381                         const char *fmt, ...)
4382{
4383    va_list va;
4384    QError *qerror;
4385
4386    assert(qemu_error_sink != NULL);
4387
4388    va_start(va, fmt);
4389    qerror = qerror_from_info(file, linenr, func, fmt, &va);
4390    va_end(va);
4391
4392    switch (qemu_error_sink->dest) {
4393    case ERR_SINK_FILE:
4394        qerror_print(qerror);
4395        QDECREF(qerror);
4396        break;
4397    case ERR_SINK_MONITOR:
4398        assert(qemu_error_sink->mon->error == NULL);
4399        qemu_error_sink->mon->error = qerror;
4400        break;
4401    }
4402}
4403