Statistics
| Branch: | Revision:

root / monitor.c @ e1a068b2

History | View | Annotate | Download (120.6 kB)

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 "blockdev.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 "qfloat.h"
51
#include "qlist.h"
52
#include "qbool.h"
53
#include "qstring.h"
54
#include "qjson.h"
55
#include "json-streamer.h"
56
#include "json-parser.h"
57
#include "osdep.h"
58
#include "exec-all.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
 * 'O'          option string of the form NAME=VALUE,...
70
 *              parsed according to QemuOptsList given by its name
71
 *              Example: 'device:O' uses qemu_device_opts.
72
 *              Restriction: only lists with empty desc are supported
73
 *              TODO lift the restriction
74
 * 'i'          32 bit integer
75
 * 'l'          target long (32 or 64 bit)
76
 * 'M'          just like 'l', except in user mode the value is
77
 *              multiplied by 2^20 (think Mebibyte)
78
 * 'f'          double
79
 *              user mode accepts an optional G, g, M, m, K, k suffix,
80
 *              which multiplies the value by 2^30 for suffixes G and
81
 *              g, 2^20 for M and m, 2^10 for K and k
82
 * 'T'          double
83
 *              user mode accepts an optional ms, us, ns suffix,
84
 *              which divides the value by 1e3, 1e6, 1e9, respectively
85
 * '/'          optional gdb-like print format (like "/10x")
86
 *
87
 * '?'          optional type (for all types, except '/')
88
 * '.'          other form of optional type (for 'i' and 'l')
89
 * 'b'          boolean
90
 *              user mode accepts "on" or "off"
91
 * '-'          optional parameter (eg. '-f')
92
 *
93
 */
94

    
95
typedef struct MonitorCompletionData MonitorCompletionData;
96
struct MonitorCompletionData {
97
    Monitor *mon;
98
    void (*user_print)(Monitor *mon, const QObject *data);
99
};
100

    
101
typedef struct mon_cmd_t {
102
    const char *name;
103
    const char *args_type;
104
    const char *params;
105
    const char *help;
106
    void (*user_print)(Monitor *mon, const QObject *data);
107
    union {
108
        void (*info)(Monitor *mon);
109
        void (*info_new)(Monitor *mon, QObject **ret_data);
110
        int  (*info_async)(Monitor *mon, MonitorCompletion *cb, void *opaque);
111
        void (*cmd)(Monitor *mon, const QDict *qdict);
112
        int  (*cmd_new)(Monitor *mon, const QDict *params, QObject **ret_data);
113
        int  (*cmd_async)(Monitor *mon, const QDict *params,
114
                          MonitorCompletion *cb, void *opaque);
115
    } mhandler;
116
    int flags;
117
} mon_cmd_t;
118

    
119
/* file descriptors passed via SCM_RIGHTS */
120
typedef struct mon_fd_t mon_fd_t;
121
struct mon_fd_t {
122
    char *name;
123
    int fd;
124
    QLIST_ENTRY(mon_fd_t) next;
125
};
126

    
127
typedef struct MonitorControl {
128
    QObject *id;
129
    JSONMessageParser parser;
130
    int command_mode;
131
} MonitorControl;
132

    
133
struct Monitor {
134
    CharDriverState *chr;
135
    int mux_out;
136
    int reset_seen;
137
    int flags;
138
    int suspend_cnt;
139
    uint8_t outbuf[1024];
140
    int outbuf_index;
141
    ReadLineState *rs;
142
    MonitorControl *mc;
143
    CPUState *mon_cpu;
144
    BlockDriverCompletionFunc *password_completion_cb;
145
    void *password_opaque;
146
#ifdef CONFIG_DEBUG_MONITOR
147
    int print_calls_nr;
148
#endif
149
    QError *error;
150
    QLIST_HEAD(,mon_fd_t) fds;
151
    QLIST_ENTRY(Monitor) entry;
152
};
153

    
154
#ifdef CONFIG_DEBUG_MONITOR
155
#define MON_DEBUG(fmt, ...) do {    \
156
    fprintf(stderr, "Monitor: ");       \
157
    fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
158

    
159
static inline void mon_print_count_inc(Monitor *mon)
160
{
161
    mon->print_calls_nr++;
162
}
163

    
164
static inline void mon_print_count_init(Monitor *mon)
165
{
166
    mon->print_calls_nr = 0;
167
}
168

    
169
static inline int mon_print_count_get(const Monitor *mon)
170
{
171
    return mon->print_calls_nr;
172
}
173

    
174
#else /* !CONFIG_DEBUG_MONITOR */
175
#define MON_DEBUG(fmt, ...) do { } while (0)
176
static inline void mon_print_count_inc(Monitor *mon) { }
177
static inline void mon_print_count_init(Monitor *mon) { }
178
static inline int mon_print_count_get(const Monitor *mon) { return 0; }
179
#endif /* CONFIG_DEBUG_MONITOR */
180

    
181
/* QMP checker flags */
182
#define QMP_ACCEPT_UNKNOWNS 1
183

    
184
static QLIST_HEAD(mon_list, Monitor) mon_list;
185

    
186
static const mon_cmd_t mon_cmds[];
187
static const mon_cmd_t info_cmds[];
188

    
189
Monitor *cur_mon;
190
Monitor *default_mon;
191

    
192
static void monitor_command_cb(Monitor *mon, const char *cmdline,
193
                               void *opaque);
194

    
195
static inline int qmp_cmd_mode(const Monitor *mon)
196
{
197
    return (mon->mc ? mon->mc->command_mode : 0);
198
}
199

    
200
/* Return true if in control mode, false otherwise */
201
static inline int monitor_ctrl_mode(const Monitor *mon)
202
{
203
    return (mon->flags & MONITOR_USE_CONTROL);
204
}
205

    
206
/* Return non-zero iff we have a current monitor, and it is in QMP mode.  */
207
int monitor_cur_is_qmp(void)
208
{
209
    return cur_mon && monitor_ctrl_mode(cur_mon);
210
}
211

    
212
static void monitor_read_command(Monitor *mon, int show_prompt)
213
{
214
    if (!mon->rs)
215
        return;
216

    
217
    readline_start(mon->rs, "(qemu) ", 0, monitor_command_cb, NULL);
218
    if (show_prompt)
219
        readline_show_prompt(mon->rs);
220
}
221

    
222
static int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
223
                                 void *opaque)
224
{
225
    if (monitor_ctrl_mode(mon)) {
226
        qerror_report(QERR_MISSING_PARAMETER, "password");
227
        return -EINVAL;
228
    } else if (mon->rs) {
229
        readline_start(mon->rs, "Password: ", 1, readline_func, opaque);
230
        /* prompt is printed on return from the command handler */
231
        return 0;
232
    } else {
233
        monitor_printf(mon, "terminal does not support password prompting\n");
234
        return -ENOTTY;
235
    }
236
}
237

    
238
void monitor_flush(Monitor *mon)
239
{
240
    if (mon && mon->outbuf_index != 0 && !mon->mux_out) {
241
        qemu_chr_write(mon->chr, mon->outbuf, mon->outbuf_index);
242
        mon->outbuf_index = 0;
243
    }
244
}
245

    
246
/* flush at every end of line or if the buffer is full */
247
static void monitor_puts(Monitor *mon, const char *str)
248
{
249
    char c;
250

    
251
    for(;;) {
252
        c = *str++;
253
        if (c == '\0')
254
            break;
255
        if (c == '\n')
256
            mon->outbuf[mon->outbuf_index++] = '\r';
257
        mon->outbuf[mon->outbuf_index++] = c;
258
        if (mon->outbuf_index >= (sizeof(mon->outbuf) - 1)
259
            || c == '\n')
260
            monitor_flush(mon);
261
    }
262
}
263

    
264
void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
265
{
266
    char buf[4096];
267

    
268
    if (!mon)
269
        return;
270

    
271
    mon_print_count_inc(mon);
272

    
273
    if (monitor_ctrl_mode(mon)) {
274
        return;
275
    }
276

    
277
    vsnprintf(buf, sizeof(buf), fmt, ap);
278
    monitor_puts(mon, buf);
279
}
280

    
281
void monitor_printf(Monitor *mon, const char *fmt, ...)
282
{
283
    va_list ap;
284
    va_start(ap, fmt);
285
    monitor_vprintf(mon, fmt, ap);
286
    va_end(ap);
287
}
288

    
289
void monitor_print_filename(Monitor *mon, const char *filename)
290
{
291
    int i;
292

    
293
    for (i = 0; filename[i]; i++) {
294
        switch (filename[i]) {
295
        case ' ':
296
        case '"':
297
        case '\\':
298
            monitor_printf(mon, "\\%c", filename[i]);
299
            break;
300
        case '\t':
301
            monitor_printf(mon, "\\t");
302
            break;
303
        case '\r':
304
            monitor_printf(mon, "\\r");
305
            break;
306
        case '\n':
307
            monitor_printf(mon, "\\n");
308
            break;
309
        default:
310
            monitor_printf(mon, "%c", filename[i]);
311
            break;
312
        }
313
    }
314
}
315

    
316
static int monitor_fprintf(FILE *stream, const char *fmt, ...)
317
{
318
    va_list ap;
319
    va_start(ap, fmt);
320
    monitor_vprintf((Monitor *)stream, fmt, ap);
321
    va_end(ap);
322
    return 0;
323
}
324

    
325
static void monitor_user_noop(Monitor *mon, const QObject *data) { }
326

    
327
static inline int monitor_handler_ported(const mon_cmd_t *cmd)
328
{
329
    return cmd->user_print != NULL;
330
}
331

    
332
static inline bool monitor_handler_is_async(const mon_cmd_t *cmd)
333
{
334
    return cmd->flags & MONITOR_CMD_ASYNC;
335
}
336

    
337
static inline bool monitor_cmd_user_only(const mon_cmd_t *cmd)
338
{
339
    return (cmd->flags & MONITOR_CMD_USER_ONLY);
340
}
341

    
342
static inline int monitor_has_error(const Monitor *mon)
343
{
344
    return mon->error != NULL;
345
}
346

    
347
static void monitor_json_emitter(Monitor *mon, const QObject *data)
348
{
349
    QString *json;
350

    
351
    json = qobject_to_json(data);
352
    assert(json != NULL);
353

    
354
    qstring_append_chr(json, '\n');
355
    monitor_puts(mon, qstring_get_str(json));
356

    
357
    QDECREF(json);
358
}
359

    
360
static void monitor_protocol_emitter(Monitor *mon, QObject *data)
361
{
362
    QDict *qmp;
363

    
364
    qmp = qdict_new();
365

    
366
    if (!monitor_has_error(mon)) {
367
        /* success response */
368
        if (data) {
369
            qobject_incref(data);
370
            qdict_put_obj(qmp, "return", data);
371
        } else {
372
            /* return an empty QDict by default */
373
            qdict_put(qmp, "return", qdict_new());
374
        }
375
    } else {
376
        /* error response */
377
        qdict_put(mon->error->error, "desc", qerror_human(mon->error));
378
        qdict_put(qmp, "error", mon->error->error);
379
        QINCREF(mon->error->error);
380
        QDECREF(mon->error);
381
        mon->error = NULL;
382
    }
383

    
384
    if (mon->mc->id) {
385
        qdict_put_obj(qmp, "id", mon->mc->id);
386
        mon->mc->id = NULL;
387
    }
388

    
389
    monitor_json_emitter(mon, QOBJECT(qmp));
390
    QDECREF(qmp);
391
}
392

    
393
static void timestamp_put(QDict *qdict)
394
{
395
    int err;
396
    QObject *obj;
397
    qemu_timeval tv;
398

    
399
    err = qemu_gettimeofday(&tv);
400
    if (err < 0)
401
        return;
402

    
403
    obj = qobject_from_jsonf("{ 'seconds': %" PRId64 ", "
404
                                "'microseconds': %" PRId64 " }",
405
                                (int64_t) tv.tv_sec, (int64_t) tv.tv_usec);
406
    qdict_put_obj(qdict, "timestamp", obj);
407
}
408

    
409
/**
410
 * monitor_protocol_event(): Generate a Monitor event
411
 *
412
 * Event-specific data can be emitted through the (optional) 'data' parameter.
413
 */
414
void monitor_protocol_event(MonitorEvent event, QObject *data)
415
{
416
    QDict *qmp;
417
    const char *event_name;
418
    Monitor *mon;
419

    
420
    assert(event < QEVENT_MAX);
421

    
422
    switch (event) {
423
        case QEVENT_SHUTDOWN:
424
            event_name = "SHUTDOWN";
425
            break;
426
        case QEVENT_RESET:
427
            event_name = "RESET";
428
            break;
429
        case QEVENT_POWERDOWN:
430
            event_name = "POWERDOWN";
431
            break;
432
        case QEVENT_STOP:
433
            event_name = "STOP";
434
            break;
435
        case QEVENT_RESUME:
436
            event_name = "RESUME";
437
            break;
438
        case QEVENT_VNC_CONNECTED:
439
            event_name = "VNC_CONNECTED";
440
            break;
441
        case QEVENT_VNC_INITIALIZED:
442
            event_name = "VNC_INITIALIZED";
443
            break;
444
        case QEVENT_VNC_DISCONNECTED:
445
            event_name = "VNC_DISCONNECTED";
446
            break;
447
        case QEVENT_BLOCK_IO_ERROR:
448
            event_name = "BLOCK_IO_ERROR";
449
            break;
450
        case QEVENT_RTC_CHANGE:
451
            event_name = "RTC_CHANGE";
452
            break;
453
        case QEVENT_WATCHDOG:
454
            event_name = "WATCHDOG";
455
            break;
456
        default:
457
            abort();
458
            break;
459
    }
460

    
461
    qmp = qdict_new();
462
    timestamp_put(qmp);
463
    qdict_put(qmp, "event", qstring_from_str(event_name));
464
    if (data) {
465
        qobject_incref(data);
466
        qdict_put_obj(qmp, "data", data);
467
    }
468

    
469
    QLIST_FOREACH(mon, &mon_list, entry) {
470
        if (monitor_ctrl_mode(mon) && qmp_cmd_mode(mon)) {
471
            monitor_json_emitter(mon, QOBJECT(qmp));
472
        }
473
    }
474
    QDECREF(qmp);
475
}
476

    
477
static int do_qmp_capabilities(Monitor *mon, const QDict *params,
478
                               QObject **ret_data)
479
{
480
    /* Will setup QMP capabilities in the future */
481
    if (monitor_ctrl_mode(mon)) {
482
        mon->mc->command_mode = 1;
483
    }
484

    
485
    return 0;
486
}
487

    
488
static int compare_cmd(const char *name, const char *list)
489
{
490
    const char *p, *pstart;
491
    int len;
492
    len = strlen(name);
493
    p = list;
494
    for(;;) {
495
        pstart = p;
496
        p = strchr(p, '|');
497
        if (!p)
498
            p = pstart + strlen(pstart);
499
        if ((p - pstart) == len && !memcmp(pstart, name, len))
500
            return 1;
501
        if (*p == '\0')
502
            break;
503
        p++;
504
    }
505
    return 0;
506
}
507

    
508
static void help_cmd_dump(Monitor *mon, const mon_cmd_t *cmds,
509
                          const char *prefix, const char *name)
510
{
511
    const mon_cmd_t *cmd;
512

    
513
    for(cmd = cmds; cmd->name != NULL; cmd++) {
514
        if (!name || !strcmp(name, cmd->name))
515
            monitor_printf(mon, "%s%s %s -- %s\n", prefix, cmd->name,
516
                           cmd->params, cmd->help);
517
    }
518
}
519

    
520
static void help_cmd(Monitor *mon, const char *name)
521
{
522
    if (name && !strcmp(name, "info")) {
523
        help_cmd_dump(mon, info_cmds, "info ", NULL);
524
    } else {
525
        help_cmd_dump(mon, mon_cmds, "", name);
526
        if (name && !strcmp(name, "log")) {
527
            const CPULogItem *item;
528
            monitor_printf(mon, "Log items (comma separated):\n");
529
            monitor_printf(mon, "%-10s %s\n", "none", "remove all logs");
530
            for(item = cpu_log_items; item->mask != 0; item++) {
531
                monitor_printf(mon, "%-10s %s\n", item->name, item->help);
532
            }
533
        }
534
    }
535
}
536

    
537
static void do_help_cmd(Monitor *mon, const QDict *qdict)
538
{
539
    help_cmd(mon, qdict_get_try_str(qdict, "name"));
540
}
541

    
542
static void user_monitor_complete(void *opaque, QObject *ret_data)
543
{
544
    MonitorCompletionData *data = (MonitorCompletionData *)opaque; 
545

    
546
    if (ret_data) {
547
        data->user_print(data->mon, ret_data);
548
    }
549
    monitor_resume(data->mon);
550
    qemu_free(data);
551
}
552

    
553
static void qmp_monitor_complete(void *opaque, QObject *ret_data)
554
{
555
    monitor_protocol_emitter(opaque, ret_data);
556
}
557

    
558
static int qmp_async_cmd_handler(Monitor *mon, const mon_cmd_t *cmd,
559
                                 const QDict *params)
560
{
561
    return cmd->mhandler.cmd_async(mon, params, qmp_monitor_complete, mon);
562
}
563

    
564
static void qmp_async_info_handler(Monitor *mon, const mon_cmd_t *cmd)
565
{
566
    cmd->mhandler.info_async(mon, qmp_monitor_complete, mon);
567
}
568

    
569
static void user_async_cmd_handler(Monitor *mon, const mon_cmd_t *cmd,
570
                                   const QDict *params)
571
{
572
    int ret;
573

    
574
    MonitorCompletionData *cb_data = qemu_malloc(sizeof(*cb_data));
575
    cb_data->mon = mon;
576
    cb_data->user_print = cmd->user_print;
577
    monitor_suspend(mon);
578
    ret = cmd->mhandler.cmd_async(mon, params,
579
                                  user_monitor_complete, cb_data);
580
    if (ret < 0) {
581
        monitor_resume(mon);
582
        qemu_free(cb_data);
583
    }
584
}
585

    
586
static void user_async_info_handler(Monitor *mon, const mon_cmd_t *cmd)
587
{
588
    int ret;
589

    
590
    MonitorCompletionData *cb_data = qemu_malloc(sizeof(*cb_data));
591
    cb_data->mon = mon;
592
    cb_data->user_print = cmd->user_print;
593
    monitor_suspend(mon);
594
    ret = cmd->mhandler.info_async(mon, user_monitor_complete, cb_data);
595
    if (ret < 0) {
596
        monitor_resume(mon);
597
        qemu_free(cb_data);
598
    }
599
}
600

    
601
static int do_info(Monitor *mon, const QDict *qdict, QObject **ret_data)
602
{
603
    const mon_cmd_t *cmd;
604
    const char *item = qdict_get_try_str(qdict, "item");
605

    
606
    if (!item) {
607
        assert(monitor_ctrl_mode(mon) == 0);
608
        goto help;
609
    }
610

    
611
    for (cmd = info_cmds; cmd->name != NULL; cmd++) {
612
        if (compare_cmd(item, cmd->name))
613
            break;
614
    }
615

    
616
    if (cmd->name == NULL) {
617
        if (monitor_ctrl_mode(mon)) {
618
            qerror_report(QERR_COMMAND_NOT_FOUND, item);
619
            return -1;
620
        }
621
        goto help;
622
    }
623

    
624
    if (monitor_ctrl_mode(mon) && monitor_cmd_user_only(cmd)) {
625
        qerror_report(QERR_COMMAND_NOT_FOUND, item);
626
        return -1;
627
    }
628

    
629
    if (monitor_handler_is_async(cmd)) {
630
        if (monitor_ctrl_mode(mon)) {
631
            qmp_async_info_handler(mon, cmd);
632
        } else {
633
            user_async_info_handler(mon, cmd);
634
        }
635
        /*
636
         * Indicate that this command is asynchronous and will not return any
637
         * data (not even empty).  Instead, the data will be returned via a
638
         * completion callback.
639
         */
640
        *ret_data = qobject_from_jsonf("{ '__mon_async': 'return' }");
641
    } else if (monitor_handler_ported(cmd)) {
642
        cmd->mhandler.info_new(mon, ret_data);
643

    
644
        if (!monitor_ctrl_mode(mon)) {
645
            /*
646
             * User Protocol function is called here, Monitor Protocol is
647
             * handled by monitor_call_handler()
648
             */
649
            if (*ret_data)
650
                cmd->user_print(mon, *ret_data);
651
        }
652
    } else {
653
        if (monitor_ctrl_mode(mon)) {
654
            /* handler not converted yet */
655
            qerror_report(QERR_COMMAND_NOT_FOUND, item);
656
            return -1;
657
        } else {
658
            cmd->mhandler.info(mon);
659
        }
660
    }
661

    
662
    return 0;
663

    
664
help:
665
    help_cmd(mon, "info");
666
    return 0;
667
}
668

    
669
static void do_info_version_print(Monitor *mon, const QObject *data)
670
{
671
    QDict *qdict;
672

    
673
    qdict = qobject_to_qdict(data);
674

    
675
    monitor_printf(mon, "%s%s\n", qdict_get_str(qdict, "qemu"),
676
                                  qdict_get_str(qdict, "package"));
677
}
678

    
679
static void do_info_version(Monitor *mon, QObject **ret_data)
680
{
681
    *ret_data = qobject_from_jsonf("{ 'qemu': %s, 'package': %s }",
682
                                   QEMU_VERSION, QEMU_PKGVERSION);
683
}
684

    
685
static void do_info_name_print(Monitor *mon, const QObject *data)
686
{
687
    QDict *qdict;
688

    
689
    qdict = qobject_to_qdict(data);
690
    if (qdict_size(qdict) == 0) {
691
        return;
692
    }
693

    
694
    monitor_printf(mon, "%s\n", qdict_get_str(qdict, "name"));
695
}
696

    
697
static void do_info_name(Monitor *mon, QObject **ret_data)
698
{
699
    *ret_data = qemu_name ? qobject_from_jsonf("{'name': %s }", qemu_name) :
700
                            qobject_from_jsonf("{}");
701
}
702

    
703
static QObject *get_cmd_dict(const char *name)
704
{
705
    const char *p;
706

    
707
    /* Remove '|' from some commands */
708
    p = strchr(name, '|');
709
    if (p) {
710
        p++;
711
    } else {
712
        p = name;
713
    }
714

    
715
    return qobject_from_jsonf("{ 'name': %s }", p);
716
}
717

    
718
static void do_info_commands(Monitor *mon, QObject **ret_data)
719
{
720
    QList *cmd_list;
721
    const mon_cmd_t *cmd;
722

    
723
    cmd_list = qlist_new();
724

    
725
    for (cmd = mon_cmds; cmd->name != NULL; cmd++) {
726
        if (monitor_handler_ported(cmd) && !monitor_cmd_user_only(cmd) &&
727
            !compare_cmd(cmd->name, "info")) {
728
            qlist_append_obj(cmd_list, get_cmd_dict(cmd->name));
729
        }
730
    }
731

    
732
    for (cmd = info_cmds; cmd->name != NULL; cmd++) {
733
        if (monitor_handler_ported(cmd) && !monitor_cmd_user_only(cmd)) {
734
            char buf[128];
735
            snprintf(buf, sizeof(buf), "query-%s", cmd->name);
736
            qlist_append_obj(cmd_list, get_cmd_dict(buf));
737
        }
738
    }
739

    
740
    *ret_data = QOBJECT(cmd_list);
741
}
742

    
743
static void do_info_uuid_print(Monitor *mon, const QObject *data)
744
{
745
    monitor_printf(mon, "%s\n", qdict_get_str(qobject_to_qdict(data), "UUID"));
746
}
747

    
748
static void do_info_uuid(Monitor *mon, QObject **ret_data)
749
{
750
    char uuid[64];
751

    
752
    snprintf(uuid, sizeof(uuid), UUID_FMT, qemu_uuid[0], qemu_uuid[1],
753
                   qemu_uuid[2], qemu_uuid[3], qemu_uuid[4], qemu_uuid[5],
754
                   qemu_uuid[6], qemu_uuid[7], qemu_uuid[8], qemu_uuid[9],
755
                   qemu_uuid[10], qemu_uuid[11], qemu_uuid[12], qemu_uuid[13],
756
                   qemu_uuid[14], qemu_uuid[15]);
757
    *ret_data = qobject_from_jsonf("{ 'UUID': %s }", uuid);
758
}
759

    
760
/* get the current CPU defined by the user */
761
static int mon_set_cpu(int cpu_index)
762
{
763
    CPUState *env;
764

    
765
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
766
        if (env->cpu_index == cpu_index) {
767
            cur_mon->mon_cpu = env;
768
            return 0;
769
        }
770
    }
771
    return -1;
772
}
773

    
774
static CPUState *mon_get_cpu(void)
775
{
776
    if (!cur_mon->mon_cpu) {
777
        mon_set_cpu(0);
778
    }
779
    cpu_synchronize_state(cur_mon->mon_cpu);
780
    return cur_mon->mon_cpu;
781
}
782

    
783
static void do_info_registers(Monitor *mon)
784
{
785
    CPUState *env;
786
    env = mon_get_cpu();
787
#ifdef TARGET_I386
788
    cpu_dump_state(env, (FILE *)mon, monitor_fprintf,
789
                   X86_DUMP_FPU);
790
#else
791
    cpu_dump_state(env, (FILE *)mon, monitor_fprintf,
792
                   0);
793
#endif
794
}
795

    
796
static void print_cpu_iter(QObject *obj, void *opaque)
797
{
798
    QDict *cpu;
799
    int active = ' ';
800
    Monitor *mon = opaque;
801

    
802
    assert(qobject_type(obj) == QTYPE_QDICT);
803
    cpu = qobject_to_qdict(obj);
804

    
805
    if (qdict_get_bool(cpu, "current")) {
806
        active = '*';
807
    }
808

    
809
    monitor_printf(mon, "%c CPU #%d: ", active, (int)qdict_get_int(cpu, "CPU"));
810

    
811
#if defined(TARGET_I386)
812
    monitor_printf(mon, "pc=0x" TARGET_FMT_lx,
813
                   (target_ulong) qdict_get_int(cpu, "pc"));
814
#elif defined(TARGET_PPC)
815
    monitor_printf(mon, "nip=0x" TARGET_FMT_lx,
816
                   (target_long) qdict_get_int(cpu, "nip"));
817
#elif defined(TARGET_SPARC)
818
    monitor_printf(mon, "pc=0x " TARGET_FMT_lx,
819
                   (target_long) qdict_get_int(cpu, "pc"));
820
    monitor_printf(mon, "npc=0x" TARGET_FMT_lx,
821
                   (target_long) qdict_get_int(cpu, "npc"));
822
#elif defined(TARGET_MIPS)
823
    monitor_printf(mon, "PC=0x" TARGET_FMT_lx,
824
                   (target_long) qdict_get_int(cpu, "PC"));
825
#endif
826

    
827
    if (qdict_get_bool(cpu, "halted")) {
828
        monitor_printf(mon, " (halted)");
829
    }
830

    
831
    monitor_printf(mon, "\n");
832
}
833

    
834
static void monitor_print_cpus(Monitor *mon, const QObject *data)
835
{
836
    QList *cpu_list;
837

    
838
    assert(qobject_type(data) == QTYPE_QLIST);
839
    cpu_list = qobject_to_qlist(data);
840
    qlist_iter(cpu_list, print_cpu_iter, mon);
841
}
842

    
843
static void do_info_cpus(Monitor *mon, QObject **ret_data)
844
{
845
    CPUState *env;
846
    QList *cpu_list;
847

    
848
    cpu_list = qlist_new();
849

    
850
    /* just to set the default cpu if not already done */
851
    mon_get_cpu();
852

    
853
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
854
        QDict *cpu;
855
        QObject *obj;
856

    
857
        cpu_synchronize_state(env);
858

    
859
        obj = qobject_from_jsonf("{ 'CPU': %d, 'current': %i, 'halted': %i }",
860
                                 env->cpu_index, env == mon->mon_cpu,
861
                                 env->halted);
862

    
863
        cpu = qobject_to_qdict(obj);
864

    
865
#if defined(TARGET_I386)
866
        qdict_put(cpu, "pc", qint_from_int(env->eip + env->segs[R_CS].base));
867
#elif defined(TARGET_PPC)
868
        qdict_put(cpu, "nip", qint_from_int(env->nip));
869
#elif defined(TARGET_SPARC)
870
        qdict_put(cpu, "pc", qint_from_int(env->pc));
871
        qdict_put(cpu, "npc", qint_from_int(env->npc));
872
#elif defined(TARGET_MIPS)
873
        qdict_put(cpu, "PC", qint_from_int(env->active_tc.PC));
874
#endif
875

    
876
        qlist_append(cpu_list, cpu);
877
    }
878

    
879
    *ret_data = QOBJECT(cpu_list);
880
}
881

    
882
static int do_cpu_set(Monitor *mon, const QDict *qdict, QObject **ret_data)
883
{
884
    int index = qdict_get_int(qdict, "index");
885
    if (mon_set_cpu(index) < 0) {
886
        qerror_report(QERR_INVALID_PARAMETER_VALUE, "index",
887
                      "a CPU number");
888
        return -1;
889
    }
890
    return 0;
891
}
892

    
893
static void do_info_jit(Monitor *mon)
894
{
895
    dump_exec_info((FILE *)mon, monitor_fprintf);
896
}
897

    
898
static void do_info_history(Monitor *mon)
899
{
900
    int i;
901
    const char *str;
902

    
903
    if (!mon->rs)
904
        return;
905
    i = 0;
906
    for(;;) {
907
        str = readline_get_history(mon->rs, i);
908
        if (!str)
909
            break;
910
        monitor_printf(mon, "%d: '%s'\n", i, str);
911
        i++;
912
    }
913
}
914

    
915
#if defined(TARGET_PPC)
916
/* XXX: not implemented in other targets */
917
static void do_info_cpu_stats(Monitor *mon)
918
{
919
    CPUState *env;
920

    
921
    env = mon_get_cpu();
922
    cpu_dump_statistics(env, (FILE *)mon, &monitor_fprintf, 0);
923
}
924
#endif
925

    
926
/**
927
 * do_quit(): Quit QEMU execution
928
 */
929
static int do_quit(Monitor *mon, const QDict *qdict, QObject **ret_data)
930
{
931
    monitor_suspend(mon);
932
    no_shutdown = 0;
933
    qemu_system_shutdown_request();
934

    
935
    return 0;
936
}
937

    
938
static int change_vnc_password(const char *password)
939
{
940
    if (vnc_display_password(NULL, password) < 0) {
941
        qerror_report(QERR_SET_PASSWD_FAILED);
942
        return -1;
943
    }
944

    
945
    return 0;
946
}
947

    
948
static void change_vnc_password_cb(Monitor *mon, const char *password,
949
                                   void *opaque)
950
{
951
    change_vnc_password(password);
952
    monitor_read_command(mon, 1);
953
}
954

    
955
static int do_change_vnc(Monitor *mon, const char *target, const char *arg)
956
{
957
    if (strcmp(target, "passwd") == 0 ||
958
        strcmp(target, "password") == 0) {
959
        if (arg) {
960
            char password[9];
961
            strncpy(password, arg, sizeof(password));
962
            password[sizeof(password) - 1] = '\0';
963
            return change_vnc_password(password);
964
        } else {
965
            return monitor_read_password(mon, change_vnc_password_cb, NULL);
966
        }
967
    } else {
968
        if (vnc_display_open(NULL, target) < 0) {
969
            qerror_report(QERR_VNC_SERVER_FAILED, target);
970
            return -1;
971
        }
972
    }
973

    
974
    return 0;
975
}
976

    
977
/**
978
 * do_change(): Change a removable medium, or VNC configuration
979
 */
980
static int do_change(Monitor *mon, const QDict *qdict, QObject **ret_data)
981
{
982
    const char *device = qdict_get_str(qdict, "device");
983
    const char *target = qdict_get_str(qdict, "target");
984
    const char *arg = qdict_get_try_str(qdict, "arg");
985
    int ret;
986

    
987
    if (strcmp(device, "vnc") == 0) {
988
        ret = do_change_vnc(mon, target, arg);
989
    } else {
990
        ret = do_change_block(mon, device, target, arg);
991
    }
992

    
993
    return ret;
994
}
995

    
996
static int do_screen_dump(Monitor *mon, const QDict *qdict, QObject **ret_data)
997
{
998
    vga_hw_screen_dump(qdict_get_str(qdict, "filename"));
999
    return 0;
1000
}
1001

    
1002
static void do_logfile(Monitor *mon, const QDict *qdict)
1003
{
1004
    cpu_set_log_filename(qdict_get_str(qdict, "filename"));
1005
}
1006

    
1007
static void do_log(Monitor *mon, const QDict *qdict)
1008
{
1009
    int mask;
1010
    const char *items = qdict_get_str(qdict, "items");
1011

    
1012
    if (!strcmp(items, "none")) {
1013
        mask = 0;
1014
    } else {
1015
        mask = cpu_str_to_log_mask(items);
1016
        if (!mask) {
1017
            help_cmd(mon, "log");
1018
            return;
1019
        }
1020
    }
1021
    cpu_set_log(mask);
1022
}
1023

    
1024
static void do_singlestep(Monitor *mon, const QDict *qdict)
1025
{
1026
    const char *option = qdict_get_try_str(qdict, "option");
1027
    if (!option || !strcmp(option, "on")) {
1028
        singlestep = 1;
1029
    } else if (!strcmp(option, "off")) {
1030
        singlestep = 0;
1031
    } else {
1032
        monitor_printf(mon, "unexpected option %s\n", option);
1033
    }
1034
}
1035

    
1036
/**
1037
 * do_stop(): Stop VM execution
1038
 */
1039
static int do_stop(Monitor *mon, const QDict *qdict, QObject **ret_data)
1040
{
1041
    vm_stop(EXCP_INTERRUPT);
1042
    return 0;
1043
}
1044

    
1045
static void encrypted_bdrv_it(void *opaque, BlockDriverState *bs);
1046

    
1047
struct bdrv_iterate_context {
1048
    Monitor *mon;
1049
    int err;
1050
};
1051

    
1052
/**
1053
 * do_cont(): Resume emulation.
1054
 */
1055
static int do_cont(Monitor *mon, const QDict *qdict, QObject **ret_data)
1056
{
1057
    struct bdrv_iterate_context context = { mon, 0 };
1058

    
1059
    bdrv_iterate(encrypted_bdrv_it, &context);
1060
    /* only resume the vm if all keys are set and valid */
1061
    if (!context.err) {
1062
        vm_start();
1063
        return 0;
1064
    } else {
1065
        return -1;
1066
    }
1067
}
1068

    
1069
static void bdrv_key_cb(void *opaque, int err)
1070
{
1071
    Monitor *mon = opaque;
1072

    
1073
    /* another key was set successfully, retry to continue */
1074
    if (!err)
1075
        do_cont(mon, NULL, NULL);
1076
}
1077

    
1078
static void encrypted_bdrv_it(void *opaque, BlockDriverState *bs)
1079
{
1080
    struct bdrv_iterate_context *context = opaque;
1081

    
1082
    if (!context->err && bdrv_key_required(bs)) {
1083
        context->err = -EBUSY;
1084
        monitor_read_bdrv_key_start(context->mon, bs, bdrv_key_cb,
1085
                                    context->mon);
1086
    }
1087
}
1088

    
1089
static void do_gdbserver(Monitor *mon, const QDict *qdict)
1090
{
1091
    const char *device = qdict_get_try_str(qdict, "device");
1092
    if (!device)
1093
        device = "tcp::" DEFAULT_GDBSTUB_PORT;
1094
    if (gdbserver_start(device) < 0) {
1095
        monitor_printf(mon, "Could not open gdbserver on device '%s'\n",
1096
                       device);
1097
    } else if (strcmp(device, "none") == 0) {
1098
        monitor_printf(mon, "Disabled gdbserver\n");
1099
    } else {
1100
        monitor_printf(mon, "Waiting for gdb connection on device '%s'\n",
1101
                       device);
1102
    }
1103
}
1104

    
1105
static void do_watchdog_action(Monitor *mon, const QDict *qdict)
1106
{
1107
    const char *action = qdict_get_str(qdict, "action");
1108
    if (select_watchdog_action(action) == -1) {
1109
        monitor_printf(mon, "Unknown watchdog action '%s'\n", action);
1110
    }
1111
}
1112

    
1113
static void monitor_printc(Monitor *mon, int c)
1114
{
1115
    monitor_printf(mon, "'");
1116
    switch(c) {
1117
    case '\'':
1118
        monitor_printf(mon, "\\'");
1119
        break;
1120
    case '\\':
1121
        monitor_printf(mon, "\\\\");
1122
        break;
1123
    case '\n':
1124
        monitor_printf(mon, "\\n");
1125
        break;
1126
    case '\r':
1127
        monitor_printf(mon, "\\r");
1128
        break;
1129
    default:
1130
        if (c >= 32 && c <= 126) {
1131
            monitor_printf(mon, "%c", c);
1132
        } else {
1133
            monitor_printf(mon, "\\x%02x", c);
1134
        }
1135
        break;
1136
    }
1137
    monitor_printf(mon, "'");
1138
}
1139

    
1140
static void memory_dump(Monitor *mon, int count, int format, int wsize,
1141
                        target_phys_addr_t addr, int is_physical)
1142
{
1143
    CPUState *env;
1144
    int l, line_size, i, max_digits, len;
1145
    uint8_t buf[16];
1146
    uint64_t v;
1147

    
1148
    if (format == 'i') {
1149
        int flags;
1150
        flags = 0;
1151
        env = mon_get_cpu();
1152
#ifdef TARGET_I386
1153
        if (wsize == 2) {
1154
            flags = 1;
1155
        } else if (wsize == 4) {
1156
            flags = 0;
1157
        } else {
1158
            /* as default we use the current CS size */
1159
            flags = 0;
1160
            if (env) {
1161
#ifdef TARGET_X86_64
1162
                if ((env->efer & MSR_EFER_LMA) &&
1163
                    (env->segs[R_CS].flags & DESC_L_MASK))
1164
                    flags = 2;
1165
                else
1166
#endif
1167
                if (!(env->segs[R_CS].flags & DESC_B_MASK))
1168
                    flags = 1;
1169
            }
1170
        }
1171
#endif
1172
        monitor_disas(mon, env, addr, count, is_physical, flags);
1173
        return;
1174
    }
1175

    
1176
    len = wsize * count;
1177
    if (wsize == 1)
1178
        line_size = 8;
1179
    else
1180
        line_size = 16;
1181
    max_digits = 0;
1182

    
1183
    switch(format) {
1184
    case 'o':
1185
        max_digits = (wsize * 8 + 2) / 3;
1186
        break;
1187
    default:
1188
    case 'x':
1189
        max_digits = (wsize * 8) / 4;
1190
        break;
1191
    case 'u':
1192
    case 'd':
1193
        max_digits = (wsize * 8 * 10 + 32) / 33;
1194
        break;
1195
    case 'c':
1196
        wsize = 1;
1197
        break;
1198
    }
1199

    
1200
    while (len > 0) {
1201
        if (is_physical)
1202
            monitor_printf(mon, TARGET_FMT_plx ":", addr);
1203
        else
1204
            monitor_printf(mon, TARGET_FMT_lx ":", (target_ulong)addr);
1205
        l = len;
1206
        if (l > line_size)
1207
            l = line_size;
1208
        if (is_physical) {
1209
            cpu_physical_memory_rw(addr, buf, l, 0);
1210
        } else {
1211
            env = mon_get_cpu();
1212
            if (cpu_memory_rw_debug(env, addr, buf, l, 0) < 0) {
1213
                monitor_printf(mon, " Cannot access memory\n");
1214
                break;
1215
            }
1216
        }
1217
        i = 0;
1218
        while (i < l) {
1219
            switch(wsize) {
1220
            default:
1221
            case 1:
1222
                v = ldub_raw(buf + i);
1223
                break;
1224
            case 2:
1225
                v = lduw_raw(buf + i);
1226
                break;
1227
            case 4:
1228
                v = (uint32_t)ldl_raw(buf + i);
1229
                break;
1230
            case 8:
1231
                v = ldq_raw(buf + i);
1232
                break;
1233
            }
1234
            monitor_printf(mon, " ");
1235
            switch(format) {
1236
            case 'o':
1237
                monitor_printf(mon, "%#*" PRIo64, max_digits, v);
1238
                break;
1239
            case 'x':
1240
                monitor_printf(mon, "0x%0*" PRIx64, max_digits, v);
1241
                break;
1242
            case 'u':
1243
                monitor_printf(mon, "%*" PRIu64, max_digits, v);
1244
                break;
1245
            case 'd':
1246
                monitor_printf(mon, "%*" PRId64, max_digits, v);
1247
                break;
1248
            case 'c':
1249
                monitor_printc(mon, v);
1250
                break;
1251
            }
1252
            i += wsize;
1253
        }
1254
        monitor_printf(mon, "\n");
1255
        addr += l;
1256
        len -= l;
1257
    }
1258
}
1259

    
1260
static void do_memory_dump(Monitor *mon, const QDict *qdict)
1261
{
1262
    int count = qdict_get_int(qdict, "count");
1263
    int format = qdict_get_int(qdict, "format");
1264
    int size = qdict_get_int(qdict, "size");
1265
    target_long addr = qdict_get_int(qdict, "addr");
1266

    
1267
    memory_dump(mon, count, format, size, addr, 0);
1268
}
1269

    
1270
static void do_physical_memory_dump(Monitor *mon, const QDict *qdict)
1271
{
1272
    int count = qdict_get_int(qdict, "count");
1273
    int format = qdict_get_int(qdict, "format");
1274
    int size = qdict_get_int(qdict, "size");
1275
    target_phys_addr_t addr = qdict_get_int(qdict, "addr");
1276

    
1277
    memory_dump(mon, count, format, size, addr, 1);
1278
}
1279

    
1280
static void do_print(Monitor *mon, const QDict *qdict)
1281
{
1282
    int format = qdict_get_int(qdict, "format");
1283
    target_phys_addr_t val = qdict_get_int(qdict, "val");
1284

    
1285
#if TARGET_PHYS_ADDR_BITS == 32
1286
    switch(format) {
1287
    case 'o':
1288
        monitor_printf(mon, "%#o", val);
1289
        break;
1290
    case 'x':
1291
        monitor_printf(mon, "%#x", val);
1292
        break;
1293
    case 'u':
1294
        monitor_printf(mon, "%u", val);
1295
        break;
1296
    default:
1297
    case 'd':
1298
        monitor_printf(mon, "%d", val);
1299
        break;
1300
    case 'c':
1301
        monitor_printc(mon, val);
1302
        break;
1303
    }
1304
#else
1305
    switch(format) {
1306
    case 'o':
1307
        monitor_printf(mon, "%#" PRIo64, val);
1308
        break;
1309
    case 'x':
1310
        monitor_printf(mon, "%#" PRIx64, val);
1311
        break;
1312
    case 'u':
1313
        monitor_printf(mon, "%" PRIu64, val);
1314
        break;
1315
    default:
1316
    case 'd':
1317
        monitor_printf(mon, "%" PRId64, val);
1318
        break;
1319
    case 'c':
1320
        monitor_printc(mon, val);
1321
        break;
1322
    }
1323
#endif
1324
    monitor_printf(mon, "\n");
1325
}
1326

    
1327
static int do_memory_save(Monitor *mon, const QDict *qdict, QObject **ret_data)
1328
{
1329
    FILE *f;
1330
    uint32_t size = qdict_get_int(qdict, "size");
1331
    const char *filename = qdict_get_str(qdict, "filename");
1332
    target_long addr = qdict_get_int(qdict, "val");
1333
    uint32_t l;
1334
    CPUState *env;
1335
    uint8_t buf[1024];
1336
    int ret = -1;
1337

    
1338
    env = mon_get_cpu();
1339

    
1340
    f = fopen(filename, "wb");
1341
    if (!f) {
1342
        qerror_report(QERR_OPEN_FILE_FAILED, filename);
1343
        return -1;
1344
    }
1345
    while (size != 0) {
1346
        l = sizeof(buf);
1347
        if (l > size)
1348
            l = size;
1349
        cpu_memory_rw_debug(env, addr, buf, l, 0);
1350
        if (fwrite(buf, 1, l, f) != l) {
1351
            monitor_printf(mon, "fwrite() error in do_memory_save\n");
1352
            goto exit;
1353
        }
1354
        addr += l;
1355
        size -= l;
1356
    }
1357

    
1358
    ret = 0;
1359

    
1360
exit:
1361
    fclose(f);
1362
    return ret;
1363
}
1364

    
1365
static int do_physical_memory_save(Monitor *mon, const QDict *qdict,
1366
                                    QObject **ret_data)
1367
{
1368
    FILE *f;
1369
    uint32_t l;
1370
    uint8_t buf[1024];
1371
    uint32_t size = qdict_get_int(qdict, "size");
1372
    const char *filename = qdict_get_str(qdict, "filename");
1373
    target_phys_addr_t addr = qdict_get_int(qdict, "val");
1374
    int ret = -1;
1375

    
1376
    f = fopen(filename, "wb");
1377
    if (!f) {
1378
        qerror_report(QERR_OPEN_FILE_FAILED, filename);
1379
        return -1;
1380
    }
1381
    while (size != 0) {
1382
        l = sizeof(buf);
1383
        if (l > size)
1384
            l = size;
1385
        cpu_physical_memory_rw(addr, buf, l, 0);
1386
        if (fwrite(buf, 1, l, f) != l) {
1387
            monitor_printf(mon, "fwrite() error in do_physical_memory_save\n");
1388
            goto exit;
1389
        }
1390
        fflush(f);
1391
        addr += l;
1392
        size -= l;
1393
    }
1394

    
1395
    ret = 0;
1396

    
1397
exit:
1398
    fclose(f);
1399
    return ret;
1400
}
1401

    
1402
static void do_sum(Monitor *mon, const QDict *qdict)
1403
{
1404
    uint32_t addr;
1405
    uint8_t buf[1];
1406
    uint16_t sum;
1407
    uint32_t start = qdict_get_int(qdict, "start");
1408
    uint32_t size = qdict_get_int(qdict, "size");
1409

    
1410
    sum = 0;
1411
    for(addr = start; addr < (start + size); addr++) {
1412
        cpu_physical_memory_rw(addr, buf, 1, 0);
1413
        /* BSD sum algorithm ('sum' Unix command) */
1414
        sum = (sum >> 1) | (sum << 15);
1415
        sum += buf[0];
1416
    }
1417
    monitor_printf(mon, "%05d\n", sum);
1418
}
1419

    
1420
typedef struct {
1421
    int keycode;
1422
    const char *name;
1423
} KeyDef;
1424

    
1425
static const KeyDef key_defs[] = {
1426
    { 0x2a, "shift" },
1427
    { 0x36, "shift_r" },
1428

    
1429
    { 0x38, "alt" },
1430
    { 0xb8, "alt_r" },
1431
    { 0x64, "altgr" },
1432
    { 0xe4, "altgr_r" },
1433
    { 0x1d, "ctrl" },
1434
    { 0x9d, "ctrl_r" },
1435

    
1436
    { 0xdd, "menu" },
1437

    
1438
    { 0x01, "esc" },
1439

    
1440
    { 0x02, "1" },
1441
    { 0x03, "2" },
1442
    { 0x04, "3" },
1443
    { 0x05, "4" },
1444
    { 0x06, "5" },
1445
    { 0x07, "6" },
1446
    { 0x08, "7" },
1447
    { 0x09, "8" },
1448
    { 0x0a, "9" },
1449
    { 0x0b, "0" },
1450
    { 0x0c, "minus" },
1451
    { 0x0d, "equal" },
1452
    { 0x0e, "backspace" },
1453

    
1454
    { 0x0f, "tab" },
1455
    { 0x10, "q" },
1456
    { 0x11, "w" },
1457
    { 0x12, "e" },
1458
    { 0x13, "r" },
1459
    { 0x14, "t" },
1460
    { 0x15, "y" },
1461
    { 0x16, "u" },
1462
    { 0x17, "i" },
1463
    { 0x18, "o" },
1464
    { 0x19, "p" },
1465
    { 0x1a, "bracket_left" },
1466
    { 0x1b, "bracket_right" },
1467
    { 0x1c, "ret" },
1468

    
1469
    { 0x1e, "a" },
1470
    { 0x1f, "s" },
1471
    { 0x20, "d" },
1472
    { 0x21, "f" },
1473
    { 0x22, "g" },
1474
    { 0x23, "h" },
1475
    { 0x24, "j" },
1476
    { 0x25, "k" },
1477
    { 0x26, "l" },
1478
    { 0x27, "semicolon" },
1479
    { 0x28, "apostrophe" },
1480
    { 0x29, "grave_accent" },
1481

    
1482
    { 0x2b, "backslash" },
1483
    { 0x2c, "z" },
1484
    { 0x2d, "x" },
1485
    { 0x2e, "c" },
1486
    { 0x2f, "v" },
1487
    { 0x30, "b" },
1488
    { 0x31, "n" },
1489
    { 0x32, "m" },
1490
    { 0x33, "comma" },
1491
    { 0x34, "dot" },
1492
    { 0x35, "slash" },
1493

    
1494
    { 0x37, "asterisk" },
1495

    
1496
    { 0x39, "spc" },
1497
    { 0x3a, "caps_lock" },
1498
    { 0x3b, "f1" },
1499
    { 0x3c, "f2" },
1500
    { 0x3d, "f3" },
1501
    { 0x3e, "f4" },
1502
    { 0x3f, "f5" },
1503
    { 0x40, "f6" },
1504
    { 0x41, "f7" },
1505
    { 0x42, "f8" },
1506
    { 0x43, "f9" },
1507
    { 0x44, "f10" },
1508
    { 0x45, "num_lock" },
1509
    { 0x46, "scroll_lock" },
1510

    
1511
    { 0xb5, "kp_divide" },
1512
    { 0x37, "kp_multiply" },
1513
    { 0x4a, "kp_subtract" },
1514
    { 0x4e, "kp_add" },
1515
    { 0x9c, "kp_enter" },
1516
    { 0x53, "kp_decimal" },
1517
    { 0x54, "sysrq" },
1518

    
1519
    { 0x52, "kp_0" },
1520
    { 0x4f, "kp_1" },
1521
    { 0x50, "kp_2" },
1522
    { 0x51, "kp_3" },
1523
    { 0x4b, "kp_4" },
1524
    { 0x4c, "kp_5" },
1525
    { 0x4d, "kp_6" },
1526
    { 0x47, "kp_7" },
1527
    { 0x48, "kp_8" },
1528
    { 0x49, "kp_9" },
1529

    
1530
    { 0x56, "<" },
1531

    
1532
    { 0x57, "f11" },
1533
    { 0x58, "f12" },
1534

    
1535
    { 0xb7, "print" },
1536

    
1537
    { 0xc7, "home" },
1538
    { 0xc9, "pgup" },
1539
    { 0xd1, "pgdn" },
1540
    { 0xcf, "end" },
1541

    
1542
    { 0xcb, "left" },
1543
    { 0xc8, "up" },
1544
    { 0xd0, "down" },
1545
    { 0xcd, "right" },
1546

    
1547
    { 0xd2, "insert" },
1548
    { 0xd3, "delete" },
1549
#if defined(TARGET_SPARC) && !defined(TARGET_SPARC64)
1550
    { 0xf0, "stop" },
1551
    { 0xf1, "again" },
1552
    { 0xf2, "props" },
1553
    { 0xf3, "undo" },
1554
    { 0xf4, "front" },
1555
    { 0xf5, "copy" },
1556
    { 0xf6, "open" },
1557
    { 0xf7, "paste" },
1558
    { 0xf8, "find" },
1559
    { 0xf9, "cut" },
1560
    { 0xfa, "lf" },
1561
    { 0xfb, "help" },
1562
    { 0xfc, "meta_l" },
1563
    { 0xfd, "meta_r" },
1564
    { 0xfe, "compose" },
1565
#endif
1566
    { 0, NULL },
1567
};
1568

    
1569
static int get_keycode(const char *key)
1570
{
1571
    const KeyDef *p;
1572
    char *endp;
1573
    int ret;
1574

    
1575
    for(p = key_defs; p->name != NULL; p++) {
1576
        if (!strcmp(key, p->name))
1577
            return p->keycode;
1578
    }
1579
    if (strstart(key, "0x", NULL)) {
1580
        ret = strtoul(key, &endp, 0);
1581
        if (*endp == '\0' && ret >= 0x01 && ret <= 0xff)
1582
            return ret;
1583
    }
1584
    return -1;
1585
}
1586

    
1587
#define MAX_KEYCODES 16
1588
static uint8_t keycodes[MAX_KEYCODES];
1589
static int nb_pending_keycodes;
1590
static QEMUTimer *key_timer;
1591

    
1592
static void release_keys(void *opaque)
1593
{
1594
    int keycode;
1595

    
1596
    while (nb_pending_keycodes > 0) {
1597
        nb_pending_keycodes--;
1598
        keycode = keycodes[nb_pending_keycodes];
1599
        if (keycode & 0x80)
1600
            kbd_put_keycode(0xe0);
1601
        kbd_put_keycode(keycode | 0x80);
1602
    }
1603
}
1604

    
1605
static void do_sendkey(Monitor *mon, const QDict *qdict)
1606
{
1607
    char keyname_buf[16];
1608
    char *separator;
1609
    int keyname_len, keycode, i;
1610
    const char *string = qdict_get_str(qdict, "string");
1611
    int has_hold_time = qdict_haskey(qdict, "hold_time");
1612
    int hold_time = qdict_get_try_int(qdict, "hold_time", -1);
1613

    
1614
    if (nb_pending_keycodes > 0) {
1615
        qemu_del_timer(key_timer);
1616
        release_keys(NULL);
1617
    }
1618
    if (!has_hold_time)
1619
        hold_time = 100;
1620
    i = 0;
1621
    while (1) {
1622
        separator = strchr(string, '-');
1623
        keyname_len = separator ? separator - string : strlen(string);
1624
        if (keyname_len > 0) {
1625
            pstrcpy(keyname_buf, sizeof(keyname_buf), string);
1626
            if (keyname_len > sizeof(keyname_buf) - 1) {
1627
                monitor_printf(mon, "invalid key: '%s...'\n", keyname_buf);
1628
                return;
1629
            }
1630
            if (i == MAX_KEYCODES) {
1631
                monitor_printf(mon, "too many keys\n");
1632
                return;
1633
            }
1634
            keyname_buf[keyname_len] = 0;
1635
            keycode = get_keycode(keyname_buf);
1636
            if (keycode < 0) {
1637
                monitor_printf(mon, "unknown key: '%s'\n", keyname_buf);
1638
                return;
1639
            }
1640
            keycodes[i++] = keycode;
1641
        }
1642
        if (!separator)
1643
            break;
1644
        string = separator + 1;
1645
    }
1646
    nb_pending_keycodes = i;
1647
    /* key down events */
1648
    for (i = 0; i < nb_pending_keycodes; i++) {
1649
        keycode = keycodes[i];
1650
        if (keycode & 0x80)
1651
            kbd_put_keycode(0xe0);
1652
        kbd_put_keycode(keycode & 0x7f);
1653
    }
1654
    /* delayed key up events */
1655
    qemu_mod_timer(key_timer, qemu_get_clock(vm_clock) +
1656
                   muldiv64(get_ticks_per_sec(), hold_time, 1000));
1657
}
1658

    
1659
static int mouse_button_state;
1660

    
1661
static void do_mouse_move(Monitor *mon, const QDict *qdict)
1662
{
1663
    int dx, dy, dz;
1664
    const char *dx_str = qdict_get_str(qdict, "dx_str");
1665
    const char *dy_str = qdict_get_str(qdict, "dy_str");
1666
    const char *dz_str = qdict_get_try_str(qdict, "dz_str");
1667
    dx = strtol(dx_str, NULL, 0);
1668
    dy = strtol(dy_str, NULL, 0);
1669
    dz = 0;
1670
    if (dz_str)
1671
        dz = strtol(dz_str, NULL, 0);
1672
    kbd_mouse_event(dx, dy, dz, mouse_button_state);
1673
}
1674

    
1675
static void do_mouse_button(Monitor *mon, const QDict *qdict)
1676
{
1677
    int button_state = qdict_get_int(qdict, "button_state");
1678
    mouse_button_state = button_state;
1679
    kbd_mouse_event(0, 0, 0, mouse_button_state);
1680
}
1681

    
1682
static void do_ioport_read(Monitor *mon, const QDict *qdict)
1683
{
1684
    int size = qdict_get_int(qdict, "size");
1685
    int addr = qdict_get_int(qdict, "addr");
1686
    int has_index = qdict_haskey(qdict, "index");
1687
    uint32_t val;
1688
    int suffix;
1689

    
1690
    if (has_index) {
1691
        int index = qdict_get_int(qdict, "index");
1692
        cpu_outb(addr & IOPORTS_MASK, index & 0xff);
1693
        addr++;
1694
    }
1695
    addr &= 0xffff;
1696

    
1697
    switch(size) {
1698
    default:
1699
    case 1:
1700
        val = cpu_inb(addr);
1701
        suffix = 'b';
1702
        break;
1703
    case 2:
1704
        val = cpu_inw(addr);
1705
        suffix = 'w';
1706
        break;
1707
    case 4:
1708
        val = cpu_inl(addr);
1709
        suffix = 'l';
1710
        break;
1711
    }
1712
    monitor_printf(mon, "port%c[0x%04x] = %#0*x\n",
1713
                   suffix, addr, size * 2, val);
1714
}
1715

    
1716
static void do_ioport_write(Monitor *mon, const QDict *qdict)
1717
{
1718
    int size = qdict_get_int(qdict, "size");
1719
    int addr = qdict_get_int(qdict, "addr");
1720
    int val = qdict_get_int(qdict, "val");
1721

    
1722
    addr &= IOPORTS_MASK;
1723

    
1724
    switch (size) {
1725
    default:
1726
    case 1:
1727
        cpu_outb(addr, val);
1728
        break;
1729
    case 2:
1730
        cpu_outw(addr, val);
1731
        break;
1732
    case 4:
1733
        cpu_outl(addr, val);
1734
        break;
1735
    }
1736
}
1737

    
1738
static void do_boot_set(Monitor *mon, const QDict *qdict)
1739
{
1740
    int res;
1741
    const char *bootdevice = qdict_get_str(qdict, "bootdevice");
1742

    
1743
    res = qemu_boot_set(bootdevice);
1744
    if (res == 0) {
1745
        monitor_printf(mon, "boot device list now set to %s\n", bootdevice);
1746
    } else if (res > 0) {
1747
        monitor_printf(mon, "setting boot device list failed\n");
1748
    } else {
1749
        monitor_printf(mon, "no function defined to set boot device list for "
1750
                       "this architecture\n");
1751
    }
1752
}
1753

    
1754
/**
1755
 * do_system_reset(): Issue a machine reset
1756
 */
1757
static int do_system_reset(Monitor *mon, const QDict *qdict,
1758
                           QObject **ret_data)
1759
{
1760
    qemu_system_reset_request();
1761
    return 0;
1762
}
1763

    
1764
/**
1765
 * do_system_powerdown(): Issue a machine powerdown
1766
 */
1767
static int do_system_powerdown(Monitor *mon, const QDict *qdict,
1768
                               QObject **ret_data)
1769
{
1770
    qemu_system_powerdown_request();
1771
    return 0;
1772
}
1773

    
1774
#if defined(TARGET_I386)
1775
static void print_pte(Monitor *mon, uint32_t addr, uint32_t pte, uint32_t mask)
1776
{
1777
    monitor_printf(mon, "%08x: %08x %c%c%c%c%c%c%c%c\n",
1778
                   addr,
1779
                   pte & mask,
1780
                   pte & PG_GLOBAL_MASK ? 'G' : '-',
1781
                   pte & PG_PSE_MASK ? 'P' : '-',
1782
                   pte & PG_DIRTY_MASK ? 'D' : '-',
1783
                   pte & PG_ACCESSED_MASK ? 'A' : '-',
1784
                   pte & PG_PCD_MASK ? 'C' : '-',
1785
                   pte & PG_PWT_MASK ? 'T' : '-',
1786
                   pte & PG_USER_MASK ? 'U' : '-',
1787
                   pte & PG_RW_MASK ? 'W' : '-');
1788
}
1789

    
1790
static void tlb_info(Monitor *mon)
1791
{
1792
    CPUState *env;
1793
    int l1, l2;
1794
    uint32_t pgd, pde, pte;
1795

    
1796
    env = mon_get_cpu();
1797

    
1798
    if (!(env->cr[0] & CR0_PG_MASK)) {
1799
        monitor_printf(mon, "PG disabled\n");
1800
        return;
1801
    }
1802
    pgd = env->cr[3] & ~0xfff;
1803
    for(l1 = 0; l1 < 1024; l1++) {
1804
        cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4);
1805
        pde = le32_to_cpu(pde);
1806
        if (pde & PG_PRESENT_MASK) {
1807
            if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
1808
                print_pte(mon, (l1 << 22), pde, ~((1 << 20) - 1));
1809
            } else {
1810
                for(l2 = 0; l2 < 1024; l2++) {
1811
                    cpu_physical_memory_read((pde & ~0xfff) + l2 * 4,
1812
                                             (uint8_t *)&pte, 4);
1813
                    pte = le32_to_cpu(pte);
1814
                    if (pte & PG_PRESENT_MASK) {
1815
                        print_pte(mon, (l1 << 22) + (l2 << 12),
1816
                                  pte & ~PG_PSE_MASK,
1817
                                  ~0xfff);
1818
                    }
1819
                }
1820
            }
1821
        }
1822
    }
1823
}
1824

    
1825
static void mem_print(Monitor *mon, uint32_t *pstart, int *plast_prot,
1826
                      uint32_t end, int prot)
1827
{
1828
    int prot1;
1829
    prot1 = *plast_prot;
1830
    if (prot != prot1) {
1831
        if (*pstart != -1) {
1832
            monitor_printf(mon, "%08x-%08x %08x %c%c%c\n",
1833
                           *pstart, end, end - *pstart,
1834
                           prot1 & PG_USER_MASK ? 'u' : '-',
1835
                           'r',
1836
                           prot1 & PG_RW_MASK ? 'w' : '-');
1837
        }
1838
        if (prot != 0)
1839
            *pstart = end;
1840
        else
1841
            *pstart = -1;
1842
        *plast_prot = prot;
1843
    }
1844
}
1845

    
1846
static void mem_info(Monitor *mon)
1847
{
1848
    CPUState *env;
1849
    int l1, l2, prot, last_prot;
1850
    uint32_t pgd, pde, pte, start, end;
1851

    
1852
    env = mon_get_cpu();
1853

    
1854
    if (!(env->cr[0] & CR0_PG_MASK)) {
1855
        monitor_printf(mon, "PG disabled\n");
1856
        return;
1857
    }
1858
    pgd = env->cr[3] & ~0xfff;
1859
    last_prot = 0;
1860
    start = -1;
1861
    for(l1 = 0; l1 < 1024; l1++) {
1862
        cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4);
1863
        pde = le32_to_cpu(pde);
1864
        end = l1 << 22;
1865
        if (pde & PG_PRESENT_MASK) {
1866
            if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
1867
                prot = pde & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
1868
                mem_print(mon, &start, &last_prot, end, prot);
1869
            } else {
1870
                for(l2 = 0; l2 < 1024; l2++) {
1871
                    cpu_physical_memory_read((pde & ~0xfff) + l2 * 4,
1872
                                             (uint8_t *)&pte, 4);
1873
                    pte = le32_to_cpu(pte);
1874
                    end = (l1 << 22) + (l2 << 12);
1875
                    if (pte & PG_PRESENT_MASK) {
1876
                        prot = pte & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
1877
                    } else {
1878
                        prot = 0;
1879
                    }
1880
                    mem_print(mon, &start, &last_prot, end, prot);
1881
                }
1882
            }
1883
        } else {
1884
            prot = 0;
1885
            mem_print(mon, &start, &last_prot, end, prot);
1886
        }
1887
    }
1888
}
1889
#endif
1890

    
1891
#if defined(TARGET_SH4)
1892

    
1893
static void print_tlb(Monitor *mon, int idx, tlb_t *tlb)
1894
{
1895
    monitor_printf(mon, " tlb%i:\t"
1896
                   "asid=%hhu vpn=%x\tppn=%x\tsz=%hhu size=%u\t"
1897
                   "v=%hhu shared=%hhu cached=%hhu prot=%hhu "
1898
                   "dirty=%hhu writethrough=%hhu\n",
1899
                   idx,
1900
                   tlb->asid, tlb->vpn, tlb->ppn, tlb->sz, tlb->size,
1901
                   tlb->v, tlb->sh, tlb->c, tlb->pr,
1902
                   tlb->d, tlb->wt);
1903
}
1904

    
1905
static void tlb_info(Monitor *mon)
1906
{
1907
    CPUState *env = mon_get_cpu();
1908
    int i;
1909

    
1910
    monitor_printf (mon, "ITLB:\n");
1911
    for (i = 0 ; i < ITLB_SIZE ; i++)
1912
        print_tlb (mon, i, &env->itlb[i]);
1913
    monitor_printf (mon, "UTLB:\n");
1914
    for (i = 0 ; i < UTLB_SIZE ; i++)
1915
        print_tlb (mon, i, &env->utlb[i]);
1916
}
1917

    
1918
#endif
1919

    
1920
static void do_info_kvm_print(Monitor *mon, const QObject *data)
1921
{
1922
    QDict *qdict;
1923

    
1924
    qdict = qobject_to_qdict(data);
1925

    
1926
    monitor_printf(mon, "kvm support: ");
1927
    if (qdict_get_bool(qdict, "present")) {
1928
        monitor_printf(mon, "%s\n", qdict_get_bool(qdict, "enabled") ?
1929
                                    "enabled" : "disabled");
1930
    } else {
1931
        monitor_printf(mon, "not compiled\n");
1932
    }
1933
}
1934

    
1935
static void do_info_kvm(Monitor *mon, QObject **ret_data)
1936
{
1937
#ifdef CONFIG_KVM
1938
    *ret_data = qobject_from_jsonf("{ 'enabled': %i, 'present': true }",
1939
                                   kvm_enabled());
1940
#else
1941
    *ret_data = qobject_from_jsonf("{ 'enabled': false, 'present': false }");
1942
#endif
1943
}
1944

    
1945
static void do_info_numa(Monitor *mon)
1946
{
1947
    int i;
1948
    CPUState *env;
1949

    
1950
    monitor_printf(mon, "%d nodes\n", nb_numa_nodes);
1951
    for (i = 0; i < nb_numa_nodes; i++) {
1952
        monitor_printf(mon, "node %d cpus:", i);
1953
        for (env = first_cpu; env != NULL; env = env->next_cpu) {
1954
            if (env->numa_node == i) {
1955
                monitor_printf(mon, " %d", env->cpu_index);
1956
            }
1957
        }
1958
        monitor_printf(mon, "\n");
1959
        monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i,
1960
            node_mem[i] >> 20);
1961
    }
1962
}
1963

    
1964
#ifdef CONFIG_PROFILER
1965

    
1966
int64_t qemu_time;
1967
int64_t dev_time;
1968

    
1969
static void do_info_profile(Monitor *mon)
1970
{
1971
    int64_t total;
1972
    total = qemu_time;
1973
    if (total == 0)
1974
        total = 1;
1975
    monitor_printf(mon, "async time  %" PRId64 " (%0.3f)\n",
1976
                   dev_time, dev_time / (double)get_ticks_per_sec());
1977
    monitor_printf(mon, "qemu time   %" PRId64 " (%0.3f)\n",
1978
                   qemu_time, qemu_time / (double)get_ticks_per_sec());
1979
    qemu_time = 0;
1980
    dev_time = 0;
1981
}
1982
#else
1983
static void do_info_profile(Monitor *mon)
1984
{
1985
    monitor_printf(mon, "Internal profiler not compiled\n");
1986
}
1987
#endif
1988

    
1989
/* Capture support */
1990
static QLIST_HEAD (capture_list_head, CaptureState) capture_head;
1991

    
1992
static void do_info_capture(Monitor *mon)
1993
{
1994
    int i;
1995
    CaptureState *s;
1996

    
1997
    for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1998
        monitor_printf(mon, "[%d]: ", i);
1999
        s->ops.info (s->opaque);
2000
    }
2001
}
2002

    
2003
#ifdef HAS_AUDIO
2004
static void do_stop_capture(Monitor *mon, const QDict *qdict)
2005
{
2006
    int i;
2007
    int n = qdict_get_int(qdict, "n");
2008
    CaptureState *s;
2009

    
2010
    for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
2011
        if (i == n) {
2012
            s->ops.destroy (s->opaque);
2013
            QLIST_REMOVE (s, entries);
2014
            qemu_free (s);
2015
            return;
2016
        }
2017
    }
2018
}
2019

    
2020
static void do_wav_capture(Monitor *mon, const QDict *qdict)
2021
{
2022
    const char *path = qdict_get_str(qdict, "path");
2023
    int has_freq = qdict_haskey(qdict, "freq");
2024
    int freq = qdict_get_try_int(qdict, "freq", -1);
2025
    int has_bits = qdict_haskey(qdict, "bits");
2026
    int bits = qdict_get_try_int(qdict, "bits", -1);
2027
    int has_channels = qdict_haskey(qdict, "nchannels");
2028
    int nchannels = qdict_get_try_int(qdict, "nchannels", -1);
2029
    CaptureState *s;
2030

    
2031
    s = qemu_mallocz (sizeof (*s));
2032

    
2033
    freq = has_freq ? freq : 44100;
2034
    bits = has_bits ? bits : 16;
2035
    nchannels = has_channels ? nchannels : 2;
2036

    
2037
    if (wav_start_capture (s, path, freq, bits, nchannels)) {
2038
        monitor_printf(mon, "Faied to add wave capture\n");
2039
        qemu_free (s);
2040
    }
2041
    QLIST_INSERT_HEAD (&capture_head, s, entries);
2042
}
2043
#endif
2044

    
2045
#if defined(TARGET_I386)
2046
static void do_inject_nmi(Monitor *mon, const QDict *qdict)
2047
{
2048
    CPUState *env;
2049
    int cpu_index = qdict_get_int(qdict, "cpu_index");
2050

    
2051
    for (env = first_cpu; env != NULL; env = env->next_cpu)
2052
        if (env->cpu_index == cpu_index) {
2053
            cpu_interrupt(env, CPU_INTERRUPT_NMI);
2054
            break;
2055
        }
2056
}
2057
#endif
2058

    
2059
static void do_info_status_print(Monitor *mon, const QObject *data)
2060
{
2061
    QDict *qdict;
2062

    
2063
    qdict = qobject_to_qdict(data);
2064

    
2065
    monitor_printf(mon, "VM status: ");
2066
    if (qdict_get_bool(qdict, "running")) {
2067
        monitor_printf(mon, "running");
2068
        if (qdict_get_bool(qdict, "singlestep")) {
2069
            monitor_printf(mon, " (single step mode)");
2070
        }
2071
    } else {
2072
        monitor_printf(mon, "paused");
2073
    }
2074

    
2075
    monitor_printf(mon, "\n");
2076
}
2077

    
2078
static void do_info_status(Monitor *mon, QObject **ret_data)
2079
{
2080
    *ret_data = qobject_from_jsonf("{ 'running': %i, 'singlestep': %i }",
2081
                                    vm_running, singlestep);
2082
}
2083

    
2084
static qemu_acl *find_acl(Monitor *mon, const char *name)
2085
{
2086
    qemu_acl *acl = qemu_acl_find(name);
2087

    
2088
    if (!acl) {
2089
        monitor_printf(mon, "acl: unknown list '%s'\n", name);
2090
    }
2091
    return acl;
2092
}
2093

    
2094
static void do_acl_show(Monitor *mon, const QDict *qdict)
2095
{
2096
    const char *aclname = qdict_get_str(qdict, "aclname");
2097
    qemu_acl *acl = find_acl(mon, aclname);
2098
    qemu_acl_entry *entry;
2099
    int i = 0;
2100

    
2101
    if (acl) {
2102
        monitor_printf(mon, "policy: %s\n",
2103
                       acl->defaultDeny ? "deny" : "allow");
2104
        QTAILQ_FOREACH(entry, &acl->entries, next) {
2105
            i++;
2106
            monitor_printf(mon, "%d: %s %s\n", i,
2107
                           entry->deny ? "deny" : "allow", entry->match);
2108
        }
2109
    }
2110
}
2111

    
2112
static void do_acl_reset(Monitor *mon, const QDict *qdict)
2113
{
2114
    const char *aclname = qdict_get_str(qdict, "aclname");
2115
    qemu_acl *acl = find_acl(mon, aclname);
2116

    
2117
    if (acl) {
2118
        qemu_acl_reset(acl);
2119
        monitor_printf(mon, "acl: removed all rules\n");
2120
    }
2121
}
2122

    
2123
static void do_acl_policy(Monitor *mon, const QDict *qdict)
2124
{
2125
    const char *aclname = qdict_get_str(qdict, "aclname");
2126
    const char *policy = qdict_get_str(qdict, "policy");
2127
    qemu_acl *acl = find_acl(mon, aclname);
2128

    
2129
    if (acl) {
2130
        if (strcmp(policy, "allow") == 0) {
2131
            acl->defaultDeny = 0;
2132
            monitor_printf(mon, "acl: policy set to 'allow'\n");
2133
        } else if (strcmp(policy, "deny") == 0) {
2134
            acl->defaultDeny = 1;
2135
            monitor_printf(mon, "acl: policy set to 'deny'\n");
2136
        } else {
2137
            monitor_printf(mon, "acl: unknown policy '%s', "
2138
                           "expected 'deny' or 'allow'\n", policy);
2139
        }
2140
    }
2141
}
2142

    
2143
static void do_acl_add(Monitor *mon, const QDict *qdict)
2144
{
2145
    const char *aclname = qdict_get_str(qdict, "aclname");
2146
    const char *match = qdict_get_str(qdict, "match");
2147
    const char *policy = qdict_get_str(qdict, "policy");
2148
    int has_index = qdict_haskey(qdict, "index");
2149
    int index = qdict_get_try_int(qdict, "index", -1);
2150
    qemu_acl *acl = find_acl(mon, aclname);
2151
    int deny, ret;
2152

    
2153
    if (acl) {
2154
        if (strcmp(policy, "allow") == 0) {
2155
            deny = 0;
2156
        } else if (strcmp(policy, "deny") == 0) {
2157
            deny = 1;
2158
        } else {
2159
            monitor_printf(mon, "acl: unknown policy '%s', "
2160
                           "expected 'deny' or 'allow'\n", policy);
2161
            return;
2162
        }
2163
        if (has_index)
2164
            ret = qemu_acl_insert(acl, deny, match, index);
2165
        else
2166
            ret = qemu_acl_append(acl, deny, match);
2167
        if (ret < 0)
2168
            monitor_printf(mon, "acl: unable to add acl entry\n");
2169
        else
2170
            monitor_printf(mon, "acl: added rule at position %d\n", ret);
2171
    }
2172
}
2173

    
2174
static void do_acl_remove(Monitor *mon, const QDict *qdict)
2175
{
2176
    const char *aclname = qdict_get_str(qdict, "aclname");
2177
    const char *match = qdict_get_str(qdict, "match");
2178
    qemu_acl *acl = find_acl(mon, aclname);
2179
    int ret;
2180

    
2181
    if (acl) {
2182
        ret = qemu_acl_remove(acl, match);
2183
        if (ret < 0)
2184
            monitor_printf(mon, "acl: no matching acl entry\n");
2185
        else
2186
            monitor_printf(mon, "acl: removed rule at position %d\n", ret);
2187
    }
2188
}
2189

    
2190
#if defined(TARGET_I386)
2191
static void do_inject_mce(Monitor *mon, const QDict *qdict)
2192
{
2193
    CPUState *cenv;
2194
    int cpu_index = qdict_get_int(qdict, "cpu_index");
2195
    int bank = qdict_get_int(qdict, "bank");
2196
    uint64_t status = qdict_get_int(qdict, "status");
2197
    uint64_t mcg_status = qdict_get_int(qdict, "mcg_status");
2198
    uint64_t addr = qdict_get_int(qdict, "addr");
2199
    uint64_t misc = qdict_get_int(qdict, "misc");
2200

    
2201
    for (cenv = first_cpu; cenv != NULL; cenv = cenv->next_cpu)
2202
        if (cenv->cpu_index == cpu_index && cenv->mcg_cap) {
2203
            cpu_inject_x86_mce(cenv, bank, status, mcg_status, addr, misc);
2204
            break;
2205
        }
2206
}
2207
#endif
2208

    
2209
static int do_getfd(Monitor *mon, const QDict *qdict, QObject **ret_data)
2210
{
2211
    const char *fdname = qdict_get_str(qdict, "fdname");
2212
    mon_fd_t *monfd;
2213
    int fd;
2214

    
2215
    fd = qemu_chr_get_msgfd(mon->chr);
2216
    if (fd == -1) {
2217
        qerror_report(QERR_FD_NOT_SUPPLIED);
2218
        return -1;
2219
    }
2220

    
2221
    if (qemu_isdigit(fdname[0])) {
2222
        qerror_report(QERR_INVALID_PARAMETER_VALUE, "fdname",
2223
                      "a name not starting with a digit");
2224
        return -1;
2225
    }
2226

    
2227
    QLIST_FOREACH(monfd, &mon->fds, next) {
2228
        if (strcmp(monfd->name, fdname) != 0) {
2229
            continue;
2230
        }
2231

    
2232
        close(monfd->fd);
2233
        monfd->fd = fd;
2234
        return 0;
2235
    }
2236

    
2237
    monfd = qemu_mallocz(sizeof(mon_fd_t));
2238
    monfd->name = qemu_strdup(fdname);
2239
    monfd->fd = fd;
2240

    
2241
    QLIST_INSERT_HEAD(&mon->fds, monfd, next);
2242
    return 0;
2243
}
2244

    
2245
static int do_closefd(Monitor *mon, const QDict *qdict, QObject **ret_data)
2246
{
2247
    const char *fdname = qdict_get_str(qdict, "fdname");
2248
    mon_fd_t *monfd;
2249

    
2250
    QLIST_FOREACH(monfd, &mon->fds, next) {
2251
        if (strcmp(monfd->name, fdname) != 0) {
2252
            continue;
2253
        }
2254

    
2255
        QLIST_REMOVE(monfd, next);
2256
        close(monfd->fd);
2257
        qemu_free(monfd->name);
2258
        qemu_free(monfd);
2259
        return 0;
2260
    }
2261

    
2262
    qerror_report(QERR_FD_NOT_FOUND, fdname);
2263
    return -1;
2264
}
2265

    
2266
static void do_loadvm(Monitor *mon, const QDict *qdict)
2267
{
2268
    int saved_vm_running  = vm_running;
2269
    const char *name = qdict_get_str(qdict, "name");
2270

    
2271
    vm_stop(0);
2272

    
2273
    if (load_vmstate(name) >= 0 && saved_vm_running)
2274
        vm_start();
2275
}
2276

    
2277
int monitor_get_fd(Monitor *mon, const char *fdname)
2278
{
2279
    mon_fd_t *monfd;
2280

    
2281
    QLIST_FOREACH(monfd, &mon->fds, next) {
2282
        int fd;
2283

    
2284
        if (strcmp(monfd->name, fdname) != 0) {
2285
            continue;
2286
        }
2287

    
2288
        fd = monfd->fd;
2289

    
2290
        /* caller takes ownership of fd */
2291
        QLIST_REMOVE(monfd, next);
2292
        qemu_free(monfd->name);
2293
        qemu_free(monfd);
2294

    
2295
        return fd;
2296
    }
2297

    
2298
    return -1;
2299
}
2300

    
2301
static const mon_cmd_t mon_cmds[] = {
2302
#include "qemu-monitor.h"
2303
    { NULL, NULL, },
2304
};
2305

    
2306
/* Please update qemu-monitor.hx when adding or changing commands */
2307
static const mon_cmd_t info_cmds[] = {
2308
    {
2309
        .name       = "version",
2310
        .args_type  = "",
2311
        .params     = "",
2312
        .help       = "show the version of QEMU",
2313
        .user_print = do_info_version_print,
2314
        .mhandler.info_new = do_info_version,
2315
    },
2316
    {
2317
        .name       = "commands",
2318
        .args_type  = "",
2319
        .params     = "",
2320
        .help       = "list QMP available commands",
2321
        .user_print = monitor_user_noop,
2322
        .mhandler.info_new = do_info_commands,
2323
    },
2324
    {
2325
        .name       = "network",
2326
        .args_type  = "",
2327
        .params     = "",
2328
        .help       = "show the network state",
2329
        .mhandler.info = do_info_network,
2330
    },
2331
    {
2332
        .name       = "chardev",
2333
        .args_type  = "",
2334
        .params     = "",
2335
        .help       = "show the character devices",
2336
        .user_print = qemu_chr_info_print,
2337
        .mhandler.info_new = qemu_chr_info,
2338
    },
2339
    {
2340
        .name       = "block",
2341
        .args_type  = "",
2342
        .params     = "",
2343
        .help       = "show the block devices",
2344
        .user_print = bdrv_info_print,
2345
        .mhandler.info_new = bdrv_info,
2346
    },
2347
    {
2348
        .name       = "blockstats",
2349
        .args_type  = "",
2350
        .params     = "",
2351
        .help       = "show block device statistics",
2352
        .user_print = bdrv_stats_print,
2353
        .mhandler.info_new = bdrv_info_stats,
2354
    },
2355
    {
2356
        .name       = "registers",
2357
        .args_type  = "",
2358
        .params     = "",
2359
        .help       = "show the cpu registers",
2360
        .mhandler.info = do_info_registers,
2361
    },
2362
    {
2363
        .name       = "cpus",
2364
        .args_type  = "",
2365
        .params     = "",
2366
        .help       = "show infos for each CPU",
2367
        .user_print = monitor_print_cpus,
2368
        .mhandler.info_new = do_info_cpus,
2369
    },
2370
    {
2371
        .name       = "history",
2372
        .args_type  = "",
2373
        .params     = "",
2374
        .help       = "show the command line history",
2375
        .mhandler.info = do_info_history,
2376
    },
2377
    {
2378
        .name       = "irq",
2379
        .args_type  = "",
2380
        .params     = "",
2381
        .help       = "show the interrupts statistics (if available)",
2382
        .mhandler.info = irq_info,
2383
    },
2384
    {
2385
        .name       = "pic",
2386
        .args_type  = "",
2387
        .params     = "",
2388
        .help       = "show i8259 (PIC) state",
2389
        .mhandler.info = pic_info,
2390
    },
2391
    {
2392
        .name       = "pci",
2393
        .args_type  = "",
2394
        .params     = "",
2395
        .help       = "show PCI info",
2396
        .user_print = do_pci_info_print,
2397
        .mhandler.info_new = do_pci_info,
2398
    },
2399
#if defined(TARGET_I386) || defined(TARGET_SH4)
2400
    {
2401
        .name       = "tlb",
2402
        .args_type  = "",
2403
        .params     = "",
2404
        .help       = "show virtual to physical memory mappings",
2405
        .mhandler.info = tlb_info,
2406
    },
2407
#endif
2408
#if defined(TARGET_I386)
2409
    {
2410
        .name       = "mem",
2411
        .args_type  = "",
2412
        .params     = "",
2413
        .help       = "show the active virtual memory mappings",
2414
        .mhandler.info = mem_info,
2415
    },
2416
#endif
2417
    {
2418
        .name       = "jit",
2419
        .args_type  = "",
2420
        .params     = "",
2421
        .help       = "show dynamic compiler info",
2422
        .mhandler.info = do_info_jit,
2423
    },
2424
    {
2425
        .name       = "kvm",
2426
        .args_type  = "",
2427
        .params     = "",
2428
        .help       = "show KVM information",
2429
        .user_print = do_info_kvm_print,
2430
        .mhandler.info_new = do_info_kvm,
2431
    },
2432
    {
2433
        .name       = "numa",
2434
        .args_type  = "",
2435
        .params     = "",
2436
        .help       = "show NUMA information",
2437
        .mhandler.info = do_info_numa,
2438
    },
2439
    {
2440
        .name       = "usb",
2441
        .args_type  = "",
2442
        .params     = "",
2443
        .help       = "show guest USB devices",
2444
        .mhandler.info = usb_info,
2445
    },
2446
    {
2447
        .name       = "usbhost",
2448
        .args_type  = "",
2449
        .params     = "",
2450
        .help       = "show host USB devices",
2451
        .mhandler.info = usb_host_info,
2452
    },
2453
    {
2454
        .name       = "profile",
2455
        .args_type  = "",
2456
        .params     = "",
2457
        .help       = "show profiling information",
2458
        .mhandler.info = do_info_profile,
2459
    },
2460
    {
2461
        .name       = "capture",
2462
        .args_type  = "",
2463
        .params     = "",
2464
        .help       = "show capture information",
2465
        .mhandler.info = do_info_capture,
2466
    },
2467
    {
2468
        .name       = "snapshots",
2469
        .args_type  = "",
2470
        .params     = "",
2471
        .help       = "show the currently saved VM snapshots",
2472
        .mhandler.info = do_info_snapshots,
2473
    },
2474
    {
2475
        .name       = "status",
2476
        .args_type  = "",
2477
        .params     = "",
2478
        .help       = "show the current VM status (running|paused)",
2479
        .user_print = do_info_status_print,
2480
        .mhandler.info_new = do_info_status,
2481
    },
2482
    {
2483
        .name       = "pcmcia",
2484
        .args_type  = "",
2485
        .params     = "",
2486
        .help       = "show guest PCMCIA status",
2487
        .mhandler.info = pcmcia_info,
2488
    },
2489
    {
2490
        .name       = "mice",
2491
        .args_type  = "",
2492
        .params     = "",
2493
        .help       = "show which guest mouse is receiving events",
2494
        .user_print = do_info_mice_print,
2495
        .mhandler.info_new = do_info_mice,
2496
    },
2497
    {
2498
        .name       = "vnc",
2499
        .args_type  = "",
2500
        .params     = "",
2501
        .help       = "show the vnc server status",
2502
        .user_print = do_info_vnc_print,
2503
        .mhandler.info_new = do_info_vnc,
2504
    },
2505
    {
2506
        .name       = "name",
2507
        .args_type  = "",
2508
        .params     = "",
2509
        .help       = "show the current VM name",
2510
        .user_print = do_info_name_print,
2511
        .mhandler.info_new = do_info_name,
2512
    },
2513
    {
2514
        .name       = "uuid",
2515
        .args_type  = "",
2516
        .params     = "",
2517
        .help       = "show the current VM UUID",
2518
        .user_print = do_info_uuid_print,
2519
        .mhandler.info_new = do_info_uuid,
2520
    },
2521
#if defined(TARGET_PPC)
2522
    {
2523
        .name       = "cpustats",
2524
        .args_type  = "",
2525
        .params     = "",
2526
        .help       = "show CPU statistics",
2527
        .mhandler.info = do_info_cpu_stats,
2528
    },
2529
#endif
2530
#if defined(CONFIG_SLIRP)
2531
    {
2532
        .name       = "usernet",
2533
        .args_type  = "",
2534
        .params     = "",
2535
        .help       = "show user network stack connection states",
2536
        .mhandler.info = do_info_usernet,
2537
    },
2538
#endif
2539
    {
2540
        .name       = "migrate",
2541
        .args_type  = "",
2542
        .params     = "",
2543
        .help       = "show migration status",
2544
        .user_print = do_info_migrate_print,
2545
        .mhandler.info_new = do_info_migrate,
2546
    },
2547
    {
2548
        .name       = "balloon",
2549
        .args_type  = "",
2550
        .params     = "",
2551
        .help       = "show balloon information",
2552
        .user_print = monitor_print_balloon,
2553
        .mhandler.info_async = do_info_balloon,
2554
        .flags      = MONITOR_CMD_ASYNC,
2555
    },
2556
    {
2557
        .name       = "qtree",
2558
        .args_type  = "",
2559
        .params     = "",
2560
        .help       = "show device tree",
2561
        .mhandler.info = do_info_qtree,
2562
    },
2563
    {
2564
        .name       = "qdm",
2565
        .args_type  = "",
2566
        .params     = "",
2567
        .help       = "show qdev device model list",
2568
        .mhandler.info = do_info_qdm,
2569
    },
2570
    {
2571
        .name       = "roms",
2572
        .args_type  = "",
2573
        .params     = "",
2574
        .help       = "show roms",
2575
        .mhandler.info = do_info_roms,
2576
    },
2577
    {
2578
        .name       = NULL,
2579
    },
2580
};
2581

    
2582
/*******************************************************************/
2583

    
2584
static const char *pch;
2585
static jmp_buf expr_env;
2586

    
2587
#define MD_TLONG 0
2588
#define MD_I32   1
2589

    
2590
typedef struct MonitorDef {
2591
    const char *name;
2592
    int offset;
2593
    target_long (*get_value)(const struct MonitorDef *md, int val);
2594
    int type;
2595
} MonitorDef;
2596

    
2597
#if defined(TARGET_I386)
2598
static target_long monitor_get_pc (const struct MonitorDef *md, int val)
2599
{
2600
    CPUState *env = mon_get_cpu();
2601
    return env->eip + env->segs[R_CS].base;
2602
}
2603
#endif
2604

    
2605
#if defined(TARGET_PPC)
2606
static target_long monitor_get_ccr (const struct MonitorDef *md, int val)
2607
{
2608
    CPUState *env = mon_get_cpu();
2609
    unsigned int u;
2610
    int i;
2611

    
2612
    u = 0;
2613
    for (i = 0; i < 8; i++)
2614
        u |= env->crf[i] << (32 - (4 * i));
2615

    
2616
    return u;
2617
}
2618

    
2619
static target_long monitor_get_msr (const struct MonitorDef *md, int val)
2620
{
2621
    CPUState *env = mon_get_cpu();
2622
    return env->msr;
2623
}
2624

    
2625
static target_long monitor_get_xer (const struct MonitorDef *md, int val)
2626
{
2627
    CPUState *env = mon_get_cpu();
2628
    return env->xer;
2629
}
2630

    
2631
static target_long monitor_get_decr (const struct MonitorDef *md, int val)
2632
{
2633
    CPUState *env = mon_get_cpu();
2634
    return cpu_ppc_load_decr(env);
2635
}
2636

    
2637
static target_long monitor_get_tbu (const struct MonitorDef *md, int val)
2638
{
2639
    CPUState *env = mon_get_cpu();
2640
    return cpu_ppc_load_tbu(env);
2641
}
2642

    
2643
static target_long monitor_get_tbl (const struct MonitorDef *md, int val)
2644
{
2645
    CPUState *env = mon_get_cpu();
2646
    return cpu_ppc_load_tbl(env);
2647
}
2648
#endif
2649

    
2650
#if defined(TARGET_SPARC)
2651
#ifndef TARGET_SPARC64
2652
static target_long monitor_get_psr (const struct MonitorDef *md, int val)
2653
{
2654
    CPUState *env = mon_get_cpu();
2655

    
2656
    return cpu_get_psr(env);
2657
}
2658
#endif
2659

    
2660
static target_long monitor_get_reg(const struct MonitorDef *md, int val)
2661
{
2662
    CPUState *env = mon_get_cpu();
2663
    return env->regwptr[val];
2664
}
2665
#endif
2666

    
2667
static const MonitorDef monitor_defs[] = {
2668
#ifdef TARGET_I386
2669

    
2670
#define SEG(name, seg) \
2671
    { name, offsetof(CPUState, segs[seg].selector), NULL, MD_I32 },\
2672
    { name ".base", offsetof(CPUState, segs[seg].base) },\
2673
    { name ".limit", offsetof(CPUState, segs[seg].limit), NULL, MD_I32 },
2674

    
2675
    { "eax", offsetof(CPUState, regs[0]) },
2676
    { "ecx", offsetof(CPUState, regs[1]) },
2677
    { "edx", offsetof(CPUState, regs[2]) },
2678
    { "ebx", offsetof(CPUState, regs[3]) },
2679
    { "esp|sp", offsetof(CPUState, regs[4]) },
2680
    { "ebp|fp", offsetof(CPUState, regs[5]) },
2681
    { "esi", offsetof(CPUState, regs[6]) },
2682
    { "edi", offsetof(CPUState, regs[7]) },
2683
#ifdef TARGET_X86_64
2684
    { "r8", offsetof(CPUState, regs[8]) },
2685
    { "r9", offsetof(CPUState, regs[9]) },
2686
    { "r10", offsetof(CPUState, regs[10]) },
2687
    { "r11", offsetof(CPUState, regs[11]) },
2688
    { "r12", offsetof(CPUState, regs[12]) },
2689
    { "r13", offsetof(CPUState, regs[13]) },
2690
    { "r14", offsetof(CPUState, regs[14]) },
2691
    { "r15", offsetof(CPUState, regs[15]) },
2692
#endif
2693
    { "eflags", offsetof(CPUState, eflags) },
2694
    { "eip", offsetof(CPUState, eip) },
2695
    SEG("cs", R_CS)
2696
    SEG("ds", R_DS)
2697
    SEG("es", R_ES)
2698
    SEG("ss", R_SS)
2699
    SEG("fs", R_FS)
2700
    SEG("gs", R_GS)
2701
    { "pc", 0, monitor_get_pc, },
2702
#elif defined(TARGET_PPC)
2703
    /* General purpose registers */
2704
    { "r0", offsetof(CPUState, gpr[0]) },
2705
    { "r1", offsetof(CPUState, gpr[1]) },
2706
    { "r2", offsetof(CPUState, gpr[2]) },
2707
    { "r3", offsetof(CPUState, gpr[3]) },
2708
    { "r4", offsetof(CPUState, gpr[4]) },
2709
    { "r5", offsetof(CPUState, gpr[5]) },
2710
    { "r6", offsetof(CPUState, gpr[6]) },
2711
    { "r7", offsetof(CPUState, gpr[7]) },
2712
    { "r8", offsetof(CPUState, gpr[8]) },
2713
    { "r9", offsetof(CPUState, gpr[9]) },
2714
    { "r10", offsetof(CPUState, gpr[10]) },
2715
    { "r11", offsetof(CPUState, gpr[11]) },
2716
    { "r12", offsetof(CPUState, gpr[12]) },
2717
    { "r13", offsetof(CPUState, gpr[13]) },
2718
    { "r14", offsetof(CPUState, gpr[14]) },
2719
    { "r15", offsetof(CPUState, gpr[15]) },
2720
    { "r16", offsetof(CPUState, gpr[16]) },
2721
    { "r17", offsetof(CPUState, gpr[17]) },
2722
    { "r18", offsetof(CPUState, gpr[18]) },
2723
    { "r19", offsetof(CPUState, gpr[19]) },
2724
    { "r20", offsetof(CPUState, gpr[20]) },
2725
    { "r21", offsetof(CPUState, gpr[21]) },
2726
    { "r22", offsetof(CPUState, gpr[22]) },
2727
    { "r23", offsetof(CPUState, gpr[23]) },
2728
    { "r24", offsetof(CPUState, gpr[24]) },
2729
    { "r25", offsetof(CPUState, gpr[25]) },
2730
    { "r26", offsetof(CPUState, gpr[26]) },
2731
    { "r27", offsetof(CPUState, gpr[27]) },
2732
    { "r28", offsetof(CPUState, gpr[28]) },
2733
    { "r29", offsetof(CPUState, gpr[29]) },
2734
    { "r30", offsetof(CPUState, gpr[30]) },
2735
    { "r31", offsetof(CPUState, gpr[31]) },
2736
    /* Floating point registers */
2737
    { "f0", offsetof(CPUState, fpr[0]) },
2738
    { "f1", offsetof(CPUState, fpr[1]) },
2739
    { "f2", offsetof(CPUState, fpr[2]) },
2740
    { "f3", offsetof(CPUState, fpr[3]) },
2741
    { "f4", offsetof(CPUState, fpr[4]) },
2742
    { "f5", offsetof(CPUState, fpr[5]) },
2743
    { "f6", offsetof(CPUState, fpr[6]) },
2744
    { "f7", offsetof(CPUState, fpr[7]) },
2745
    { "f8", offsetof(CPUState, fpr[8]) },
2746
    { "f9", offsetof(CPUState, fpr[9]) },
2747
    { "f10", offsetof(CPUState, fpr[10]) },
2748
    { "f11", offsetof(CPUState, fpr[11]) },
2749
    { "f12", offsetof(CPUState, fpr[12]) },
2750
    { "f13", offsetof(CPUState, fpr[13]) },
2751
    { "f14", offsetof(CPUState, fpr[14]) },
2752
    { "f15", offsetof(CPUState, fpr[15]) },
2753
    { "f16", offsetof(CPUState, fpr[16]) },
2754
    { "f17", offsetof(CPUState, fpr[17]) },
2755
    { "f18", offsetof(CPUState, fpr[18]) },
2756
    { "f19", offsetof(CPUState, fpr[19]) },
2757
    { "f20", offsetof(CPUState, fpr[20]) },
2758
    { "f21", offsetof(CPUState, fpr[21]) },
2759
    { "f22", offsetof(CPUState, fpr[22]) },
2760
    { "f23", offsetof(CPUState, fpr[23]) },
2761
    { "f24", offsetof(CPUState, fpr[24]) },
2762
    { "f25", offsetof(CPUState, fpr[25]) },
2763
    { "f26", offsetof(CPUState, fpr[26]) },
2764
    { "f27", offsetof(CPUState, fpr[27]) },
2765
    { "f28", offsetof(CPUState, fpr[28]) },
2766
    { "f29", offsetof(CPUState, fpr[29]) },
2767
    { "f30", offsetof(CPUState, fpr[30]) },
2768
    { "f31", offsetof(CPUState, fpr[31]) },
2769
    { "fpscr", offsetof(CPUState, fpscr) },
2770
    /* Next instruction pointer */
2771
    { "nip|pc", offsetof(CPUState, nip) },
2772
    { "lr", offsetof(CPUState, lr) },
2773
    { "ctr", offsetof(CPUState, ctr) },
2774
    { "decr", 0, &monitor_get_decr, },
2775
    { "ccr", 0, &monitor_get_ccr, },
2776
    /* Machine state register */
2777
    { "msr", 0, &monitor_get_msr, },
2778
    { "xer", 0, &monitor_get_xer, },
2779
    { "tbu", 0, &monitor_get_tbu, },
2780
    { "tbl", 0, &monitor_get_tbl, },
2781
#if defined(TARGET_PPC64)
2782
    /* Address space register */
2783
    { "asr", offsetof(CPUState, asr) },
2784
#endif
2785
    /* Segment registers */
2786
    { "sdr1", offsetof(CPUState, sdr1) },
2787
    { "sr0", offsetof(CPUState, sr[0]) },
2788
    { "sr1", offsetof(CPUState, sr[1]) },
2789
    { "sr2", offsetof(CPUState, sr[2]) },
2790
    { "sr3", offsetof(CPUState, sr[3]) },
2791
    { "sr4", offsetof(CPUState, sr[4]) },
2792
    { "sr5", offsetof(CPUState, sr[5]) },
2793
    { "sr6", offsetof(CPUState, sr[6]) },
2794
    { "sr7", offsetof(CPUState, sr[7]) },
2795
    { "sr8", offsetof(CPUState, sr[8]) },
2796
    { "sr9", offsetof(CPUState, sr[9]) },
2797
    { "sr10", offsetof(CPUState, sr[10]) },
2798
    { "sr11", offsetof(CPUState, sr[11]) },
2799
    { "sr12", offsetof(CPUState, sr[12]) },
2800
    { "sr13", offsetof(CPUState, sr[13]) },
2801
    { "sr14", offsetof(CPUState, sr[14]) },
2802
    { "sr15", offsetof(CPUState, sr[15]) },
2803
    /* Too lazy to put BATs and SPRs ... */
2804
#elif defined(TARGET_SPARC)
2805
    { "g0", offsetof(CPUState, gregs[0]) },
2806
    { "g1", offsetof(CPUState, gregs[1]) },
2807
    { "g2", offsetof(CPUState, gregs[2]) },
2808
    { "g3", offsetof(CPUState, gregs[3]) },
2809
    { "g4", offsetof(CPUState, gregs[4]) },
2810
    { "g5", offsetof(CPUState, gregs[5]) },
2811
    { "g6", offsetof(CPUState, gregs[6]) },
2812
    { "g7", offsetof(CPUState, gregs[7]) },
2813
    { "o0", 0, monitor_get_reg },
2814
    { "o1", 1, monitor_get_reg },
2815
    { "o2", 2, monitor_get_reg },
2816
    { "o3", 3, monitor_get_reg },
2817
    { "o4", 4, monitor_get_reg },
2818
    { "o5", 5, monitor_get_reg },
2819
    { "o6", 6, monitor_get_reg },
2820
    { "o7", 7, monitor_get_reg },
2821
    { "l0", 8, monitor_get_reg },
2822
    { "l1", 9, monitor_get_reg },
2823
    { "l2", 10, monitor_get_reg },
2824
    { "l3", 11, monitor_get_reg },
2825
    { "l4", 12, monitor_get_reg },
2826
    { "l5", 13, monitor_get_reg },
2827
    { "l6", 14, monitor_get_reg },
2828
    { "l7", 15, monitor_get_reg },
2829
    { "i0", 16, monitor_get_reg },
2830
    { "i1", 17, monitor_get_reg },
2831
    { "i2", 18, monitor_get_reg },
2832
    { "i3", 19, monitor_get_reg },
2833
    { "i4", 20, monitor_get_reg },
2834
    { "i5", 21, monitor_get_reg },
2835
    { "i6", 22, monitor_get_reg },
2836
    { "i7", 23, monitor_get_reg },
2837
    { "pc", offsetof(CPUState, pc) },
2838
    { "npc", offsetof(CPUState, npc) },
2839
    { "y", offsetof(CPUState, y) },
2840
#ifndef TARGET_SPARC64
2841
    { "psr", 0, &monitor_get_psr, },
2842
    { "wim", offsetof(CPUState, wim) },
2843
#endif
2844
    { "tbr", offsetof(CPUState, tbr) },
2845
    { "fsr", offsetof(CPUState, fsr) },
2846
    { "f0", offsetof(CPUState, fpr[0]) },
2847
    { "f1", offsetof(CPUState, fpr[1]) },
2848
    { "f2", offsetof(CPUState, fpr[2]) },
2849
    { "f3", offsetof(CPUState, fpr[3]) },
2850
    { "f4", offsetof(CPUState, fpr[4]) },
2851
    { "f5", offsetof(CPUState, fpr[5]) },
2852
    { "f6", offsetof(CPUState, fpr[6]) },
2853
    { "f7", offsetof(CPUState, fpr[7]) },
2854
    { "f8", offsetof(CPUState, fpr[8]) },
2855
    { "f9", offsetof(CPUState, fpr[9]) },
2856
    { "f10", offsetof(CPUState, fpr[10]) },
2857
    { "f11", offsetof(CPUState, fpr[11]) },
2858
    { "f12", offsetof(CPUState, fpr[12]) },
2859
    { "f13", offsetof(CPUState, fpr[13]) },
2860
    { "f14", offsetof(CPUState, fpr[14]) },
2861
    { "f15", offsetof(CPUState, fpr[15]) },
2862
    { "f16", offsetof(CPUState, fpr[16]) },
2863
    { "f17", offsetof(CPUState, fpr[17]) },
2864
    { "f18", offsetof(CPUState, fpr[18]) },
2865
    { "f19", offsetof(CPUState, fpr[19]) },
2866
    { "f20", offsetof(CPUState, fpr[20]) },
2867
    { "f21", offsetof(CPUState, fpr[21]) },
2868
    { "f22", offsetof(CPUState, fpr[22]) },
2869
    { "f23", offsetof(CPUState, fpr[23]) },
2870
    { "f24", offsetof(CPUState, fpr[24]) },
2871
    { "f25", offsetof(CPUState, fpr[25]) },
2872
    { "f26", offsetof(CPUState, fpr[26]) },
2873
    { "f27", offsetof(CPUState, fpr[27]) },
2874
    { "f28", offsetof(CPUState, fpr[28]) },
2875
    { "f29", offsetof(CPUState, fpr[29]) },
2876
    { "f30", offsetof(CPUState, fpr[30]) },
2877
    { "f31", offsetof(CPUState, fpr[31]) },
2878
#ifdef TARGET_SPARC64
2879
    { "f32", offsetof(CPUState, fpr[32]) },
2880
    { "f34", offsetof(CPUState, fpr[34]) },
2881
    { "f36", offsetof(CPUState, fpr[36]) },
2882
    { "f38", offsetof(CPUState, fpr[38]) },
2883
    { "f40", offsetof(CPUState, fpr[40]) },
2884
    { "f42", offsetof(CPUState, fpr[42]) },
2885
    { "f44", offsetof(CPUState, fpr[44]) },
2886
    { "f46", offsetof(CPUState, fpr[46]) },
2887
    { "f48", offsetof(CPUState, fpr[48]) },
2888
    { "f50", offsetof(CPUState, fpr[50]) },
2889
    { "f52", offsetof(CPUState, fpr[52]) },
2890
    { "f54", offsetof(CPUState, fpr[54]) },
2891
    { "f56", offsetof(CPUState, fpr[56]) },
2892
    { "f58", offsetof(CPUState, fpr[58]) },
2893
    { "f60", offsetof(CPUState, fpr[60]) },
2894
    { "f62", offsetof(CPUState, fpr[62]) },
2895
    { "asi", offsetof(CPUState, asi) },
2896
    { "pstate", offsetof(CPUState, pstate) },
2897
    { "cansave", offsetof(CPUState, cansave) },
2898
    { "canrestore", offsetof(CPUState, canrestore) },
2899
    { "otherwin", offsetof(CPUState, otherwin) },
2900
    { "wstate", offsetof(CPUState, wstate) },
2901
    { "cleanwin", offsetof(CPUState, cleanwin) },
2902
    { "fprs", offsetof(CPUState, fprs) },
2903
#endif
2904
#endif
2905
    { NULL },
2906
};
2907

    
2908
static void expr_error(Monitor *mon, const char *msg)
2909
{
2910
    monitor_printf(mon, "%s\n", msg);
2911
    longjmp(expr_env, 1);
2912
}
2913

    
2914
/* return 0 if OK, -1 if not found */
2915
static int get_monitor_def(target_long *pval, const char *name)
2916
{
2917
    const MonitorDef *md;
2918
    void *ptr;
2919

    
2920
    for(md = monitor_defs; md->name != NULL; md++) {
2921
        if (compare_cmd(name, md->name)) {
2922
            if (md->get_value) {
2923
                *pval = md->get_value(md, md->offset);
2924
            } else {
2925
                CPUState *env = mon_get_cpu();
2926
                ptr = (uint8_t *)env + md->offset;
2927
                switch(md->type) {
2928
                case MD_I32:
2929
                    *pval = *(int32_t *)ptr;
2930
                    break;
2931
                case MD_TLONG:
2932
                    *pval = *(target_long *)ptr;
2933
                    break;
2934
                default:
2935
                    *pval = 0;
2936
                    break;
2937
                }
2938
            }
2939
            return 0;
2940
        }
2941
    }
2942
    return -1;
2943
}
2944

    
2945
static void next(void)
2946
{
2947
    if (*pch != '\0') {
2948
        pch++;
2949
        while (qemu_isspace(*pch))
2950
            pch++;
2951
    }
2952
}
2953

    
2954
static int64_t expr_sum(Monitor *mon);
2955

    
2956
static int64_t expr_unary(Monitor *mon)
2957
{
2958
    int64_t n;
2959
    char *p;
2960
    int ret;
2961

    
2962
    switch(*pch) {
2963
    case '+':
2964
        next();
2965
        n = expr_unary(mon);
2966
        break;
2967
    case '-':
2968
        next();
2969
        n = -expr_unary(mon);
2970
        break;
2971
    case '~':
2972
        next();
2973
        n = ~expr_unary(mon);
2974
        break;
2975
    case '(':
2976
        next();
2977
        n = expr_sum(mon);
2978
        if (*pch != ')') {
2979
            expr_error(mon, "')' expected");
2980
        }
2981
        next();
2982
        break;
2983
    case '\'':
2984
        pch++;
2985
        if (*pch == '\0')
2986
            expr_error(mon, "character constant expected");
2987
        n = *pch;
2988
        pch++;
2989
        if (*pch != '\'')
2990
            expr_error(mon, "missing terminating \' character");
2991
        next();
2992
        break;
2993
    case '$':
2994
        {
2995
            char buf[128], *q;
2996
            target_long reg=0;
2997

    
2998
            pch++;
2999
            q = buf;
3000
            while ((*pch >= 'a' && *pch <= 'z') ||
3001
                   (*pch >= 'A' && *pch <= 'Z') ||
3002
                   (*pch >= '0' && *pch <= '9') ||
3003
                   *pch == '_' || *pch == '.') {
3004
                if ((q - buf) < sizeof(buf) - 1)
3005
                    *q++ = *pch;
3006
                pch++;
3007
            }
3008
            while (qemu_isspace(*pch))
3009
                pch++;
3010
            *q = 0;
3011
            ret = get_monitor_def(&reg, buf);
3012
            if (ret < 0)
3013
                expr_error(mon, "unknown register");
3014
            n = reg;
3015
        }
3016
        break;
3017
    case '\0':
3018
        expr_error(mon, "unexpected end of expression");
3019
        n = 0;
3020
        break;
3021
    default:
3022
#if TARGET_PHYS_ADDR_BITS > 32
3023
        n = strtoull(pch, &p, 0);
3024
#else
3025
        n = strtoul(pch, &p, 0);
3026
#endif
3027
        if (pch == p) {
3028
            expr_error(mon, "invalid char in expression");
3029
        }
3030
        pch = p;
3031
        while (qemu_isspace(*pch))
3032
            pch++;
3033
        break;
3034
    }
3035
    return n;
3036
}
3037

    
3038

    
3039
static int64_t expr_prod(Monitor *mon)
3040
{
3041
    int64_t val, val2;
3042
    int op;
3043

    
3044
    val = expr_unary(mon);
3045
    for(;;) {
3046
        op = *pch;
3047
        if (op != '*' && op != '/' && op != '%')
3048
            break;
3049
        next();
3050
        val2 = expr_unary(mon);
3051
        switch(op) {
3052
        default:
3053
        case '*':
3054
            val *= val2;
3055
            break;
3056
        case '/':
3057
        case '%':
3058
            if (val2 == 0)
3059
                expr_error(mon, "division by zero");
3060
            if (op == '/')
3061
                val /= val2;
3062
            else
3063
                val %= val2;
3064
            break;
3065
        }
3066
    }
3067
    return val;
3068
}
3069

    
3070
static int64_t expr_logic(Monitor *mon)
3071
{
3072
    int64_t val, val2;
3073
    int op;
3074

    
3075
    val = expr_prod(mon);
3076
    for(;;) {
3077
        op = *pch;
3078
        if (op != '&' && op != '|' && op != '^')
3079
            break;
3080
        next();
3081
        val2 = expr_prod(mon);
3082
        switch(op) {
3083
        default:
3084
        case '&':
3085
            val &= val2;
3086
            break;
3087
        case '|':
3088
            val |= val2;
3089
            break;
3090
        case '^':
3091
            val ^= val2;
3092
            break;
3093
        }
3094
    }
3095
    return val;
3096
}
3097

    
3098
static int64_t expr_sum(Monitor *mon)
3099
{
3100
    int64_t val, val2;
3101
    int op;
3102

    
3103
    val = expr_logic(mon);
3104
    for(;;) {
3105
        op = *pch;
3106
        if (op != '+' && op != '-')
3107
            break;
3108
        next();
3109
        val2 = expr_logic(mon);
3110
        if (op == '+')
3111
            val += val2;
3112
        else
3113
            val -= val2;
3114
    }
3115
    return val;
3116
}
3117

    
3118
static int get_expr(Monitor *mon, int64_t *pval, const char **pp)
3119
{
3120
    pch = *pp;
3121
    if (setjmp(expr_env)) {
3122
        *pp = pch;
3123
        return -1;
3124
    }
3125
    while (qemu_isspace(*pch))
3126
        pch++;
3127
    *pval = expr_sum(mon);
3128
    *pp = pch;
3129
    return 0;
3130
}
3131

    
3132
static int get_double(Monitor *mon, double *pval, const char **pp)
3133
{
3134
    const char *p = *pp;
3135
    char *tailp;
3136
    double d;
3137

    
3138
    d = strtod(p, &tailp);
3139
    if (tailp == p) {
3140
        monitor_printf(mon, "Number expected\n");
3141
        return -1;
3142
    }
3143
    if (d != d || d - d != 0) {
3144
        /* NaN or infinity */
3145
        monitor_printf(mon, "Bad number\n");
3146
        return -1;
3147
    }
3148
    *pval = d;
3149
    *pp = tailp;
3150
    return 0;
3151
}
3152

    
3153
static int get_str(char *buf, int buf_size, const char **pp)
3154
{
3155
    const char *p;
3156
    char *q;
3157
    int c;
3158

    
3159
    q = buf;
3160
    p = *pp;
3161
    while (qemu_isspace(*p))
3162
        p++;
3163
    if (*p == '\0') {
3164
    fail:
3165
        *q = '\0';
3166
        *pp = p;
3167
        return -1;
3168
    }
3169
    if (*p == '\"') {
3170
        p++;
3171
        while (*p != '\0' && *p != '\"') {
3172
            if (*p == '\\') {
3173
                p++;
3174
                c = *p++;
3175
                switch(c) {
3176
                case 'n':
3177
                    c = '\n';
3178
                    break;
3179
                case 'r':
3180
                    c = '\r';
3181
                    break;
3182
                case '\\':
3183
                case '\'':
3184
                case '\"':
3185
                    break;
3186
                default:
3187
                    qemu_printf("unsupported escape code: '\\%c'\n", c);
3188
                    goto fail;
3189
                }
3190
                if ((q - buf) < buf_size - 1) {
3191
                    *q++ = c;
3192
                }
3193
            } else {
3194
                if ((q - buf) < buf_size - 1) {
3195
                    *q++ = *p;
3196
                }
3197
                p++;
3198
            }
3199
        }
3200
        if (*p != '\"') {
3201
            qemu_printf("unterminated string\n");
3202
            goto fail;
3203
        }
3204
        p++;
3205
    } else {
3206
        while (*p != '\0' && !qemu_isspace(*p)) {
3207
            if ((q - buf) < buf_size - 1) {
3208
                *q++ = *p;
3209
            }
3210
            p++;
3211
        }
3212
    }
3213
    *q = '\0';
3214
    *pp = p;
3215
    return 0;
3216
}
3217

    
3218
/*
3219
 * Store the command-name in cmdname, and return a pointer to
3220
 * the remaining of the command string.
3221
 */
3222
static const char *get_command_name(const char *cmdline,
3223
                                    char *cmdname, size_t nlen)
3224
{
3225
    size_t len;
3226
    const char *p, *pstart;
3227

    
3228
    p = cmdline;
3229
    while (qemu_isspace(*p))
3230
        p++;
3231
    if (*p == '\0')
3232
        return NULL;
3233
    pstart = p;
3234
    while (*p != '\0' && *p != '/' && !qemu_isspace(*p))
3235
        p++;
3236
    len = p - pstart;
3237
    if (len > nlen - 1)
3238
        len = nlen - 1;
3239
    memcpy(cmdname, pstart, len);
3240
    cmdname[len] = '\0';
3241
    return p;
3242
}
3243

    
3244
/**
3245
 * Read key of 'type' into 'key' and return the current
3246
 * 'type' pointer.
3247
 */
3248
static char *key_get_info(const char *type, char **key)
3249
{
3250
    size_t len;
3251
    char *p, *str;
3252

    
3253
    if (*type == ',')
3254
        type++;
3255

    
3256
    p = strchr(type, ':');
3257
    if (!p) {
3258
        *key = NULL;
3259
        return NULL;
3260
    }
3261
    len = p - type;
3262

    
3263
    str = qemu_malloc(len + 1);
3264
    memcpy(str, type, len);
3265
    str[len] = '\0';
3266

    
3267
    *key = str;
3268
    return ++p;
3269
}
3270

    
3271
static int default_fmt_format = 'x';
3272
static int default_fmt_size = 4;
3273

    
3274
#define MAX_ARGS 16
3275

    
3276
static int is_valid_option(const char *c, const char *typestr)
3277
{
3278
    char option[3];
3279
  
3280
    option[0] = '-';
3281
    option[1] = *c;
3282
    option[2] = '\0';
3283
  
3284
    typestr = strstr(typestr, option);
3285
    return (typestr != NULL);
3286
}
3287

    
3288
static const mon_cmd_t *monitor_find_command(const char *cmdname)
3289
{
3290
    const mon_cmd_t *cmd;
3291

    
3292
    for (cmd = mon_cmds; cmd->name != NULL; cmd++) {
3293
        if (compare_cmd(cmdname, cmd->name)) {
3294
            return cmd;
3295
        }
3296
    }
3297

    
3298
    return NULL;
3299
}
3300

    
3301
static const mon_cmd_t *monitor_parse_command(Monitor *mon,
3302
                                              const char *cmdline,
3303
                                              QDict *qdict)
3304
{
3305
    const char *p, *typestr;
3306
    int c;
3307
    const mon_cmd_t *cmd;
3308
    char cmdname[256];
3309
    char buf[1024];
3310
    char *key;
3311

    
3312
#ifdef DEBUG
3313
    monitor_printf(mon, "command='%s'\n", cmdline);
3314
#endif
3315

    
3316
    /* extract the command name */
3317
    p = get_command_name(cmdline, cmdname, sizeof(cmdname));
3318
    if (!p)
3319
        return NULL;
3320

    
3321
    cmd = monitor_find_command(cmdname);
3322
    if (!cmd) {
3323
        monitor_printf(mon, "unknown command: '%s'\n", cmdname);
3324
        return NULL;
3325
    }
3326

    
3327
    /* parse the parameters */
3328
    typestr = cmd->args_type;
3329
    for(;;) {
3330
        typestr = key_get_info(typestr, &key);
3331
        if (!typestr)
3332
            break;
3333
        c = *typestr;
3334
        typestr++;
3335
        switch(c) {
3336
        case 'F':
3337
        case 'B':
3338
        case 's':
3339
            {
3340
                int ret;
3341

    
3342
                while (qemu_isspace(*p))
3343
                    p++;
3344
                if (*typestr == '?') {
3345
                    typestr++;
3346
                    if (*p == '\0') {
3347
                        /* no optional string: NULL argument */
3348
                        break;
3349
                    }
3350
                }
3351
                ret = get_str(buf, sizeof(buf), &p);
3352
                if (ret < 0) {
3353
                    switch(c) {
3354
                    case 'F':
3355
                        monitor_printf(mon, "%s: filename expected\n",
3356
                                       cmdname);
3357
                        break;
3358
                    case 'B':
3359
                        monitor_printf(mon, "%s: block device name expected\n",
3360
                                       cmdname);
3361
                        break;
3362
                    default:
3363
                        monitor_printf(mon, "%s: string expected\n", cmdname);
3364
                        break;
3365
                    }
3366
                    goto fail;
3367
                }
3368
                qdict_put(qdict, key, qstring_from_str(buf));
3369
            }
3370
            break;
3371
        case 'O':
3372
            {
3373
                QemuOptsList *opts_list;
3374
                QemuOpts *opts;
3375

    
3376
                opts_list = qemu_find_opts(key);
3377
                if (!opts_list || opts_list->desc->name) {
3378
                    goto bad_type;
3379
                }
3380
                while (qemu_isspace(*p)) {
3381
                    p++;
3382
                }
3383
                if (!*p)
3384
                    break;
3385
                if (get_str(buf, sizeof(buf), &p) < 0) {
3386
                    goto fail;
3387
                }
3388
                opts = qemu_opts_parse(opts_list, buf, 1);
3389
                if (!opts) {
3390
                    goto fail;
3391
                }
3392
                qemu_opts_to_qdict(opts, qdict);
3393
                qemu_opts_del(opts);
3394
            }
3395
            break;
3396
        case '/':
3397
            {
3398
                int count, format, size;
3399

    
3400
                while (qemu_isspace(*p))
3401
                    p++;
3402
                if (*p == '/') {
3403
                    /* format found */
3404
                    p++;
3405
                    count = 1;
3406
                    if (qemu_isdigit(*p)) {
3407
                        count = 0;
3408
                        while (qemu_isdigit(*p)) {
3409
                            count = count * 10 + (*p - '0');
3410
                            p++;
3411
                        }
3412
                    }
3413
                    size = -1;
3414
                    format = -1;
3415
                    for(;;) {
3416
                        switch(*p) {
3417
                        case 'o':
3418
                        case 'd':
3419
                        case 'u':
3420
                        case 'x':
3421
                        case 'i':
3422
                        case 'c':
3423
                            format = *p++;
3424
                            break;
3425
                        case 'b':
3426
                            size = 1;
3427
                            p++;
3428
                            break;
3429
                        case 'h':
3430
                            size = 2;
3431
                            p++;
3432
                            break;
3433
                        case 'w':
3434
                            size = 4;
3435
                            p++;
3436
                            break;
3437
                        case 'g':
3438
                        case 'L':
3439
                            size = 8;
3440
                            p++;
3441
                            break;
3442
                        default:
3443
                            goto next;
3444
                        }
3445
                    }
3446
                next:
3447
                    if (*p != '\0' && !qemu_isspace(*p)) {
3448
                        monitor_printf(mon, "invalid char in format: '%c'\n",
3449
                                       *p);
3450
                        goto fail;
3451
                    }
3452
                    if (format < 0)
3453
                        format = default_fmt_format;
3454
                    if (format != 'i') {
3455
                        /* for 'i', not specifying a size gives -1 as size */
3456
                        if (size < 0)
3457
                            size = default_fmt_size;
3458
                        default_fmt_size = size;
3459
                    }
3460
                    default_fmt_format = format;
3461
                } else {
3462
                    count = 1;
3463
                    format = default_fmt_format;
3464
                    if (format != 'i') {
3465
                        size = default_fmt_size;
3466
                    } else {
3467
                        size = -1;
3468
                    }
3469
                }
3470
                qdict_put(qdict, "count", qint_from_int(count));
3471
                qdict_put(qdict, "format", qint_from_int(format));
3472
                qdict_put(qdict, "size", qint_from_int(size));
3473
            }
3474
            break;
3475
        case 'i':
3476
        case 'l':
3477
        case 'M':
3478
            {
3479
                int64_t val;
3480

    
3481
                while (qemu_isspace(*p))
3482
                    p++;
3483
                if (*typestr == '?' || *typestr == '.') {
3484
                    if (*typestr == '?') {
3485
                        if (*p == '\0') {
3486
                            typestr++;
3487
                            break;
3488
                        }
3489
                    } else {
3490
                        if (*p == '.') {
3491
                            p++;
3492
                            while (qemu_isspace(*p))
3493
                                p++;
3494
                        } else {
3495
                            typestr++;
3496
                            break;
3497
                        }
3498
                    }
3499
                    typestr++;
3500
                }
3501
                if (get_expr(mon, &val, &p))
3502
                    goto fail;
3503
                /* Check if 'i' is greater than 32-bit */
3504
                if ((c == 'i') && ((val >> 32) & 0xffffffff)) {
3505
                    monitor_printf(mon, "\'%s\' has failed: ", cmdname);
3506
                    monitor_printf(mon, "integer is for 32-bit values\n");
3507
                    goto fail;
3508
                } else if (c == 'M') {
3509
                    val <<= 20;
3510
                }
3511
                qdict_put(qdict, key, qint_from_int(val));
3512
            }
3513
            break;
3514
        case 'f':
3515
        case 'T':
3516
            {
3517
                double val;
3518

    
3519
                while (qemu_isspace(*p))
3520
                    p++;
3521
                if (*typestr == '?') {
3522
                    typestr++;
3523
                    if (*p == '\0') {
3524
                        break;
3525
                    }
3526
                }
3527
                if (get_double(mon, &val, &p) < 0) {
3528
                    goto fail;
3529
                }
3530
                if (c == 'f' && *p) {
3531
                    switch (*p) {
3532
                    case 'K': case 'k':
3533
                        val *= 1 << 10; p++; break;
3534
                    case 'M': case 'm':
3535
                        val *= 1 << 20; p++; break;
3536
                    case 'G': case 'g':
3537
                        val *= 1 << 30; p++; break;
3538
                    }
3539
                }
3540
                if (c == 'T' && p[0] && p[1] == 's') {
3541
                    switch (*p) {
3542
                    case 'm':
3543
                        val /= 1e3; p += 2; break;
3544
                    case 'u':
3545
                        val /= 1e6; p += 2; break;
3546
                    case 'n':
3547
                        val /= 1e9; p += 2; break;
3548
                    }
3549
                }
3550
                if (*p && !qemu_isspace(*p)) {
3551
                    monitor_printf(mon, "Unknown unit suffix\n");
3552
                    goto fail;
3553
                }
3554
                qdict_put(qdict, key, qfloat_from_double(val));
3555
            }
3556
            break;
3557
        case 'b':
3558
            {
3559
                const char *beg;
3560
                int val;
3561

    
3562
                while (qemu_isspace(*p)) {
3563
                    p++;
3564
                }
3565
                beg = p;
3566
                while (qemu_isgraph(*p)) {
3567
                    p++;
3568
                }
3569
                if (p - beg == 2 && !memcmp(beg, "on", p - beg)) {
3570
                    val = 1;
3571
                } else if (p - beg == 3 && !memcmp(beg, "off", p - beg)) {
3572
                    val = 0;
3573
                } else {
3574
                    monitor_printf(mon, "Expected 'on' or 'off'\n");
3575
                    goto fail;
3576
                }
3577
                qdict_put(qdict, key, qbool_from_int(val));
3578
            }
3579
            break;
3580
        case '-':
3581
            {
3582
                const char *tmp = p;
3583
                int skip_key = 0;
3584
                /* option */
3585

    
3586
                c = *typestr++;
3587
                if (c == '\0')
3588
                    goto bad_type;
3589
                while (qemu_isspace(*p))
3590
                    p++;
3591
                if (*p == '-') {
3592
                    p++;
3593
                    if(c != *p) {
3594
                        if(!is_valid_option(p, typestr)) {
3595
                  
3596
                            monitor_printf(mon, "%s: unsupported option -%c\n",
3597
                                           cmdname, *p);
3598
                            goto fail;
3599
                        } else {
3600
                            skip_key = 1;
3601
                        }
3602
                    }
3603
                    if(skip_key) {
3604
                        p = tmp;
3605
                    } else {
3606
                        /* has option */
3607
                        p++;
3608
                        qdict_put(qdict, key, qbool_from_int(1));
3609
                    }
3610
                }
3611
            }
3612
            break;
3613
        default:
3614
        bad_type:
3615
            monitor_printf(mon, "%s: unknown type '%c'\n", cmdname, c);
3616
            goto fail;
3617
        }
3618
        qemu_free(key);
3619
        key = NULL;
3620
    }
3621
    /* check that all arguments were parsed */
3622
    while (qemu_isspace(*p))
3623
        p++;
3624
    if (*p != '\0') {
3625
        monitor_printf(mon, "%s: extraneous characters at the end of line\n",
3626
                       cmdname);
3627
        goto fail;
3628
    }
3629

    
3630
    return cmd;
3631

    
3632
fail:
3633
    qemu_free(key);
3634
    return NULL;
3635
}
3636

    
3637
void monitor_set_error(Monitor *mon, QError *qerror)
3638
{
3639
    /* report only the first error */
3640
    if (!mon->error) {
3641
        mon->error = qerror;
3642
    } else {
3643
        MON_DEBUG("Additional error report at %s:%d\n",
3644
                  qerror->file, qerror->linenr);
3645
        QDECREF(qerror);
3646
    }
3647
}
3648

    
3649
static int is_async_return(const QObject *data)
3650
{
3651
    if (data && qobject_type(data) == QTYPE_QDICT) {
3652
        return qdict_haskey(qobject_to_qdict(data), "__mon_async");
3653
    }
3654

    
3655
    return 0;
3656
}
3657

    
3658
static void handler_audit(Monitor *mon, const mon_cmd_t *cmd, int ret)
3659
{
3660
    if (monitor_ctrl_mode(mon)) {
3661
        if (ret && !monitor_has_error(mon)) {
3662
            /*
3663
             * If it returns failure, it must have passed on error.
3664
             *
3665
             * Action: Report an internal error to the client if in QMP.
3666
             */
3667
            qerror_report(QERR_UNDEFINED_ERROR);
3668
            MON_DEBUG("command '%s' returned failure but did not pass an error\n",
3669
                      cmd->name);
3670
        }
3671

    
3672
#ifdef CONFIG_DEBUG_MONITOR
3673
        if (!ret && monitor_has_error(mon)) {
3674
            /*
3675
             * If it returns success, it must not have passed an error.
3676
             *
3677
             * Action: Report the passed error to the client.
3678
             */
3679
            MON_DEBUG("command '%s' returned success but passed an error\n",
3680
                      cmd->name);
3681
        }
3682

    
3683
        if (mon_print_count_get(mon) > 0 && strcmp(cmd->name, "info") != 0) {
3684
            /*
3685
             * Handlers should not call Monitor print functions.
3686
             *
3687
             * Action: Ignore them in QMP.
3688
             *
3689
             * (XXX: we don't check any 'info' or 'query' command here
3690
             * because the user print function _is_ called by do_info(), hence
3691
             * we will trigger this check. This problem will go away when we
3692
             * make 'query' commands real and kill do_info())
3693
             */
3694
            MON_DEBUG("command '%s' called print functions %d time(s)\n",
3695
                      cmd->name, mon_print_count_get(mon));
3696
        }
3697
#endif
3698
    } else {
3699
        assert(!monitor_has_error(mon));
3700
        QDECREF(mon->error);
3701
        mon->error = NULL;
3702
    }
3703
}
3704

    
3705
static void monitor_call_handler(Monitor *mon, const mon_cmd_t *cmd,
3706
                                 const QDict *params)
3707
{
3708
    int ret;
3709
    QObject *data = NULL;
3710

    
3711
    mon_print_count_init(mon);
3712

    
3713
    ret = cmd->mhandler.cmd_new(mon, params, &data);
3714
    handler_audit(mon, cmd, ret);
3715

    
3716
    if (is_async_return(data)) {
3717
        /*
3718
         * Asynchronous commands have no initial return data but they can
3719
         * generate errors.  Data is returned via the async completion handler.
3720
         */
3721
        if (monitor_ctrl_mode(mon) && monitor_has_error(mon)) {
3722
            monitor_protocol_emitter(mon, NULL);
3723
        }
3724
    } else if (monitor_ctrl_mode(mon)) {
3725
        /* Monitor Protocol */
3726
        monitor_protocol_emitter(mon, data);
3727
    } else {
3728
        /* User Protocol */
3729
         if (data)
3730
            cmd->user_print(mon, data);
3731
    }
3732

    
3733
    qobject_decref(data);
3734
}
3735

    
3736
static void handle_user_command(Monitor *mon, const char *cmdline)
3737
{
3738
    QDict *qdict;
3739
    const mon_cmd_t *cmd;
3740

    
3741
    qdict = qdict_new();
3742

    
3743
    cmd = monitor_parse_command(mon, cmdline, qdict);
3744
    if (!cmd)
3745
        goto out;
3746

    
3747
    if (monitor_handler_is_async(cmd)) {
3748
        user_async_cmd_handler(mon, cmd, qdict);
3749
    } else if (monitor_handler_ported(cmd)) {
3750
        monitor_call_handler(mon, cmd, qdict);
3751
    } else {
3752
        cmd->mhandler.cmd(mon, qdict);
3753
    }
3754

    
3755
out:
3756
    QDECREF(qdict);
3757
}
3758

    
3759
static void cmd_completion(const char *name, const char *list)
3760
{
3761
    const char *p, *pstart;
3762
    char cmd[128];
3763
    int len;
3764

    
3765
    p = list;
3766
    for(;;) {
3767
        pstart = p;
3768
        p = strchr(p, '|');
3769
        if (!p)
3770
            p = pstart + strlen(pstart);
3771
        len = p - pstart;
3772
        if (len > sizeof(cmd) - 2)
3773
            len = sizeof(cmd) - 2;
3774
        memcpy(cmd, pstart, len);
3775
        cmd[len] = '\0';
3776
        if (name[0] == '\0' || !strncmp(name, cmd, strlen(name))) {
3777
            readline_add_completion(cur_mon->rs, cmd);
3778
        }
3779
        if (*p == '\0')
3780
            break;
3781
        p++;
3782
    }
3783
}
3784

    
3785
static void file_completion(const char *input)
3786
{
3787
    DIR *ffs;
3788
    struct dirent *d;
3789
    char path[1024];
3790
    char file[1024], file_prefix[1024];
3791
    int input_path_len;
3792
    const char *p;
3793

    
3794
    p = strrchr(input, '/');
3795
    if (!p) {
3796
        input_path_len = 0;
3797
        pstrcpy(file_prefix, sizeof(file_prefix), input);
3798
        pstrcpy(path, sizeof(path), ".");
3799
    } else {
3800
        input_path_len = p - input + 1;
3801
        memcpy(path, input, input_path_len);
3802
        if (input_path_len > sizeof(path) - 1)
3803
            input_path_len = sizeof(path) - 1;
3804
        path[input_path_len] = '\0';
3805
        pstrcpy(file_prefix, sizeof(file_prefix), p + 1);
3806
    }
3807
#ifdef DEBUG_COMPLETION
3808
    monitor_printf(cur_mon, "input='%s' path='%s' prefix='%s'\n",
3809
                   input, path, file_prefix);
3810
#endif
3811
    ffs = opendir(path);
3812
    if (!ffs)
3813
        return;
3814
    for(;;) {
3815
        struct stat sb;
3816
        d = readdir(ffs);
3817
        if (!d)
3818
            break;
3819
        if (strstart(d->d_name, file_prefix, NULL)) {
3820
            memcpy(file, input, input_path_len);
3821
            if (input_path_len < sizeof(file))
3822
                pstrcpy(file + input_path_len, sizeof(file) - input_path_len,
3823
                        d->d_name);
3824
            /* stat the file to find out if it's a directory.
3825
             * In that case add a slash to speed up typing long paths
3826
             */
3827
            stat(file, &sb);
3828
            if(S_ISDIR(sb.st_mode))
3829
                pstrcat(file, sizeof(file), "/");
3830
            readline_add_completion(cur_mon->rs, file);
3831
        }
3832
    }
3833
    closedir(ffs);
3834
}
3835

    
3836
static void block_completion_it(void *opaque, BlockDriverState *bs)
3837
{
3838
    const char *name = bdrv_get_device_name(bs);
3839
    const char *input = opaque;
3840

    
3841
    if (input[0] == '\0' ||
3842
        !strncmp(name, (char *)input, strlen(input))) {
3843
        readline_add_completion(cur_mon->rs, name);
3844
    }
3845
}
3846

    
3847
/* NOTE: this parser is an approximate form of the real command parser */
3848
static void parse_cmdline(const char *cmdline,
3849
                         int *pnb_args, char **args)
3850
{
3851
    const char *p;
3852
    int nb_args, ret;
3853
    char buf[1024];
3854

    
3855
    p = cmdline;
3856
    nb_args = 0;
3857
    for(;;) {
3858
        while (qemu_isspace(*p))
3859
            p++;
3860
        if (*p == '\0')
3861
            break;
3862
        if (nb_args >= MAX_ARGS)
3863
            break;
3864
        ret = get_str(buf, sizeof(buf), &p);
3865
        args[nb_args] = qemu_strdup(buf);
3866
        nb_args++;
3867
        if (ret < 0)
3868
            break;
3869
    }
3870
    *pnb_args = nb_args;
3871
}
3872

    
3873
static const char *next_arg_type(const char *typestr)
3874
{
3875
    const char *p = strchr(typestr, ':');
3876
    return (p != NULL ? ++p : typestr);
3877
}
3878

    
3879
static void monitor_find_completion(const char *cmdline)
3880
{
3881
    const char *cmdname;
3882
    char *args[MAX_ARGS];
3883
    int nb_args, i, len;
3884
    const char *ptype, *str;
3885
    const mon_cmd_t *cmd;
3886
    const KeyDef *key;
3887

    
3888
    parse_cmdline(cmdline, &nb_args, args);
3889
#ifdef DEBUG_COMPLETION
3890
    for(i = 0; i < nb_args; i++) {
3891
        monitor_printf(cur_mon, "arg%d = '%s'\n", i, (char *)args[i]);
3892
    }
3893
#endif
3894

    
3895
    /* if the line ends with a space, it means we want to complete the
3896
       next arg */
3897
    len = strlen(cmdline);
3898
    if (len > 0 && qemu_isspace(cmdline[len - 1])) {
3899
        if (nb_args >= MAX_ARGS) {
3900
            goto cleanup;
3901
        }
3902
        args[nb_args++] = qemu_strdup("");
3903
    }
3904
    if (nb_args <= 1) {
3905
        /* command completion */
3906
        if (nb_args == 0)
3907
            cmdname = "";
3908
        else
3909
            cmdname = args[0];
3910
        readline_set_completion_index(cur_mon->rs, strlen(cmdname));
3911
        for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
3912
            cmd_completion(cmdname, cmd->name);
3913
        }
3914
    } else {
3915
        /* find the command */
3916
        for (cmd = mon_cmds; cmd->name != NULL; cmd++) {
3917
            if (compare_cmd(args[0], cmd->name)) {
3918
                break;
3919
            }
3920
        }
3921
        if (!cmd->name) {
3922
            goto cleanup;
3923
        }
3924

    
3925
        ptype = next_arg_type(cmd->args_type);
3926
        for(i = 0; i < nb_args - 2; i++) {
3927
            if (*ptype != '\0') {
3928
                ptype = next_arg_type(ptype);
3929
                while (*ptype == '?')
3930
                    ptype = next_arg_type(ptype);
3931
            }
3932
        }
3933
        str = args[nb_args - 1];
3934
        if (*ptype == '-' && ptype[1] != '\0') {
3935
            ptype = next_arg_type(ptype);
3936
        }
3937
        switch(*ptype) {
3938
        case 'F':
3939
            /* file completion */
3940
            readline_set_completion_index(cur_mon->rs, strlen(str));
3941
            file_completion(str);
3942
            break;
3943
        case 'B':
3944
            /* block device name completion */
3945
            readline_set_completion_index(cur_mon->rs, strlen(str));
3946
            bdrv_iterate(block_completion_it, (void *)str);
3947
            break;
3948
        case 's':
3949
            /* XXX: more generic ? */
3950
            if (!strcmp(cmd->name, "info")) {
3951
                readline_set_completion_index(cur_mon->rs, strlen(str));
3952
                for(cmd = info_cmds; cmd->name != NULL; cmd++) {
3953
                    cmd_completion(str, cmd->name);
3954
                }
3955
            } else if (!strcmp(cmd->name, "sendkey")) {
3956
                char *sep = strrchr(str, '-');
3957
                if (sep)
3958
                    str = sep + 1;
3959
                readline_set_completion_index(cur_mon->rs, strlen(str));
3960
                for(key = key_defs; key->name != NULL; key++) {
3961
                    cmd_completion(str, key->name);
3962
                }
3963
            } else if (!strcmp(cmd->name, "help|?")) {
3964
                readline_set_completion_index(cur_mon->rs, strlen(str));
3965
                for (cmd = mon_cmds; cmd->name != NULL; cmd++) {
3966
                    cmd_completion(str, cmd->name);
3967
                }
3968
            }
3969
            break;
3970
        default:
3971
            break;
3972
        }
3973
    }
3974

    
3975
cleanup:
3976
    for (i = 0; i < nb_args; i++) {
3977
        qemu_free(args[i]);
3978
    }
3979
}
3980

    
3981
static int monitor_can_read(void *opaque)
3982
{
3983
    Monitor *mon = opaque;
3984

    
3985
    return (mon->suspend_cnt == 0) ? 1 : 0;
3986
}
3987

    
3988
static int invalid_qmp_mode(const Monitor *mon, const char *cmd_name)
3989
{
3990
    int is_cap = compare_cmd(cmd_name, "qmp_capabilities");
3991
    return (qmp_cmd_mode(mon) ? is_cap : !is_cap);
3992
}
3993

    
3994
/*
3995
 * Argument validation rules:
3996
 *
3997
 * 1. The argument must exist in cmd_args qdict
3998
 * 2. The argument type must be the expected one
3999
 *
4000
 * Special case: If the argument doesn't exist in cmd_args and
4001
 *               the QMP_ACCEPT_UNKNOWNS flag is set, then the
4002
 *               checking is skipped for it.
4003
 */
4004
static int check_client_args_type(const QDict *client_args,
4005
                                  const QDict *cmd_args, int flags)
4006
{
4007
    const QDictEntry *ent;
4008

    
4009
    for (ent = qdict_first(client_args); ent;ent = qdict_next(client_args,ent)){
4010
        QObject *obj;
4011
        QString *arg_type;
4012
        const QObject *client_arg = qdict_entry_value(ent);
4013
        const char *client_arg_name = qdict_entry_key(ent);
4014

    
4015
        obj = qdict_get(cmd_args, client_arg_name);
4016
        if (!obj) {
4017
            if (flags & QMP_ACCEPT_UNKNOWNS) {
4018
                /* handler accepts unknowns */
4019
                continue;
4020
            }
4021
            /* client arg doesn't exist */
4022
            qerror_report(QERR_INVALID_PARAMETER, client_arg_name);
4023
            return -1;
4024
        }
4025

    
4026
        arg_type = qobject_to_qstring(obj);
4027
        assert(arg_type != NULL);
4028

    
4029
        /* check if argument's type is correct */
4030
        switch (qstring_get_str(arg_type)[0]) {
4031
        case 'F':
4032
        case 'B':
4033
        case 's':
4034
            if (qobject_type(client_arg) != QTYPE_QSTRING) {
4035
                qerror_report(QERR_INVALID_PARAMETER_TYPE, client_arg_name,
4036
                              "string");
4037
                return -1;
4038
            }
4039
        break;
4040
        case 'i':
4041
        case 'l':
4042
        case 'M':
4043
            if (qobject_type(client_arg) != QTYPE_QINT) {
4044
                qerror_report(QERR_INVALID_PARAMETER_TYPE, client_arg_name,
4045
                              "int");
4046
                return -1; 
4047
            }
4048
            break;
4049
        case 'f':
4050
        case 'T':
4051
            if (qobject_type(client_arg) != QTYPE_QINT &&
4052
                qobject_type(client_arg) != QTYPE_QFLOAT) {
4053
                qerror_report(QERR_INVALID_PARAMETER_TYPE, client_arg_name,
4054
                              "number");
4055
               return -1; 
4056
            }
4057
            break;
4058
        case 'b':
4059
        case '-':
4060
            if (qobject_type(client_arg) != QTYPE_QBOOL) {
4061
                qerror_report(QERR_INVALID_PARAMETER_TYPE, client_arg_name,
4062
                              "bool");
4063
               return -1; 
4064
            }
4065
            break;
4066
        case 'O':
4067
            assert(flags & QMP_ACCEPT_UNKNOWNS);
4068
            break;
4069
        case '/':
4070
        case '.':
4071
            /*
4072
             * These types are not supported by QMP and thus are not
4073
             * handled here. Fall through.
4074
             */
4075
        default:
4076
            abort();
4077
        }
4078
    }
4079

    
4080
    return 0;
4081
}
4082

    
4083
/*
4084
 * - Check if the client has passed all mandatory args
4085
 * - Set special flags for argument validation
4086
 */
4087
static int check_mandatory_args(const QDict *cmd_args,
4088
                                const QDict *client_args, int *flags)
4089
{
4090
    const QDictEntry *ent;
4091

    
4092
    for (ent = qdict_first(cmd_args); ent; ent = qdict_next(cmd_args, ent)) {
4093
        const char *cmd_arg_name = qdict_entry_key(ent);
4094
        QString *type = qobject_to_qstring(qdict_entry_value(ent));
4095
        assert(type != NULL);
4096

    
4097
        if (qstring_get_str(type)[0] == 'O') {
4098
            assert((*flags & QMP_ACCEPT_UNKNOWNS) == 0);
4099
            *flags |= QMP_ACCEPT_UNKNOWNS;
4100
        } else if (qstring_get_str(type)[0] != '-' &&
4101
                   qstring_get_str(type)[1] != '?' &&
4102
                   !qdict_haskey(client_args, cmd_arg_name)) {
4103
            qerror_report(QERR_MISSING_PARAMETER, cmd_arg_name);
4104
            return -1;
4105
        }
4106
    }
4107

    
4108
    return 0;
4109
}
4110

    
4111
static QDict *qdict_from_args_type(const char *args_type)
4112
{
4113
    int i;
4114
    QDict *qdict;
4115
    QString *key, *type, *cur_qs;
4116

    
4117
    assert(args_type != NULL);
4118

    
4119
    qdict = qdict_new();
4120

    
4121
    if (args_type == NULL || args_type[0] == '\0') {
4122
        /* no args, empty qdict */
4123
        goto out;
4124
    }
4125

    
4126
    key = qstring_new();
4127
    type = qstring_new();
4128

    
4129
    cur_qs = key;
4130

    
4131
    for (i = 0;; i++) {
4132
        switch (args_type[i]) {
4133
            case ',':
4134
            case '\0':
4135
                qdict_put(qdict, qstring_get_str(key), type);
4136
                QDECREF(key);
4137
                if (args_type[i] == '\0') {
4138
                    goto out;
4139
                }
4140
                type = qstring_new(); /* qdict has ref */
4141
                cur_qs = key = qstring_new();
4142
                break;
4143
            case ':':
4144
                cur_qs = type;
4145
                break;
4146
            default:
4147
                qstring_append_chr(cur_qs, args_type[i]);
4148
                break;
4149
        }
4150
    }
4151

    
4152
out:
4153
    return qdict;
4154
}
4155

    
4156
/*
4157
 * Client argument checking rules:
4158
 *
4159
 * 1. Client must provide all mandatory arguments
4160
 * 2. Each argument provided by the client must be expected
4161
 * 3. Each argument provided by the client must have the type expected
4162
 *    by the command
4163
 */
4164
static int qmp_check_client_args(const mon_cmd_t *cmd, QDict *client_args)
4165
{
4166
    int flags, err;
4167
    QDict *cmd_args;
4168

    
4169
    cmd_args = qdict_from_args_type(cmd->args_type);
4170

    
4171
    flags = 0;
4172
    err = check_mandatory_args(cmd_args, client_args, &flags);
4173
    if (err) {
4174
        goto out;
4175
    }
4176

    
4177
    err = check_client_args_type(client_args, cmd_args, flags);
4178

    
4179
out:
4180
    QDECREF(cmd_args);
4181
    return err;
4182
}
4183

    
4184
/*
4185
 * Input object checking rules
4186
 *
4187
 * 1. Input object must be a dict
4188
 * 2. The "execute" key must exist
4189
 * 3. The "execute" key must be a string
4190
 * 4. If the "arguments" key exists, it must be a dict
4191
 * 5. If the "id" key exists, it can be anything (ie. json-value)
4192
 * 6. Any argument not listed above is considered invalid
4193
 */
4194
static QDict *qmp_check_input_obj(QObject *input_obj)
4195
{
4196
    const QDictEntry *ent;
4197
    int has_exec_key = 0;
4198
    QDict *input_dict;
4199

    
4200
    if (qobject_type(input_obj) != QTYPE_QDICT) {
4201
        qerror_report(QERR_QMP_BAD_INPUT_OBJECT, "object");
4202
        return NULL;
4203
    }
4204

    
4205
    input_dict = qobject_to_qdict(input_obj);
4206

    
4207
    for (ent = qdict_first(input_dict); ent; ent = qdict_next(input_dict, ent)){
4208
        const char *arg_name = qdict_entry_key(ent);
4209
        const QObject *arg_obj = qdict_entry_value(ent);
4210

    
4211
        if (!strcmp(arg_name, "execute")) {
4212
            if (qobject_type(arg_obj) != QTYPE_QSTRING) {
4213
                qerror_report(QERR_QMP_BAD_INPUT_OBJECT_MEMBER, "execute",
4214
                              "string");
4215
                return NULL;
4216
            }
4217
            has_exec_key = 1;
4218
        } else if (!strcmp(arg_name, "arguments")) {
4219
            if (qobject_type(arg_obj) != QTYPE_QDICT) {
4220
                qerror_report(QERR_QMP_BAD_INPUT_OBJECT_MEMBER, "arguments",
4221
                              "object");
4222
                return NULL;
4223
            }
4224
        } else if (!strcmp(arg_name, "id")) {
4225
            /* FIXME: check duplicated IDs for async commands */
4226
        } else {
4227
            qerror_report(QERR_QMP_EXTRA_MEMBER, arg_name);
4228
            return NULL;
4229
        }
4230
    }
4231

    
4232
    if (!has_exec_key) {
4233
        qerror_report(QERR_QMP_BAD_INPUT_OBJECT, "execute");
4234
        return NULL;
4235
    }
4236

    
4237
    return input_dict;
4238
}
4239

    
4240
static void handle_qmp_command(JSONMessageParser *parser, QList *tokens)
4241
{
4242
    int err;
4243
    QObject *obj;
4244
    QDict *input, *args;
4245
    const mon_cmd_t *cmd;
4246
    Monitor *mon = cur_mon;
4247
    const char *cmd_name, *info_item;
4248

    
4249
    args = input = NULL;
4250

    
4251
    obj = json_parser_parse(tokens, NULL);
4252
    if (!obj) {
4253
        // FIXME: should be triggered in json_parser_parse()
4254
        qerror_report(QERR_JSON_PARSING);
4255
        goto err_out;
4256
    }
4257

    
4258
    input = qmp_check_input_obj(obj);
4259
    if (!input) {
4260
        qobject_decref(obj);
4261
        goto err_out;
4262
    }
4263

    
4264
    mon->mc->id = qdict_get(input, "id");
4265
    qobject_incref(mon->mc->id);
4266

    
4267
    cmd_name = qdict_get_str(input, "execute");
4268
    if (invalid_qmp_mode(mon, cmd_name)) {
4269
        qerror_report(QERR_COMMAND_NOT_FOUND, cmd_name);
4270
        goto err_out;
4271
    }
4272

    
4273
    /*
4274
     * XXX: We need this special case until we get info handlers
4275
     * converted into 'query-' commands
4276
     */
4277
    if (compare_cmd(cmd_name, "info")) {
4278
        qerror_report(QERR_COMMAND_NOT_FOUND, cmd_name);
4279
        goto err_out;
4280
    } else if (strstart(cmd_name, "query-", &info_item)) {
4281
        cmd = monitor_find_command("info");
4282
        qdict_put_obj(input, "arguments",
4283
                      qobject_from_jsonf("{ 'item': %s }", info_item));
4284
    } else {
4285
        cmd = monitor_find_command(cmd_name);
4286
        if (!cmd || !monitor_handler_ported(cmd)
4287
            || monitor_cmd_user_only(cmd)) {
4288
            qerror_report(QERR_COMMAND_NOT_FOUND, cmd_name);
4289
            goto err_out;
4290
        }
4291
    }
4292

    
4293
    obj = qdict_get(input, "arguments");
4294
    if (!obj) {
4295
        args = qdict_new();
4296
    } else {
4297
        args = qobject_to_qdict(obj);
4298
        QINCREF(args);
4299
    }
4300

    
4301
    err = qmp_check_client_args(cmd, args);
4302
    if (err < 0) {
4303
        goto err_out;
4304
    }
4305

    
4306
    if (monitor_handler_is_async(cmd)) {
4307
        err = qmp_async_cmd_handler(mon, cmd, args);
4308
        if (err) {
4309
            /* emit the error response */
4310
            goto err_out;
4311
        }
4312
    } else {
4313
        monitor_call_handler(mon, cmd, args);
4314
    }
4315

    
4316
    goto out;
4317

    
4318
err_out:
4319
    monitor_protocol_emitter(mon, NULL);
4320
out:
4321
    QDECREF(input);
4322
    QDECREF(args);
4323
}
4324

    
4325
/**
4326
 * monitor_control_read(): Read and handle QMP input
4327
 */
4328
static void monitor_control_read(void *opaque, const uint8_t *buf, int size)
4329
{
4330
    Monitor *old_mon = cur_mon;
4331

    
4332
    cur_mon = opaque;
4333

    
4334
    json_message_parser_feed(&cur_mon->mc->parser, (const char *) buf, size);
4335

    
4336
    cur_mon = old_mon;
4337
}
4338

    
4339
static void monitor_read(void *opaque, const uint8_t *buf, int size)
4340
{
4341
    Monitor *old_mon = cur_mon;
4342
    int i;
4343

    
4344
    cur_mon = opaque;
4345

    
4346
    if (cur_mon->rs) {
4347
        for (i = 0; i < size; i++)
4348
            readline_handle_byte(cur_mon->rs, buf[i]);
4349
    } else {
4350
        if (size == 0 || buf[size - 1] != 0)
4351
            monitor_printf(cur_mon, "corrupted command\n");
4352
        else
4353
            handle_user_command(cur_mon, (char *)buf);
4354
    }
4355

    
4356
    cur_mon = old_mon;
4357
}
4358

    
4359
static void monitor_command_cb(Monitor *mon, const char *cmdline, void *opaque)
4360
{
4361
    monitor_suspend(mon);
4362
    handle_user_command(mon, cmdline);
4363
    monitor_resume(mon);
4364
}
4365

    
4366
int monitor_suspend(Monitor *mon)
4367
{
4368
    if (!mon->rs)
4369
        return -ENOTTY;
4370
    mon->suspend_cnt++;
4371
    return 0;
4372
}
4373

    
4374
void monitor_resume(Monitor *mon)
4375
{
4376
    if (!mon->rs)
4377
        return;
4378
    if (--mon->suspend_cnt == 0)
4379
        readline_show_prompt(mon->rs);
4380
}
4381

    
4382
static QObject *get_qmp_greeting(void)
4383
{
4384
    QObject *ver;
4385

    
4386
    do_info_version(NULL, &ver);
4387
    return qobject_from_jsonf("{'QMP':{'version': %p,'capabilities': []}}",ver);
4388
}
4389

    
4390
/**
4391
 * monitor_control_event(): Print QMP gretting
4392
 */
4393
static void monitor_control_event(void *opaque, int event)
4394
{
4395
    QObject *data;
4396
    Monitor *mon = opaque;
4397

    
4398
    switch (event) {
4399
    case CHR_EVENT_OPENED:
4400
        mon->mc->command_mode = 0;
4401
        json_message_parser_init(&mon->mc->parser, handle_qmp_command);
4402
        data = get_qmp_greeting();
4403
        monitor_json_emitter(mon, data);
4404
        qobject_decref(data);
4405
        break;
4406
    case CHR_EVENT_CLOSED:
4407
        json_message_parser_destroy(&mon->mc->parser);
4408
        break;
4409
    }
4410
}
4411

    
4412
static void monitor_event(void *opaque, int event)
4413
{
4414
    Monitor *mon = opaque;
4415

    
4416
    switch (event) {
4417
    case CHR_EVENT_MUX_IN:
4418
        mon->mux_out = 0;
4419
        if (mon->reset_seen) {
4420
            readline_restart(mon->rs);
4421
            monitor_resume(mon);
4422
            monitor_flush(mon);
4423
        } else {
4424
            mon->suspend_cnt = 0;
4425
        }
4426
        break;
4427

    
4428
    case CHR_EVENT_MUX_OUT:
4429
        if (mon->reset_seen) {
4430
            if (mon->suspend_cnt == 0) {
4431
                monitor_printf(mon, "\n");
4432
            }
4433
            monitor_flush(mon);
4434
            monitor_suspend(mon);
4435
        } else {
4436
            mon->suspend_cnt++;
4437
        }
4438
        mon->mux_out = 1;
4439
        break;
4440

    
4441
    case CHR_EVENT_OPENED:
4442
        monitor_printf(mon, "QEMU %s monitor - type 'help' for more "
4443
                       "information\n", QEMU_VERSION);
4444
        if (!mon->mux_out) {
4445
            readline_show_prompt(mon->rs);
4446
        }
4447
        mon->reset_seen = 1;
4448
        break;
4449
    }
4450
}
4451

    
4452

    
4453
/*
4454
 * Local variables:
4455
 *  c-indent-level: 4
4456
 *  c-basic-offset: 4
4457
 *  tab-width: 8
4458
 * End:
4459
 */
4460

    
4461
void monitor_init(CharDriverState *chr, int flags)
4462
{
4463
    static int is_first_init = 1;
4464
    Monitor *mon;
4465

    
4466
    if (is_first_init) {
4467
        key_timer = qemu_new_timer(vm_clock, release_keys, NULL);
4468
        is_first_init = 0;
4469
    }
4470

    
4471
    mon = qemu_mallocz(sizeof(*mon));
4472

    
4473
    mon->chr = chr;
4474
    mon->flags = flags;
4475
    if (flags & MONITOR_USE_READLINE) {
4476
        mon->rs = readline_init(mon, monitor_find_completion);
4477
        monitor_read_command(mon, 0);
4478
    }
4479

    
4480
    if (monitor_ctrl_mode(mon)) {
4481
        mon->mc = qemu_mallocz(sizeof(MonitorControl));
4482
        /* Control mode requires special handlers */
4483
        qemu_chr_add_handlers(chr, monitor_can_read, monitor_control_read,
4484
                              monitor_control_event, mon);
4485
    } else {
4486
        qemu_chr_add_handlers(chr, monitor_can_read, monitor_read,
4487
                              monitor_event, mon);
4488
    }
4489

    
4490
    QLIST_INSERT_HEAD(&mon_list, mon, entry);
4491
    if (!default_mon || (flags & MONITOR_IS_DEFAULT))
4492
        default_mon = mon;
4493
}
4494

    
4495
static void bdrv_password_cb(Monitor *mon, const char *password, void *opaque)
4496
{
4497
    BlockDriverState *bs = opaque;
4498
    int ret = 0;
4499

    
4500
    if (bdrv_set_key(bs, password) != 0) {
4501
        monitor_printf(mon, "invalid password\n");
4502
        ret = -EPERM;
4503
    }
4504
    if (mon->password_completion_cb)
4505
        mon->password_completion_cb(mon->password_opaque, ret);
4506

    
4507
    monitor_read_command(mon, 1);
4508
}
4509

    
4510
int monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs,
4511
                                BlockDriverCompletionFunc *completion_cb,
4512
                                void *opaque)
4513
{
4514
    int err;
4515

    
4516
    if (!bdrv_key_required(bs)) {
4517
        if (completion_cb)
4518
            completion_cb(opaque, 0);
4519
        return 0;
4520
    }
4521

    
4522
    if (monitor_ctrl_mode(mon)) {
4523
        qerror_report(QERR_DEVICE_ENCRYPTED, bdrv_get_device_name(bs));
4524
        return -1;
4525
    }
4526

    
4527
    monitor_printf(mon, "%s (%s) is encrypted.\n", bdrv_get_device_name(bs),
4528
                   bdrv_get_encrypted_filename(bs));
4529

    
4530
    mon->password_completion_cb = completion_cb;
4531
    mon->password_opaque = opaque;
4532

    
4533
    err = monitor_read_password(mon, bdrv_password_cb, bs);
4534

    
4535
    if (err && completion_cb)
4536
        completion_cb(opaque, err);
4537

    
4538
    return err;
4539
}