Statistics
| Branch: | Revision:

root / monitor.c @ 5d6c37fb

History | View | Annotate | Download (96.5 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 "qemu-char.h"
36
#include "sysemu.h"
37
#include "monitor.h"
38
#include "readline.h"
39
#include "console.h"
40
#include "block.h"
41
#include "audio/audio.h"
42
#include "disas.h"
43
#include "balloon.h"
44
#include "qemu-timer.h"
45
#include "migration.h"
46
#include "kvm.h"
47
#include "acl.h"
48
#include "qint.h"
49
#include "qlist.h"
50
#include "qdict.h"
51
#include "qstring.h"
52
#include "qerror.h"
53

    
54
//#define DEBUG
55
//#define DEBUG_COMPLETION
56

    
57
/*
58
 * Supported types:
59
 *
60
 * 'F'          filename
61
 * 'B'          block device name
62
 * 's'          string (accept optional quote)
63
 * 'i'          32 bit integer
64
 * 'l'          target long (32 or 64 bit)
65
 * '/'          optional gdb-like print format (like "/10x")
66
 *
67
 * '?'          optional type (for all types, except '/')
68
 * '.'          other form of optional type (for 'i' and 'l')
69
 * '-'          optional parameter (eg. '-f')
70
 *
71
 */
72

    
73
typedef struct mon_cmd_t {
74
    const char *name;
75
    const char *args_type;
76
    const char *params;
77
    const char *help;
78
    void (*user_print)(Monitor *mon, const QObject *data);
79
    union {
80
        void (*info)(Monitor *mon);
81
        void (*info_new)(Monitor *mon, QObject **ret_data);
82
        void (*cmd)(Monitor *mon, const QDict *qdict);
83
        void (*cmd_new)(Monitor *mon, const QDict *params, QObject **ret_data);
84
    } mhandler;
85
} mon_cmd_t;
86

    
87
/* file descriptors passed via SCM_RIGHTS */
88
typedef struct mon_fd_t mon_fd_t;
89
struct mon_fd_t {
90
    char *name;
91
    int fd;
92
    QLIST_ENTRY(mon_fd_t) next;
93
};
94

    
95
struct Monitor {
96
    CharDriverState *chr;
97
    int mux_out;
98
    int reset_seen;
99
    int flags;
100
    int suspend_cnt;
101
    uint8_t outbuf[1024];
102
    int outbuf_index;
103
    ReadLineState *rs;
104
    CPUState *mon_cpu;
105
    BlockDriverCompletionFunc *password_completion_cb;
106
    void *password_opaque;
107
    QError *error;
108
    QLIST_HEAD(,mon_fd_t) fds;
109
    QLIST_ENTRY(Monitor) entry;
110
};
111

    
112
static QLIST_HEAD(mon_list, Monitor) mon_list;
113

    
114
static const mon_cmd_t mon_cmds[];
115
static const mon_cmd_t info_cmds[];
116

    
117
Monitor *cur_mon = NULL;
118

    
119
static void monitor_command_cb(Monitor *mon, const char *cmdline,
120
                               void *opaque);
121

    
122
static void monitor_read_command(Monitor *mon, int show_prompt)
123
{
124
    readline_start(mon->rs, "(qemu) ", 0, monitor_command_cb, NULL);
125
    if (show_prompt)
126
        readline_show_prompt(mon->rs);
127
}
128

    
129
static int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
130
                                 void *opaque)
131
{
132
    if (mon->rs) {
133
        readline_start(mon->rs, "Password: ", 1, readline_func, opaque);
134
        /* prompt is printed on return from the command handler */
135
        return 0;
136
    } else {
137
        monitor_printf(mon, "terminal does not support password prompting\n");
138
        return -ENOTTY;
139
    }
140
}
141

    
142
void monitor_flush(Monitor *mon)
143
{
144
    if (mon && mon->outbuf_index != 0 && !mon->mux_out) {
145
        qemu_chr_write(mon->chr, mon->outbuf, mon->outbuf_index);
146
        mon->outbuf_index = 0;
147
    }
148
}
149

    
150
/* flush at every end of line or if the buffer is full */
151
static void monitor_puts(Monitor *mon, const char *str)
152
{
153
    char c;
154

    
155
    if (!mon)
156
        return;
157

    
158
    for(;;) {
159
        c = *str++;
160
        if (c == '\0')
161
            break;
162
        if (c == '\n')
163
            mon->outbuf[mon->outbuf_index++] = '\r';
164
        mon->outbuf[mon->outbuf_index++] = c;
165
        if (mon->outbuf_index >= (sizeof(mon->outbuf) - 1)
166
            || c == '\n')
167
            monitor_flush(mon);
168
    }
169
}
170

    
171
void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
172
{
173
    char buf[4096];
174
    vsnprintf(buf, sizeof(buf), fmt, ap);
175
    monitor_puts(mon, buf);
176
}
177

    
178
void monitor_printf(Monitor *mon, const char *fmt, ...)
179
{
180
    va_list ap;
181
    va_start(ap, fmt);
182
    monitor_vprintf(mon, fmt, ap);
183
    va_end(ap);
184
}
185

    
186
void monitor_print_filename(Monitor *mon, const char *filename)
187
{
188
    int i;
189

    
190
    for (i = 0; filename[i]; i++) {
191
        switch (filename[i]) {
192
        case ' ':
193
        case '"':
194
        case '\\':
195
            monitor_printf(mon, "\\%c", filename[i]);
196
            break;
197
        case '\t':
198
            monitor_printf(mon, "\\t");
199
            break;
200
        case '\r':
201
            monitor_printf(mon, "\\r");
202
            break;
203
        case '\n':
204
            monitor_printf(mon, "\\n");
205
            break;
206
        default:
207
            monitor_printf(mon, "%c", filename[i]);
208
            break;
209
        }
210
    }
211
}
212

    
213
static int monitor_fprintf(FILE *stream, const char *fmt, ...)
214
{
215
    va_list ap;
216
    va_start(ap, fmt);
217
    monitor_vprintf((Monitor *)stream, fmt, ap);
218
    va_end(ap);
219
    return 0;
220
}
221

    
222
static void monitor_user_noop(Monitor *mon, const QObject *data) { }
223

    
224
static inline int monitor_handler_ported(const mon_cmd_t *cmd)
225
{
226
    return cmd->user_print != NULL;
227
}
228

    
229
static inline int monitor_has_error(const Monitor *mon)
230
{
231
    return mon->error != NULL;
232
}
233

    
234
static void monitor_print_qobject(Monitor *mon, const QObject *data)
235
{
236
    switch (qobject_type(data)) {
237
        case QTYPE_QSTRING:
238
            monitor_printf(mon, "%s",qstring_get_str(qobject_to_qstring(data)));
239
            break;
240
        case QTYPE_QINT:
241
            monitor_printf(mon, "%" PRId64,qint_get_int(qobject_to_qint(data)));
242
            break;
243
        default:
244
            monitor_printf(mon, "ERROR: unsupported type: %d",
245
                                                        qobject_type(data));
246
            break;
247
    }
248

    
249
    monitor_puts(mon, "\n");
250
}
251

    
252
static int compare_cmd(const char *name, const char *list)
253
{
254
    const char *p, *pstart;
255
    int len;
256
    len = strlen(name);
257
    p = list;
258
    for(;;) {
259
        pstart = p;
260
        p = strchr(p, '|');
261
        if (!p)
262
            p = pstart + strlen(pstart);
263
        if ((p - pstart) == len && !memcmp(pstart, name, len))
264
            return 1;
265
        if (*p == '\0')
266
            break;
267
        p++;
268
    }
269
    return 0;
270
}
271

    
272
static void help_cmd_dump(Monitor *mon, const mon_cmd_t *cmds,
273
                          const char *prefix, const char *name)
274
{
275
    const mon_cmd_t *cmd;
276

    
277
    for(cmd = cmds; cmd->name != NULL; cmd++) {
278
        if (!name || !strcmp(name, cmd->name))
279
            monitor_printf(mon, "%s%s %s -- %s\n", prefix, cmd->name,
280
                           cmd->params, cmd->help);
281
    }
282
}
283

    
284
static void help_cmd(Monitor *mon, const char *name)
285
{
286
    if (name && !strcmp(name, "info")) {
287
        help_cmd_dump(mon, info_cmds, "info ", NULL);
288
    } else {
289
        help_cmd_dump(mon, mon_cmds, "", name);
290
        if (name && !strcmp(name, "log")) {
291
            const CPULogItem *item;
292
            monitor_printf(mon, "Log items (comma separated):\n");
293
            monitor_printf(mon, "%-10s %s\n", "none", "remove all logs");
294
            for(item = cpu_log_items; item->mask != 0; item++) {
295
                monitor_printf(mon, "%-10s %s\n", item->name, item->help);
296
            }
297
        }
298
    }
299
}
300

    
301
static void do_help_cmd(Monitor *mon, const QDict *qdict)
302
{
303
    help_cmd(mon, qdict_get_try_str(qdict, "name"));
304
}
305

    
306
static void do_commit(Monitor *mon, const QDict *qdict)
307
{
308
    int all_devices;
309
    DriveInfo *dinfo;
310
    const char *device = qdict_get_str(qdict, "device");
311

    
312
    all_devices = !strcmp(device, "all");
313
    QTAILQ_FOREACH(dinfo, &drives, next) {
314
        if (!all_devices)
315
            if (strcmp(bdrv_get_device_name(dinfo->bdrv), device))
316
                continue;
317
        bdrv_commit(dinfo->bdrv);
318
    }
319
}
320

    
321
static void do_info(Monitor *mon, const QDict *qdict, QObject **ret_data)
322
{
323
    const mon_cmd_t *cmd;
324
    const char *item = qdict_get_try_str(qdict, "item");
325

    
326
    if (!item)
327
        goto help;
328

    
329
    for (cmd = info_cmds; cmd->name != NULL; cmd++) {
330
        if (compare_cmd(item, cmd->name))
331
            break;
332
    }
333

    
334
    if (cmd->name == NULL)
335
        goto help;
336

    
337
    if (monitor_handler_ported(cmd)) {
338
        cmd->mhandler.info_new(mon, ret_data);
339
        if (*ret_data)
340
            cmd->user_print(mon, *ret_data);
341
    } else {
342
        cmd->mhandler.info(mon);
343
    }
344

    
345
    return;
346

    
347
help:
348
    help_cmd(mon, "info");
349
}
350

    
351
/**
352
 * do_info_version(): Show QEMU version
353
 */
354
static void do_info_version(Monitor *mon, QObject **ret_data)
355
{
356
    *ret_data = QOBJECT(qstring_from_str(QEMU_VERSION QEMU_PKGVERSION));
357
}
358

    
359
static void do_info_name(Monitor *mon)
360
{
361
    if (qemu_name)
362
        monitor_printf(mon, "%s\n", qemu_name);
363
}
364

    
365
#if defined(TARGET_I386)
366
static void do_info_hpet(Monitor *mon)
367
{
368
    monitor_printf(mon, "HPET is %s by QEMU\n",
369
                   (no_hpet) ? "disabled" : "enabled");
370
}
371
#endif
372

    
373
static void do_info_uuid(Monitor *mon)
374
{
375
    monitor_printf(mon, UUID_FMT "\n", qemu_uuid[0], qemu_uuid[1],
376
                   qemu_uuid[2], qemu_uuid[3], qemu_uuid[4], qemu_uuid[5],
377
                   qemu_uuid[6], qemu_uuid[7], qemu_uuid[8], qemu_uuid[9],
378
                   qemu_uuid[10], qemu_uuid[11], qemu_uuid[12], qemu_uuid[13],
379
                   qemu_uuid[14], qemu_uuid[15]);
380
}
381

    
382
/* get the current CPU defined by the user */
383
static int mon_set_cpu(int cpu_index)
384
{
385
    CPUState *env;
386

    
387
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
388
        if (env->cpu_index == cpu_index) {
389
            cur_mon->mon_cpu = env;
390
            return 0;
391
        }
392
    }
393
    return -1;
394
}
395

    
396
static CPUState *mon_get_cpu(void)
397
{
398
    if (!cur_mon->mon_cpu) {
399
        mon_set_cpu(0);
400
    }
401
    cpu_synchronize_state(cur_mon->mon_cpu);
402
    return cur_mon->mon_cpu;
403
}
404

    
405
static void do_info_registers(Monitor *mon)
406
{
407
    CPUState *env;
408
    env = mon_get_cpu();
409
    if (!env)
410
        return;
411
#ifdef TARGET_I386
412
    cpu_dump_state(env, (FILE *)mon, monitor_fprintf,
413
                   X86_DUMP_FPU);
414
#else
415
    cpu_dump_state(env, (FILE *)mon, monitor_fprintf,
416
                   0);
417
#endif
418
}
419

    
420
static void print_cpu_iter(QObject *obj, void *opaque)
421
{
422
    QDict *cpu;
423
    int active = ' ';
424
    Monitor *mon = opaque;
425

    
426
    assert(qobject_type(obj) == QTYPE_QDICT);
427
    cpu = qobject_to_qdict(obj);
428

    
429
    if (strcmp(qdict_get_str(cpu, "current"), "yes") == 0)
430
        active = '*';
431

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

    
434
#if defined(TARGET_I386)
435
    monitor_printf(mon, "pc=0x" TARGET_FMT_lx,
436
                   (target_ulong) qdict_get_int(cpu, "pc"));
437
#elif defined(TARGET_PPC)
438
    monitor_printf(mon, "nip=0x" TARGET_FMT_lx,
439
                   (target_long) qdict_get_int(cpu, "nip"));
440
#elif defined(TARGET_SPARC)
441
    monitor_printf(mon, "pc=0x " TARGET_FMT_lx,
442
                   (target_long) qdict_get_int(cpu, "pc"));
443
    monitor_printf(mon, "npc=0x" TARGET_FMT_lx,
444
                   (target_long) qdict_get_int(cpu, "npc"));
445
#elif defined(TARGET_MIPS)
446
    monitor_printf(mon, "PC=0x" TARGET_FMT_lx,
447
                   (target_long) qdict_get_int(cpu, "PC"));
448
#endif
449

    
450
    if (strcmp(qdict_get_str(cpu, "halted"), "yes") == 0)
451
        monitor_printf(mon, " (halted)");
452

    
453
    monitor_printf(mon, "\n");
454
}
455

    
456
static void monitor_print_cpus(Monitor *mon, const QObject *data)
457
{
458
    QList *cpu_list;
459

    
460
    assert(qobject_type(data) == QTYPE_QLIST);
461
    cpu_list = qobject_to_qlist(data);
462
    qlist_iter(cpu_list, print_cpu_iter, mon);
463
}
464

    
465
/**
466
 * do_info_cpus(): Show CPU information
467
 *
468
 * Return a QList with a QDict for each CPU.
469
 *
470
 * For example:
471
 *
472
 * [ { "CPU": 0, "current": "yes", "pc": 0x..., "halted": "no" },
473
 *   { "CPU": 1, "current": "no",  "pc": 0x..., "halted": "yes" } ]
474
 */
475
static void do_info_cpus(Monitor *mon, QObject **ret_data)
476
{
477
    CPUState *env;
478
    QList *cpu_list;
479

    
480
    cpu_list = qlist_new();
481

    
482
    /* just to set the default cpu if not already done */
483
    mon_get_cpu();
484

    
485
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
486
        const char *answer;
487
        QDict *cpu = qdict_new();
488

    
489
        cpu_synchronize_state(env);
490

    
491
        qdict_put(cpu, "CPU", qint_from_int(env->cpu_index));
492
        answer = (env == mon->mon_cpu) ? "yes" : "no";
493
        qdict_put(cpu, "current", qstring_from_str(answer));
494

    
495
#if defined(TARGET_I386)
496
        qdict_put(cpu, "pc", qint_from_int(env->eip + env->segs[R_CS].base));
497
#elif defined(TARGET_PPC)
498
        qdict_put(cpu, "nip", qint_from_int(env->nip));
499
#elif defined(TARGET_SPARC)
500
        qdict_put(cpu, "pc", qint_from_int(env->pc));
501
        qdict_put(cpu, "npc", qint_from_int(env->npc));
502
#elif defined(TARGET_MIPS)
503
        qdict_put(cpu, "PC", qint_from_int(env->active_tc.PC));
504
#endif
505
        answer = env->halted ? "yes" : "no";
506
        qdict_put(cpu, "halted", qstring_from_str(answer));
507

    
508
        qlist_append(cpu_list, cpu);
509
    }
510

    
511
    *ret_data = QOBJECT(cpu_list);
512
}
513

    
514
static void do_cpu_set(Monitor *mon, const QDict *qdict)
515
{
516
    int index = qdict_get_int(qdict, "index");
517
    if (mon_set_cpu(index) < 0)
518
        monitor_printf(mon, "Invalid CPU index\n");
519
}
520

    
521
static void do_info_jit(Monitor *mon)
522
{
523
    dump_exec_info((FILE *)mon, monitor_fprintf);
524
}
525

    
526
static void do_info_history(Monitor *mon)
527
{
528
    int i;
529
    const char *str;
530

    
531
    if (!mon->rs)
532
        return;
533
    i = 0;
534
    for(;;) {
535
        str = readline_get_history(mon->rs, i);
536
        if (!str)
537
            break;
538
        monitor_printf(mon, "%d: '%s'\n", i, str);
539
        i++;
540
    }
541
}
542

    
543
#if defined(TARGET_PPC)
544
/* XXX: not implemented in other targets */
545
static void do_info_cpu_stats(Monitor *mon)
546
{
547
    CPUState *env;
548

    
549
    env = mon_get_cpu();
550
    cpu_dump_statistics(env, (FILE *)mon, &monitor_fprintf, 0);
551
}
552
#endif
553

    
554
/**
555
 * do_quit(): Quit QEMU execution
556
 */
557
static void do_quit(Monitor *mon, const QDict *qdict, QObject **ret_data)
558
{
559
    exit(0);
560
}
561

    
562
static int eject_device(Monitor *mon, BlockDriverState *bs, int force)
563
{
564
    if (bdrv_is_inserted(bs)) {
565
        if (!force) {
566
            if (!bdrv_is_removable(bs)) {
567
                monitor_printf(mon, "device is not removable\n");
568
                return -1;
569
            }
570
            if (bdrv_is_locked(bs)) {
571
                monitor_printf(mon, "device is locked\n");
572
                return -1;
573
            }
574
        }
575
        bdrv_close(bs);
576
    }
577
    return 0;
578
}
579

    
580
static void do_eject(Monitor *mon, const QDict *qdict, QObject **ret_data)
581
{
582
    BlockDriverState *bs;
583
    int force = qdict_get_int(qdict, "force");
584
    const char *filename = qdict_get_str(qdict, "filename");
585

    
586
    bs = bdrv_find(filename);
587
    if (!bs) {
588
        monitor_printf(mon, "device not found\n");
589
        return;
590
    }
591
    eject_device(mon, bs, force);
592
}
593

    
594
static void do_change_block(Monitor *mon, const char *device,
595
                            const char *filename, const char *fmt)
596
{
597
    BlockDriverState *bs;
598
    BlockDriver *drv = NULL;
599

    
600
    bs = bdrv_find(device);
601
    if (!bs) {
602
        monitor_printf(mon, "device not found\n");
603
        return;
604
    }
605
    if (fmt) {
606
        drv = bdrv_find_whitelisted_format(fmt);
607
        if (!drv) {
608
            monitor_printf(mon, "invalid format %s\n", fmt);
609
            return;
610
        }
611
    }
612
    if (eject_device(mon, bs, 0) < 0)
613
        return;
614
    bdrv_open2(bs, filename, 0, drv);
615
    monitor_read_bdrv_key_start(mon, bs, NULL, NULL);
616
}
617

    
618
static void change_vnc_password_cb(Monitor *mon, const char *password,
619
                                   void *opaque)
620
{
621
    if (vnc_display_password(NULL, password) < 0)
622
        monitor_printf(mon, "could not set VNC server password\n");
623

    
624
    monitor_read_command(mon, 1);
625
}
626

    
627
static void do_change_vnc(Monitor *mon, const char *target, const char *arg)
628
{
629
    if (strcmp(target, "passwd") == 0 ||
630
        strcmp(target, "password") == 0) {
631
        if (arg) {
632
            char password[9];
633
            strncpy(password, arg, sizeof(password));
634
            password[sizeof(password) - 1] = '\0';
635
            change_vnc_password_cb(mon, password, NULL);
636
        } else {
637
            monitor_read_password(mon, change_vnc_password_cb, NULL);
638
        }
639
    } else {
640
        if (vnc_display_open(NULL, target) < 0)
641
            monitor_printf(mon, "could not start VNC server on %s\n", target);
642
    }
643
}
644

    
645
static void do_change(Monitor *mon, const QDict *qdict)
646
{
647
    const char *device = qdict_get_str(qdict, "device");
648
    const char *target = qdict_get_str(qdict, "target");
649
    const char *arg = qdict_get_try_str(qdict, "arg");
650
    if (strcmp(device, "vnc") == 0) {
651
        do_change_vnc(mon, target, arg);
652
    } else {
653
        do_change_block(mon, device, target, arg);
654
    }
655
}
656

    
657
static void do_screen_dump(Monitor *mon, const QDict *qdict)
658
{
659
    vga_hw_screen_dump(qdict_get_str(qdict, "filename"));
660
}
661

    
662
static void do_logfile(Monitor *mon, const QDict *qdict)
663
{
664
    cpu_set_log_filename(qdict_get_str(qdict, "filename"));
665
}
666

    
667
static void do_log(Monitor *mon, const QDict *qdict)
668
{
669
    int mask;
670
    const char *items = qdict_get_str(qdict, "items");
671

    
672
    if (!strcmp(items, "none")) {
673
        mask = 0;
674
    } else {
675
        mask = cpu_str_to_log_mask(items);
676
        if (!mask) {
677
            help_cmd(mon, "log");
678
            return;
679
        }
680
    }
681
    cpu_set_log(mask);
682
}
683

    
684
static void do_singlestep(Monitor *mon, const QDict *qdict)
685
{
686
    const char *option = qdict_get_try_str(qdict, "option");
687
    if (!option || !strcmp(option, "on")) {
688
        singlestep = 1;
689
    } else if (!strcmp(option, "off")) {
690
        singlestep = 0;
691
    } else {
692
        monitor_printf(mon, "unexpected option %s\n", option);
693
    }
694
}
695

    
696
/**
697
 * do_stop(): Stop VM execution
698
 */
699
static void do_stop(Monitor *mon, const QDict *qdict, QObject **ret_data)
700
{
701
    vm_stop(EXCP_INTERRUPT);
702
}
703

    
704
static void encrypted_bdrv_it(void *opaque, BlockDriverState *bs);
705

    
706
struct bdrv_iterate_context {
707
    Monitor *mon;
708
    int err;
709
};
710

    
711
/**
712
 * do_cont(): Resume emulation.
713
 */
714
static void do_cont(Monitor *mon, const QDict *qdict, QObject **ret_data)
715
{
716
    struct bdrv_iterate_context context = { mon, 0 };
717

    
718
    bdrv_iterate(encrypted_bdrv_it, &context);
719
    /* only resume the vm if all keys are set and valid */
720
    if (!context.err)
721
        vm_start();
722
}
723

    
724
static void bdrv_key_cb(void *opaque, int err)
725
{
726
    Monitor *mon = opaque;
727

    
728
    /* another key was set successfully, retry to continue */
729
    if (!err)
730
        do_cont(mon, NULL, NULL);
731
}
732

    
733
static void encrypted_bdrv_it(void *opaque, BlockDriverState *bs)
734
{
735
    struct bdrv_iterate_context *context = opaque;
736

    
737
    if (!context->err && bdrv_key_required(bs)) {
738
        context->err = -EBUSY;
739
        monitor_read_bdrv_key_start(context->mon, bs, bdrv_key_cb,
740
                                    context->mon);
741
    }
742
}
743

    
744
static void do_gdbserver(Monitor *mon, const QDict *qdict)
745
{
746
    const char *device = qdict_get_try_str(qdict, "device");
747
    if (!device)
748
        device = "tcp::" DEFAULT_GDBSTUB_PORT;
749
    if (gdbserver_start(device) < 0) {
750
        monitor_printf(mon, "Could not open gdbserver on device '%s'\n",
751
                       device);
752
    } else if (strcmp(device, "none") == 0) {
753
        monitor_printf(mon, "Disabled gdbserver\n");
754
    } else {
755
        monitor_printf(mon, "Waiting for gdb connection on device '%s'\n",
756
                       device);
757
    }
758
}
759

    
760
static void do_watchdog_action(Monitor *mon, const QDict *qdict)
761
{
762
    const char *action = qdict_get_str(qdict, "action");
763
    if (select_watchdog_action(action) == -1) {
764
        monitor_printf(mon, "Unknown watchdog action '%s'\n", action);
765
    }
766
}
767

    
768
static void monitor_printc(Monitor *mon, int c)
769
{
770
    monitor_printf(mon, "'");
771
    switch(c) {
772
    case '\'':
773
        monitor_printf(mon, "\\'");
774
        break;
775
    case '\\':
776
        monitor_printf(mon, "\\\\");
777
        break;
778
    case '\n':
779
        monitor_printf(mon, "\\n");
780
        break;
781
    case '\r':
782
        monitor_printf(mon, "\\r");
783
        break;
784
    default:
785
        if (c >= 32 && c <= 126) {
786
            monitor_printf(mon, "%c", c);
787
        } else {
788
            monitor_printf(mon, "\\x%02x", c);
789
        }
790
        break;
791
    }
792
    monitor_printf(mon, "'");
793
}
794

    
795
static void memory_dump(Monitor *mon, int count, int format, int wsize,
796
                        target_phys_addr_t addr, int is_physical)
797
{
798
    CPUState *env;
799
    int nb_per_line, l, line_size, i, max_digits, len;
800
    uint8_t buf[16];
801
    uint64_t v;
802

    
803
    if (format == 'i') {
804
        int flags;
805
        flags = 0;
806
        env = mon_get_cpu();
807
        if (!env && !is_physical)
808
            return;
809
#ifdef TARGET_I386
810
        if (wsize == 2) {
811
            flags = 1;
812
        } else if (wsize == 4) {
813
            flags = 0;
814
        } else {
815
            /* as default we use the current CS size */
816
            flags = 0;
817
            if (env) {
818
#ifdef TARGET_X86_64
819
                if ((env->efer & MSR_EFER_LMA) &&
820
                    (env->segs[R_CS].flags & DESC_L_MASK))
821
                    flags = 2;
822
                else
823
#endif
824
                if (!(env->segs[R_CS].flags & DESC_B_MASK))
825
                    flags = 1;
826
            }
827
        }
828
#endif
829
        monitor_disas(mon, env, addr, count, is_physical, flags);
830
        return;
831
    }
832

    
833
    len = wsize * count;
834
    if (wsize == 1)
835
        line_size = 8;
836
    else
837
        line_size = 16;
838
    nb_per_line = line_size / wsize;
839
    max_digits = 0;
840

    
841
    switch(format) {
842
    case 'o':
843
        max_digits = (wsize * 8 + 2) / 3;
844
        break;
845
    default:
846
    case 'x':
847
        max_digits = (wsize * 8) / 4;
848
        break;
849
    case 'u':
850
    case 'd':
851
        max_digits = (wsize * 8 * 10 + 32) / 33;
852
        break;
853
    case 'c':
854
        wsize = 1;
855
        break;
856
    }
857

    
858
    while (len > 0) {
859
        if (is_physical)
860
            monitor_printf(mon, TARGET_FMT_plx ":", addr);
861
        else
862
            monitor_printf(mon, TARGET_FMT_lx ":", (target_ulong)addr);
863
        l = len;
864
        if (l > line_size)
865
            l = line_size;
866
        if (is_physical) {
867
            cpu_physical_memory_rw(addr, buf, l, 0);
868
        } else {
869
            env = mon_get_cpu();
870
            if (!env)
871
                break;
872
            if (cpu_memory_rw_debug(env, addr, buf, l, 0) < 0) {
873
                monitor_printf(mon, " Cannot access memory\n");
874
                break;
875
            }
876
        }
877
        i = 0;
878
        while (i < l) {
879
            switch(wsize) {
880
            default:
881
            case 1:
882
                v = ldub_raw(buf + i);
883
                break;
884
            case 2:
885
                v = lduw_raw(buf + i);
886
                break;
887
            case 4:
888
                v = (uint32_t)ldl_raw(buf + i);
889
                break;
890
            case 8:
891
                v = ldq_raw(buf + i);
892
                break;
893
            }
894
            monitor_printf(mon, " ");
895
            switch(format) {
896
            case 'o':
897
                monitor_printf(mon, "%#*" PRIo64, max_digits, v);
898
                break;
899
            case 'x':
900
                monitor_printf(mon, "0x%0*" PRIx64, max_digits, v);
901
                break;
902
            case 'u':
903
                monitor_printf(mon, "%*" PRIu64, max_digits, v);
904
                break;
905
            case 'd':
906
                monitor_printf(mon, "%*" PRId64, max_digits, v);
907
                break;
908
            case 'c':
909
                monitor_printc(mon, v);
910
                break;
911
            }
912
            i += wsize;
913
        }
914
        monitor_printf(mon, "\n");
915
        addr += l;
916
        len -= l;
917
    }
918
}
919

    
920
static void do_memory_dump(Monitor *mon, const QDict *qdict)
921
{
922
    int count = qdict_get_int(qdict, "count");
923
    int format = qdict_get_int(qdict, "format");
924
    int size = qdict_get_int(qdict, "size");
925
    target_long addr = qdict_get_int(qdict, "addr");
926

    
927
    memory_dump(mon, count, format, size, addr, 0);
928
}
929

    
930
static void do_physical_memory_dump(Monitor *mon, const QDict *qdict)
931
{
932
    int count = qdict_get_int(qdict, "count");
933
    int format = qdict_get_int(qdict, "format");
934
    int size = qdict_get_int(qdict, "size");
935
    target_phys_addr_t addr = qdict_get_int(qdict, "addr");
936

    
937
    memory_dump(mon, count, format, size, addr, 1);
938
}
939

    
940
static void do_print(Monitor *mon, const QDict *qdict)
941
{
942
    int format = qdict_get_int(qdict, "format");
943
    target_phys_addr_t val = qdict_get_int(qdict, "val");
944

    
945
#if TARGET_PHYS_ADDR_BITS == 32
946
    switch(format) {
947
    case 'o':
948
        monitor_printf(mon, "%#o", val);
949
        break;
950
    case 'x':
951
        monitor_printf(mon, "%#x", val);
952
        break;
953
    case 'u':
954
        monitor_printf(mon, "%u", val);
955
        break;
956
    default:
957
    case 'd':
958
        monitor_printf(mon, "%d", val);
959
        break;
960
    case 'c':
961
        monitor_printc(mon, val);
962
        break;
963
    }
964
#else
965
    switch(format) {
966
    case 'o':
967
        monitor_printf(mon, "%#" PRIo64, val);
968
        break;
969
    case 'x':
970
        monitor_printf(mon, "%#" PRIx64, val);
971
        break;
972
    case 'u':
973
        monitor_printf(mon, "%" PRIu64, val);
974
        break;
975
    default:
976
    case 'd':
977
        monitor_printf(mon, "%" PRId64, val);
978
        break;
979
    case 'c':
980
        monitor_printc(mon, val);
981
        break;
982
    }
983
#endif
984
    monitor_printf(mon, "\n");
985
}
986

    
987
static void do_memory_save(Monitor *mon, const QDict *qdict, QObject **ret_data)
988
{
989
    FILE *f;
990
    uint32_t size = qdict_get_int(qdict, "size");
991
    const char *filename = qdict_get_str(qdict, "filename");
992
    target_long addr = qdict_get_int(qdict, "val");
993
    uint32_t l;
994
    CPUState *env;
995
    uint8_t buf[1024];
996

    
997
    env = mon_get_cpu();
998
    if (!env)
999
        return;
1000

    
1001
    f = fopen(filename, "wb");
1002
    if (!f) {
1003
        monitor_printf(mon, "could not open '%s'\n", filename);
1004
        return;
1005
    }
1006
    while (size != 0) {
1007
        l = sizeof(buf);
1008
        if (l > size)
1009
            l = size;
1010
        cpu_memory_rw_debug(env, addr, buf, l, 0);
1011
        fwrite(buf, 1, l, f);
1012
        addr += l;
1013
        size -= l;
1014
    }
1015
    fclose(f);
1016
}
1017

    
1018
static void do_physical_memory_save(Monitor *mon, const QDict *qdict,
1019
                                    QObject **ret_data)
1020
{
1021
    FILE *f;
1022
    uint32_t l;
1023
    uint8_t buf[1024];
1024
    uint32_t size = qdict_get_int(qdict, "size");
1025
    const char *filename = qdict_get_str(qdict, "filename");
1026
    target_phys_addr_t addr = qdict_get_int(qdict, "val");
1027

    
1028
    f = fopen(filename, "wb");
1029
    if (!f) {
1030
        monitor_printf(mon, "could not open '%s'\n", filename);
1031
        return;
1032
    }
1033
    while (size != 0) {
1034
        l = sizeof(buf);
1035
        if (l > size)
1036
            l = size;
1037
        cpu_physical_memory_rw(addr, buf, l, 0);
1038
        fwrite(buf, 1, l, f);
1039
        fflush(f);
1040
        addr += l;
1041
        size -= l;
1042
    }
1043
    fclose(f);
1044
}
1045

    
1046
static void do_sum(Monitor *mon, const QDict *qdict)
1047
{
1048
    uint32_t addr;
1049
    uint8_t buf[1];
1050
    uint16_t sum;
1051
    uint32_t start = qdict_get_int(qdict, "start");
1052
    uint32_t size = qdict_get_int(qdict, "size");
1053

    
1054
    sum = 0;
1055
    for(addr = start; addr < (start + size); addr++) {
1056
        cpu_physical_memory_rw(addr, buf, 1, 0);
1057
        /* BSD sum algorithm ('sum' Unix command) */
1058
        sum = (sum >> 1) | (sum << 15);
1059
        sum += buf[0];
1060
    }
1061
    monitor_printf(mon, "%05d\n", sum);
1062
}
1063

    
1064
typedef struct {
1065
    int keycode;
1066
    const char *name;
1067
} KeyDef;
1068

    
1069
static const KeyDef key_defs[] = {
1070
    { 0x2a, "shift" },
1071
    { 0x36, "shift_r" },
1072

    
1073
    { 0x38, "alt" },
1074
    { 0xb8, "alt_r" },
1075
    { 0x64, "altgr" },
1076
    { 0xe4, "altgr_r" },
1077
    { 0x1d, "ctrl" },
1078
    { 0x9d, "ctrl_r" },
1079

    
1080
    { 0xdd, "menu" },
1081

    
1082
    { 0x01, "esc" },
1083

    
1084
    { 0x02, "1" },
1085
    { 0x03, "2" },
1086
    { 0x04, "3" },
1087
    { 0x05, "4" },
1088
    { 0x06, "5" },
1089
    { 0x07, "6" },
1090
    { 0x08, "7" },
1091
    { 0x09, "8" },
1092
    { 0x0a, "9" },
1093
    { 0x0b, "0" },
1094
    { 0x0c, "minus" },
1095
    { 0x0d, "equal" },
1096
    { 0x0e, "backspace" },
1097

    
1098
    { 0x0f, "tab" },
1099
    { 0x10, "q" },
1100
    { 0x11, "w" },
1101
    { 0x12, "e" },
1102
    { 0x13, "r" },
1103
    { 0x14, "t" },
1104
    { 0x15, "y" },
1105
    { 0x16, "u" },
1106
    { 0x17, "i" },
1107
    { 0x18, "o" },
1108
    { 0x19, "p" },
1109

    
1110
    { 0x1c, "ret" },
1111

    
1112
    { 0x1e, "a" },
1113
    { 0x1f, "s" },
1114
    { 0x20, "d" },
1115
    { 0x21, "f" },
1116
    { 0x22, "g" },
1117
    { 0x23, "h" },
1118
    { 0x24, "j" },
1119
    { 0x25, "k" },
1120
    { 0x26, "l" },
1121

    
1122
    { 0x2c, "z" },
1123
    { 0x2d, "x" },
1124
    { 0x2e, "c" },
1125
    { 0x2f, "v" },
1126
    { 0x30, "b" },
1127
    { 0x31, "n" },
1128
    { 0x32, "m" },
1129
    { 0x33, "comma" },
1130
    { 0x34, "dot" },
1131
    { 0x35, "slash" },
1132

    
1133
    { 0x37, "asterisk" },
1134

    
1135
    { 0x39, "spc" },
1136
    { 0x3a, "caps_lock" },
1137
    { 0x3b, "f1" },
1138
    { 0x3c, "f2" },
1139
    { 0x3d, "f3" },
1140
    { 0x3e, "f4" },
1141
    { 0x3f, "f5" },
1142
    { 0x40, "f6" },
1143
    { 0x41, "f7" },
1144
    { 0x42, "f8" },
1145
    { 0x43, "f9" },
1146
    { 0x44, "f10" },
1147
    { 0x45, "num_lock" },
1148
    { 0x46, "scroll_lock" },
1149

    
1150
    { 0xb5, "kp_divide" },
1151
    { 0x37, "kp_multiply" },
1152
    { 0x4a, "kp_subtract" },
1153
    { 0x4e, "kp_add" },
1154
    { 0x9c, "kp_enter" },
1155
    { 0x53, "kp_decimal" },
1156
    { 0x54, "sysrq" },
1157

    
1158
    { 0x52, "kp_0" },
1159
    { 0x4f, "kp_1" },
1160
    { 0x50, "kp_2" },
1161
    { 0x51, "kp_3" },
1162
    { 0x4b, "kp_4" },
1163
    { 0x4c, "kp_5" },
1164
    { 0x4d, "kp_6" },
1165
    { 0x47, "kp_7" },
1166
    { 0x48, "kp_8" },
1167
    { 0x49, "kp_9" },
1168

    
1169
    { 0x56, "<" },
1170

    
1171
    { 0x57, "f11" },
1172
    { 0x58, "f12" },
1173

    
1174
    { 0xb7, "print" },
1175

    
1176
    { 0xc7, "home" },
1177
    { 0xc9, "pgup" },
1178
    { 0xd1, "pgdn" },
1179
    { 0xcf, "end" },
1180

    
1181
    { 0xcb, "left" },
1182
    { 0xc8, "up" },
1183
    { 0xd0, "down" },
1184
    { 0xcd, "right" },
1185

    
1186
    { 0xd2, "insert" },
1187
    { 0xd3, "delete" },
1188
#if defined(TARGET_SPARC) && !defined(TARGET_SPARC64)
1189
    { 0xf0, "stop" },
1190
    { 0xf1, "again" },
1191
    { 0xf2, "props" },
1192
    { 0xf3, "undo" },
1193
    { 0xf4, "front" },
1194
    { 0xf5, "copy" },
1195
    { 0xf6, "open" },
1196
    { 0xf7, "paste" },
1197
    { 0xf8, "find" },
1198
    { 0xf9, "cut" },
1199
    { 0xfa, "lf" },
1200
    { 0xfb, "help" },
1201
    { 0xfc, "meta_l" },
1202
    { 0xfd, "meta_r" },
1203
    { 0xfe, "compose" },
1204
#endif
1205
    { 0, NULL },
1206
};
1207

    
1208
static int get_keycode(const char *key)
1209
{
1210
    const KeyDef *p;
1211
    char *endp;
1212
    int ret;
1213

    
1214
    for(p = key_defs; p->name != NULL; p++) {
1215
        if (!strcmp(key, p->name))
1216
            return p->keycode;
1217
    }
1218
    if (strstart(key, "0x", NULL)) {
1219
        ret = strtoul(key, &endp, 0);
1220
        if (*endp == '\0' && ret >= 0x01 && ret <= 0xff)
1221
            return ret;
1222
    }
1223
    return -1;
1224
}
1225

    
1226
#define MAX_KEYCODES 16
1227
static uint8_t keycodes[MAX_KEYCODES];
1228
static int nb_pending_keycodes;
1229
static QEMUTimer *key_timer;
1230

    
1231
static void release_keys(void *opaque)
1232
{
1233
    int keycode;
1234

    
1235
    while (nb_pending_keycodes > 0) {
1236
        nb_pending_keycodes--;
1237
        keycode = keycodes[nb_pending_keycodes];
1238
        if (keycode & 0x80)
1239
            kbd_put_keycode(0xe0);
1240
        kbd_put_keycode(keycode | 0x80);
1241
    }
1242
}
1243

    
1244
static void do_sendkey(Monitor *mon, const QDict *qdict)
1245
{
1246
    char keyname_buf[16];
1247
    char *separator;
1248
    int keyname_len, keycode, i;
1249
    const char *string = qdict_get_str(qdict, "string");
1250
    int has_hold_time = qdict_haskey(qdict, "hold_time");
1251
    int hold_time = qdict_get_try_int(qdict, "hold_time", -1);
1252

    
1253
    if (nb_pending_keycodes > 0) {
1254
        qemu_del_timer(key_timer);
1255
        release_keys(NULL);
1256
    }
1257
    if (!has_hold_time)
1258
        hold_time = 100;
1259
    i = 0;
1260
    while (1) {
1261
        separator = strchr(string, '-');
1262
        keyname_len = separator ? separator - string : strlen(string);
1263
        if (keyname_len > 0) {
1264
            pstrcpy(keyname_buf, sizeof(keyname_buf), string);
1265
            if (keyname_len > sizeof(keyname_buf) - 1) {
1266
                monitor_printf(mon, "invalid key: '%s...'\n", keyname_buf);
1267
                return;
1268
            }
1269
            if (i == MAX_KEYCODES) {
1270
                monitor_printf(mon, "too many keys\n");
1271
                return;
1272
            }
1273
            keyname_buf[keyname_len] = 0;
1274
            keycode = get_keycode(keyname_buf);
1275
            if (keycode < 0) {
1276
                monitor_printf(mon, "unknown key: '%s'\n", keyname_buf);
1277
                return;
1278
            }
1279
            keycodes[i++] = keycode;
1280
        }
1281
        if (!separator)
1282
            break;
1283
        string = separator + 1;
1284
    }
1285
    nb_pending_keycodes = i;
1286
    /* key down events */
1287
    for (i = 0; i < nb_pending_keycodes; i++) {
1288
        keycode = keycodes[i];
1289
        if (keycode & 0x80)
1290
            kbd_put_keycode(0xe0);
1291
        kbd_put_keycode(keycode & 0x7f);
1292
    }
1293
    /* delayed key up events */
1294
    qemu_mod_timer(key_timer, qemu_get_clock(vm_clock) +
1295
                   muldiv64(get_ticks_per_sec(), hold_time, 1000));
1296
}
1297

    
1298
static int mouse_button_state;
1299

    
1300
static void do_mouse_move(Monitor *mon, const QDict *qdict)
1301
{
1302
    int dx, dy, dz;
1303
    const char *dx_str = qdict_get_str(qdict, "dx_str");
1304
    const char *dy_str = qdict_get_str(qdict, "dy_str");
1305
    const char *dz_str = qdict_get_try_str(qdict, "dz_str");
1306
    dx = strtol(dx_str, NULL, 0);
1307
    dy = strtol(dy_str, NULL, 0);
1308
    dz = 0;
1309
    if (dz_str)
1310
        dz = strtol(dz_str, NULL, 0);
1311
    kbd_mouse_event(dx, dy, dz, mouse_button_state);
1312
}
1313

    
1314
static void do_mouse_button(Monitor *mon, const QDict *qdict)
1315
{
1316
    int button_state = qdict_get_int(qdict, "button_state");
1317
    mouse_button_state = button_state;
1318
    kbd_mouse_event(0, 0, 0, mouse_button_state);
1319
}
1320

    
1321
static void do_ioport_read(Monitor *mon, const QDict *qdict)
1322
{
1323
    int size = qdict_get_int(qdict, "size");
1324
    int addr = qdict_get_int(qdict, "addr");
1325
    int has_index = qdict_haskey(qdict, "index");
1326
    uint32_t val;
1327
    int suffix;
1328

    
1329
    if (has_index) {
1330
        int index = qdict_get_int(qdict, "index");
1331
        cpu_outb(addr & IOPORTS_MASK, index & 0xff);
1332
        addr++;
1333
    }
1334
    addr &= 0xffff;
1335

    
1336
    switch(size) {
1337
    default:
1338
    case 1:
1339
        val = cpu_inb(addr);
1340
        suffix = 'b';
1341
        break;
1342
    case 2:
1343
        val = cpu_inw(addr);
1344
        suffix = 'w';
1345
        break;
1346
    case 4:
1347
        val = cpu_inl(addr);
1348
        suffix = 'l';
1349
        break;
1350
    }
1351
    monitor_printf(mon, "port%c[0x%04x] = %#0*x\n",
1352
                   suffix, addr, size * 2, val);
1353
}
1354

    
1355
static void do_ioport_write(Monitor *mon, const QDict *qdict)
1356
{
1357
    int size = qdict_get_int(qdict, "size");
1358
    int addr = qdict_get_int(qdict, "addr");
1359
    int val = qdict_get_int(qdict, "val");
1360

    
1361
    addr &= IOPORTS_MASK;
1362

    
1363
    switch (size) {
1364
    default:
1365
    case 1:
1366
        cpu_outb(addr, val);
1367
        break;
1368
    case 2:
1369
        cpu_outw(addr, val);
1370
        break;
1371
    case 4:
1372
        cpu_outl(addr, val);
1373
        break;
1374
    }
1375
}
1376

    
1377
static void do_boot_set(Monitor *mon, const QDict *qdict)
1378
{
1379
    int res;
1380
    const char *bootdevice = qdict_get_str(qdict, "bootdevice");
1381

    
1382
    res = qemu_boot_set(bootdevice);
1383
    if (res == 0) {
1384
        monitor_printf(mon, "boot device list now set to %s\n", bootdevice);
1385
    } else if (res > 0) {
1386
        monitor_printf(mon, "setting boot device list failed\n");
1387
    } else {
1388
        monitor_printf(mon, "no function defined to set boot device list for "
1389
                       "this architecture\n");
1390
    }
1391
}
1392

    
1393
/**
1394
 * do_system_reset(): Issue a machine reset
1395
 */
1396
static void do_system_reset(Monitor *mon, const QDict *qdict,
1397
                            QObject **ret_data)
1398
{
1399
    qemu_system_reset_request();
1400
}
1401

    
1402
/**
1403
 * do_system_powerdown(): Issue a machine powerdown
1404
 */
1405
static void do_system_powerdown(Monitor *mon, const QDict *qdict,
1406
                                QObject **ret_data)
1407
{
1408
    qemu_system_powerdown_request();
1409
}
1410

    
1411
#if defined(TARGET_I386)
1412
static void print_pte(Monitor *mon, uint32_t addr, uint32_t pte, uint32_t mask)
1413
{
1414
    monitor_printf(mon, "%08x: %08x %c%c%c%c%c%c%c%c\n",
1415
                   addr,
1416
                   pte & mask,
1417
                   pte & PG_GLOBAL_MASK ? 'G' : '-',
1418
                   pte & PG_PSE_MASK ? 'P' : '-',
1419
                   pte & PG_DIRTY_MASK ? 'D' : '-',
1420
                   pte & PG_ACCESSED_MASK ? 'A' : '-',
1421
                   pte & PG_PCD_MASK ? 'C' : '-',
1422
                   pte & PG_PWT_MASK ? 'T' : '-',
1423
                   pte & PG_USER_MASK ? 'U' : '-',
1424
                   pte & PG_RW_MASK ? 'W' : '-');
1425
}
1426

    
1427
static void tlb_info(Monitor *mon)
1428
{
1429
    CPUState *env;
1430
    int l1, l2;
1431
    uint32_t pgd, pde, pte;
1432

    
1433
    env = mon_get_cpu();
1434
    if (!env)
1435
        return;
1436

    
1437
    if (!(env->cr[0] & CR0_PG_MASK)) {
1438
        monitor_printf(mon, "PG disabled\n");
1439
        return;
1440
    }
1441
    pgd = env->cr[3] & ~0xfff;
1442
    for(l1 = 0; l1 < 1024; l1++) {
1443
        cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4);
1444
        pde = le32_to_cpu(pde);
1445
        if (pde & PG_PRESENT_MASK) {
1446
            if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
1447
                print_pte(mon, (l1 << 22), pde, ~((1 << 20) - 1));
1448
            } else {
1449
                for(l2 = 0; l2 < 1024; l2++) {
1450
                    cpu_physical_memory_read((pde & ~0xfff) + l2 * 4,
1451
                                             (uint8_t *)&pte, 4);
1452
                    pte = le32_to_cpu(pte);
1453
                    if (pte & PG_PRESENT_MASK) {
1454
                        print_pte(mon, (l1 << 22) + (l2 << 12),
1455
                                  pte & ~PG_PSE_MASK,
1456
                                  ~0xfff);
1457
                    }
1458
                }
1459
            }
1460
        }
1461
    }
1462
}
1463

    
1464
static void mem_print(Monitor *mon, uint32_t *pstart, int *plast_prot,
1465
                      uint32_t end, int prot)
1466
{
1467
    int prot1;
1468
    prot1 = *plast_prot;
1469
    if (prot != prot1) {
1470
        if (*pstart != -1) {
1471
            monitor_printf(mon, "%08x-%08x %08x %c%c%c\n",
1472
                           *pstart, end, end - *pstart,
1473
                           prot1 & PG_USER_MASK ? 'u' : '-',
1474
                           'r',
1475
                           prot1 & PG_RW_MASK ? 'w' : '-');
1476
        }
1477
        if (prot != 0)
1478
            *pstart = end;
1479
        else
1480
            *pstart = -1;
1481
        *plast_prot = prot;
1482
    }
1483
}
1484

    
1485
static void mem_info(Monitor *mon)
1486
{
1487
    CPUState *env;
1488
    int l1, l2, prot, last_prot;
1489
    uint32_t pgd, pde, pte, start, end;
1490

    
1491
    env = mon_get_cpu();
1492
    if (!env)
1493
        return;
1494

    
1495
    if (!(env->cr[0] & CR0_PG_MASK)) {
1496
        monitor_printf(mon, "PG disabled\n");
1497
        return;
1498
    }
1499
    pgd = env->cr[3] & ~0xfff;
1500
    last_prot = 0;
1501
    start = -1;
1502
    for(l1 = 0; l1 < 1024; l1++) {
1503
        cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4);
1504
        pde = le32_to_cpu(pde);
1505
        end = l1 << 22;
1506
        if (pde & PG_PRESENT_MASK) {
1507
            if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
1508
                prot = pde & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
1509
                mem_print(mon, &start, &last_prot, end, prot);
1510
            } else {
1511
                for(l2 = 0; l2 < 1024; l2++) {
1512
                    cpu_physical_memory_read((pde & ~0xfff) + l2 * 4,
1513
                                             (uint8_t *)&pte, 4);
1514
                    pte = le32_to_cpu(pte);
1515
                    end = (l1 << 22) + (l2 << 12);
1516
                    if (pte & PG_PRESENT_MASK) {
1517
                        prot = pte & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
1518
                    } else {
1519
                        prot = 0;
1520
                    }
1521
                    mem_print(mon, &start, &last_prot, end, prot);
1522
                }
1523
            }
1524
        } else {
1525
            prot = 0;
1526
            mem_print(mon, &start, &last_prot, end, prot);
1527
        }
1528
    }
1529
}
1530
#endif
1531

    
1532
#if defined(TARGET_SH4)
1533

    
1534
static void print_tlb(Monitor *mon, int idx, tlb_t *tlb)
1535
{
1536
    monitor_printf(mon, " tlb%i:\t"
1537
                   "asid=%hhu vpn=%x\tppn=%x\tsz=%hhu size=%u\t"
1538
                   "v=%hhu shared=%hhu cached=%hhu prot=%hhu "
1539
                   "dirty=%hhu writethrough=%hhu\n",
1540
                   idx,
1541
                   tlb->asid, tlb->vpn, tlb->ppn, tlb->sz, tlb->size,
1542
                   tlb->v, tlb->sh, tlb->c, tlb->pr,
1543
                   tlb->d, tlb->wt);
1544
}
1545

    
1546
static void tlb_info(Monitor *mon)
1547
{
1548
    CPUState *env = mon_get_cpu();
1549
    int i;
1550

    
1551
    monitor_printf (mon, "ITLB:\n");
1552
    for (i = 0 ; i < ITLB_SIZE ; i++)
1553
        print_tlb (mon, i, &env->itlb[i]);
1554
    monitor_printf (mon, "UTLB:\n");
1555
    for (i = 0 ; i < UTLB_SIZE ; i++)
1556
        print_tlb (mon, i, &env->utlb[i]);
1557
}
1558

    
1559
#endif
1560

    
1561
static void do_info_kvm(Monitor *mon)
1562
{
1563
#ifdef CONFIG_KVM
1564
    monitor_printf(mon, "kvm support: ");
1565
    if (kvm_enabled())
1566
        monitor_printf(mon, "enabled\n");
1567
    else
1568
        monitor_printf(mon, "disabled\n");
1569
#else
1570
    monitor_printf(mon, "kvm support: not compiled\n");
1571
#endif
1572
}
1573

    
1574
static void do_info_numa(Monitor *mon)
1575
{
1576
    int i;
1577
    CPUState *env;
1578

    
1579
    monitor_printf(mon, "%d nodes\n", nb_numa_nodes);
1580
    for (i = 0; i < nb_numa_nodes; i++) {
1581
        monitor_printf(mon, "node %d cpus:", i);
1582
        for (env = first_cpu; env != NULL; env = env->next_cpu) {
1583
            if (env->numa_node == i) {
1584
                monitor_printf(mon, " %d", env->cpu_index);
1585
            }
1586
        }
1587
        monitor_printf(mon, "\n");
1588
        monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i,
1589
            node_mem[i] >> 20);
1590
    }
1591
}
1592

    
1593
#ifdef CONFIG_PROFILER
1594

    
1595
int64_t qemu_time;
1596
int64_t dev_time;
1597

    
1598
static void do_info_profile(Monitor *mon)
1599
{
1600
    int64_t total;
1601
    total = qemu_time;
1602
    if (total == 0)
1603
        total = 1;
1604
    monitor_printf(mon, "async time  %" PRId64 " (%0.3f)\n",
1605
                   dev_time, dev_time / (double)get_ticks_per_sec());
1606
    monitor_printf(mon, "qemu time   %" PRId64 " (%0.3f)\n",
1607
                   qemu_time, qemu_time / (double)get_ticks_per_sec());
1608
    qemu_time = 0;
1609
    dev_time = 0;
1610
}
1611
#else
1612
static void do_info_profile(Monitor *mon)
1613
{
1614
    monitor_printf(mon, "Internal profiler not compiled\n");
1615
}
1616
#endif
1617

    
1618
/* Capture support */
1619
static QLIST_HEAD (capture_list_head, CaptureState) capture_head;
1620

    
1621
static void do_info_capture(Monitor *mon)
1622
{
1623
    int i;
1624
    CaptureState *s;
1625

    
1626
    for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1627
        monitor_printf(mon, "[%d]: ", i);
1628
        s->ops.info (s->opaque);
1629
    }
1630
}
1631

    
1632
#ifdef HAS_AUDIO
1633
static void do_stop_capture(Monitor *mon, const QDict *qdict)
1634
{
1635
    int i;
1636
    int n = qdict_get_int(qdict, "n");
1637
    CaptureState *s;
1638

    
1639
    for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1640
        if (i == n) {
1641
            s->ops.destroy (s->opaque);
1642
            QLIST_REMOVE (s, entries);
1643
            qemu_free (s);
1644
            return;
1645
        }
1646
    }
1647
}
1648

    
1649
static void do_wav_capture(Monitor *mon, const QDict *qdict)
1650
{
1651
    const char *path = qdict_get_str(qdict, "path");
1652
    int has_freq = qdict_haskey(qdict, "freq");
1653
    int freq = qdict_get_try_int(qdict, "freq", -1);
1654
    int has_bits = qdict_haskey(qdict, "bits");
1655
    int bits = qdict_get_try_int(qdict, "bits", -1);
1656
    int has_channels = qdict_haskey(qdict, "nchannels");
1657
    int nchannels = qdict_get_try_int(qdict, "nchannels", -1);
1658
    CaptureState *s;
1659

    
1660
    s = qemu_mallocz (sizeof (*s));
1661

    
1662
    freq = has_freq ? freq : 44100;
1663
    bits = has_bits ? bits : 16;
1664
    nchannels = has_channels ? nchannels : 2;
1665

    
1666
    if (wav_start_capture (s, path, freq, bits, nchannels)) {
1667
        monitor_printf(mon, "Faied to add wave capture\n");
1668
        qemu_free (s);
1669
    }
1670
    QLIST_INSERT_HEAD (&capture_head, s, entries);
1671
}
1672
#endif
1673

    
1674
#if defined(TARGET_I386)
1675
static void do_inject_nmi(Monitor *mon, const QDict *qdict)
1676
{
1677
    CPUState *env;
1678
    int cpu_index = qdict_get_int(qdict, "cpu_index");
1679

    
1680
    for (env = first_cpu; env != NULL; env = env->next_cpu)
1681
        if (env->cpu_index == cpu_index) {
1682
            cpu_interrupt(env, CPU_INTERRUPT_NMI);
1683
            break;
1684
        }
1685
}
1686
#endif
1687

    
1688
static void do_info_status(Monitor *mon)
1689
{
1690
    if (vm_running) {
1691
        if (singlestep) {
1692
            monitor_printf(mon, "VM status: running (single step mode)\n");
1693
        } else {
1694
            monitor_printf(mon, "VM status: running\n");
1695
        }
1696
    } else
1697
       monitor_printf(mon, "VM status: paused\n");
1698
}
1699

    
1700
/**
1701
 * do_balloon(): Request VM to change its memory allocation
1702
 */
1703
static void do_balloon(Monitor *mon, const QDict *qdict, QObject **ret_data)
1704
{
1705
    int value = qdict_get_int(qdict, "value");
1706
    ram_addr_t target = value;
1707
    qemu_balloon(target << 20);
1708
}
1709

    
1710
static void monitor_print_balloon(Monitor *mon, const QObject *data)
1711
{
1712
    monitor_printf(mon, "balloon: actual=%d\n",
1713
                                     (int)qint_get_int(qobject_to_qint(data)));
1714
}
1715

    
1716
/**
1717
 * do_info_balloon(): Balloon information
1718
 */
1719
static void do_info_balloon(Monitor *mon, QObject **ret_data)
1720
{
1721
    ram_addr_t actual;
1722

    
1723
    actual = qemu_balloon_status();
1724
    if (kvm_enabled() && !kvm_has_sync_mmu())
1725
        qemu_error_new(QERR_KVM_MISSING_CAP, "synchronous MMU", "balloon");
1726
    else if (actual == 0)
1727
        qemu_error_new(QERR_DEVICE_NOT_ACTIVE, "balloon");
1728
    else
1729
        *ret_data = QOBJECT(qint_from_int((int)(actual >> 20)));
1730
}
1731

    
1732
static qemu_acl *find_acl(Monitor *mon, const char *name)
1733
{
1734
    qemu_acl *acl = qemu_acl_find(name);
1735

    
1736
    if (!acl) {
1737
        monitor_printf(mon, "acl: unknown list '%s'\n", name);
1738
    }
1739
    return acl;
1740
}
1741

    
1742
static void do_acl_show(Monitor *mon, const QDict *qdict)
1743
{
1744
    const char *aclname = qdict_get_str(qdict, "aclname");
1745
    qemu_acl *acl = find_acl(mon, aclname);
1746
    qemu_acl_entry *entry;
1747
    int i = 0;
1748

    
1749
    if (acl) {
1750
        monitor_printf(mon, "policy: %s\n",
1751
                       acl->defaultDeny ? "deny" : "allow");
1752
        QTAILQ_FOREACH(entry, &acl->entries, next) {
1753
            i++;
1754
            monitor_printf(mon, "%d: %s %s\n", i,
1755
                           entry->deny ? "deny" : "allow", entry->match);
1756
        }
1757
    }
1758
}
1759

    
1760
static void do_acl_reset(Monitor *mon, const QDict *qdict)
1761
{
1762
    const char *aclname = qdict_get_str(qdict, "aclname");
1763
    qemu_acl *acl = find_acl(mon, aclname);
1764

    
1765
    if (acl) {
1766
        qemu_acl_reset(acl);
1767
        monitor_printf(mon, "acl: removed all rules\n");
1768
    }
1769
}
1770

    
1771
static void do_acl_policy(Monitor *mon, const QDict *qdict)
1772
{
1773
    const char *aclname = qdict_get_str(qdict, "aclname");
1774
    const char *policy = qdict_get_str(qdict, "policy");
1775
    qemu_acl *acl = find_acl(mon, aclname);
1776

    
1777
    if (acl) {
1778
        if (strcmp(policy, "allow") == 0) {
1779
            acl->defaultDeny = 0;
1780
            monitor_printf(mon, "acl: policy set to 'allow'\n");
1781
        } else if (strcmp(policy, "deny") == 0) {
1782
            acl->defaultDeny = 1;
1783
            monitor_printf(mon, "acl: policy set to 'deny'\n");
1784
        } else {
1785
            monitor_printf(mon, "acl: unknown policy '%s', "
1786
                           "expected 'deny' or 'allow'\n", policy);
1787
        }
1788
    }
1789
}
1790

    
1791
static void do_acl_add(Monitor *mon, const QDict *qdict)
1792
{
1793
    const char *aclname = qdict_get_str(qdict, "aclname");
1794
    const char *match = qdict_get_str(qdict, "match");
1795
    const char *policy = qdict_get_str(qdict, "policy");
1796
    int has_index = qdict_haskey(qdict, "index");
1797
    int index = qdict_get_try_int(qdict, "index", -1);
1798
    qemu_acl *acl = find_acl(mon, aclname);
1799
    int deny, ret;
1800

    
1801
    if (acl) {
1802
        if (strcmp(policy, "allow") == 0) {
1803
            deny = 0;
1804
        } else if (strcmp(policy, "deny") == 0) {
1805
            deny = 1;
1806
        } else {
1807
            monitor_printf(mon, "acl: unknown policy '%s', "
1808
                           "expected 'deny' or 'allow'\n", policy);
1809
            return;
1810
        }
1811
        if (has_index)
1812
            ret = qemu_acl_insert(acl, deny, match, index);
1813
        else
1814
            ret = qemu_acl_append(acl, deny, match);
1815
        if (ret < 0)
1816
            monitor_printf(mon, "acl: unable to add acl entry\n");
1817
        else
1818
            monitor_printf(mon, "acl: added rule at position %d\n", ret);
1819
    }
1820
}
1821

    
1822
static void do_acl_remove(Monitor *mon, const QDict *qdict)
1823
{
1824
    const char *aclname = qdict_get_str(qdict, "aclname");
1825
    const char *match = qdict_get_str(qdict, "match");
1826
    qemu_acl *acl = find_acl(mon, aclname);
1827
    int ret;
1828

    
1829
    if (acl) {
1830
        ret = qemu_acl_remove(acl, match);
1831
        if (ret < 0)
1832
            monitor_printf(mon, "acl: no matching acl entry\n");
1833
        else
1834
            monitor_printf(mon, "acl: removed rule at position %d\n", ret);
1835
    }
1836
}
1837

    
1838
#if defined(TARGET_I386)
1839
static void do_inject_mce(Monitor *mon, const QDict *qdict)
1840
{
1841
    CPUState *cenv;
1842
    int cpu_index = qdict_get_int(qdict, "cpu_index");
1843
    int bank = qdict_get_int(qdict, "bank");
1844
    uint64_t status = qdict_get_int(qdict, "status");
1845
    uint64_t mcg_status = qdict_get_int(qdict, "mcg_status");
1846
    uint64_t addr = qdict_get_int(qdict, "addr");
1847
    uint64_t misc = qdict_get_int(qdict, "misc");
1848

    
1849
    for (cenv = first_cpu; cenv != NULL; cenv = cenv->next_cpu)
1850
        if (cenv->cpu_index == cpu_index && cenv->mcg_cap) {
1851
            cpu_inject_x86_mce(cenv, bank, status, mcg_status, addr, misc);
1852
            break;
1853
        }
1854
}
1855
#endif
1856

    
1857
static void do_getfd(Monitor *mon, const QDict *qdict, QObject **ret_data)
1858
{
1859
    const char *fdname = qdict_get_str(qdict, "fdname");
1860
    mon_fd_t *monfd;
1861
    int fd;
1862

    
1863
    fd = qemu_chr_get_msgfd(mon->chr);
1864
    if (fd == -1) {
1865
        monitor_printf(mon, "getfd: no file descriptor supplied via SCM_RIGHTS\n");
1866
        return;
1867
    }
1868

    
1869
    if (qemu_isdigit(fdname[0])) {
1870
        monitor_printf(mon, "getfd: monitor names may not begin with a number\n");
1871
        return;
1872
    }
1873

    
1874
    fd = dup(fd);
1875
    if (fd == -1) {
1876
        monitor_printf(mon, "Failed to dup() file descriptor: %s\n",
1877
                       strerror(errno));
1878
        return;
1879
    }
1880

    
1881
    QLIST_FOREACH(monfd, &mon->fds, next) {
1882
        if (strcmp(monfd->name, fdname) != 0) {
1883
            continue;
1884
        }
1885

    
1886
        close(monfd->fd);
1887
        monfd->fd = fd;
1888
        return;
1889
    }
1890

    
1891
    monfd = qemu_mallocz(sizeof(mon_fd_t));
1892
    monfd->name = qemu_strdup(fdname);
1893
    monfd->fd = fd;
1894

    
1895
    QLIST_INSERT_HEAD(&mon->fds, monfd, next);
1896
}
1897

    
1898
static void do_closefd(Monitor *mon, const QDict *qdict, QObject **ret_data)
1899
{
1900
    const char *fdname = qdict_get_str(qdict, "fdname");
1901
    mon_fd_t *monfd;
1902

    
1903
    QLIST_FOREACH(monfd, &mon->fds, next) {
1904
        if (strcmp(monfd->name, fdname) != 0) {
1905
            continue;
1906
        }
1907

    
1908
        QLIST_REMOVE(monfd, next);
1909
        close(monfd->fd);
1910
        qemu_free(monfd->name);
1911
        qemu_free(monfd);
1912
        return;
1913
    }
1914

    
1915
    monitor_printf(mon, "Failed to find file descriptor named %s\n",
1916
                   fdname);
1917
}
1918

    
1919
static void do_loadvm(Monitor *mon, const QDict *qdict)
1920
{
1921
    int saved_vm_running  = vm_running;
1922
    const char *name = qdict_get_str(qdict, "name");
1923

    
1924
    vm_stop(0);
1925

    
1926
    if (load_vmstate(mon, name) >= 0 && saved_vm_running)
1927
        vm_start();
1928
}
1929

    
1930
int monitor_get_fd(Monitor *mon, const char *fdname)
1931
{
1932
    mon_fd_t *monfd;
1933

    
1934
    QLIST_FOREACH(monfd, &mon->fds, next) {
1935
        int fd;
1936

    
1937
        if (strcmp(monfd->name, fdname) != 0) {
1938
            continue;
1939
        }
1940

    
1941
        fd = monfd->fd;
1942

    
1943
        /* caller takes ownership of fd */
1944
        QLIST_REMOVE(monfd, next);
1945
        qemu_free(monfd->name);
1946
        qemu_free(monfd);
1947

    
1948
        return fd;
1949
    }
1950

    
1951
    return -1;
1952
}
1953

    
1954
static const mon_cmd_t mon_cmds[] = {
1955
#include "qemu-monitor.h"
1956
    { NULL, NULL, },
1957
};
1958

    
1959
/* Please update qemu-monitor.hx when adding or changing commands */
1960
static const mon_cmd_t info_cmds[] = {
1961
    {
1962
        .name       = "version",
1963
        .args_type  = "",
1964
        .params     = "",
1965
        .help       = "show the version of QEMU",
1966
        .user_print = monitor_print_qobject,
1967
        .mhandler.info_new = do_info_version,
1968
    },
1969
    {
1970
        .name       = "network",
1971
        .args_type  = "",
1972
        .params     = "",
1973
        .help       = "show the network state",
1974
        .mhandler.info = do_info_network,
1975
    },
1976
    {
1977
        .name       = "chardev",
1978
        .args_type  = "",
1979
        .params     = "",
1980
        .help       = "show the character devices",
1981
        .mhandler.info = qemu_chr_info,
1982
    },
1983
    {
1984
        .name       = "block",
1985
        .args_type  = "",
1986
        .params     = "",
1987
        .help       = "show the block devices",
1988
        .mhandler.info = bdrv_info,
1989
    },
1990
    {
1991
        .name       = "blockstats",
1992
        .args_type  = "",
1993
        .params     = "",
1994
        .help       = "show block device statistics",
1995
        .mhandler.info = bdrv_info_stats,
1996
    },
1997
    {
1998
        .name       = "registers",
1999
        .args_type  = "",
2000
        .params     = "",
2001
        .help       = "show the cpu registers",
2002
        .mhandler.info = do_info_registers,
2003
    },
2004
    {
2005
        .name       = "cpus",
2006
        .args_type  = "",
2007
        .params     = "",
2008
        .help       = "show infos for each CPU",
2009
        .user_print = monitor_print_cpus,
2010
        .mhandler.info_new = do_info_cpus,
2011
    },
2012
    {
2013
        .name       = "history",
2014
        .args_type  = "",
2015
        .params     = "",
2016
        .help       = "show the command line history",
2017
        .mhandler.info = do_info_history,
2018
    },
2019
    {
2020
        .name       = "irq",
2021
        .args_type  = "",
2022
        .params     = "",
2023
        .help       = "show the interrupts statistics (if available)",
2024
        .mhandler.info = irq_info,
2025
    },
2026
    {
2027
        .name       = "pic",
2028
        .args_type  = "",
2029
        .params     = "",
2030
        .help       = "show i8259 (PIC) state",
2031
        .mhandler.info = pic_info,
2032
    },
2033
    {
2034
        .name       = "pci",
2035
        .args_type  = "",
2036
        .params     = "",
2037
        .help       = "show PCI info",
2038
        .mhandler.info = pci_info,
2039
    },
2040
#if defined(TARGET_I386) || defined(TARGET_SH4)
2041
    {
2042
        .name       = "tlb",
2043
        .args_type  = "",
2044
        .params     = "",
2045
        .help       = "show virtual to physical memory mappings",
2046
        .mhandler.info = tlb_info,
2047
    },
2048
#endif
2049
#if defined(TARGET_I386)
2050
    {
2051
        .name       = "mem",
2052
        .args_type  = "",
2053
        .params     = "",
2054
        .help       = "show the active virtual memory mappings",
2055
        .mhandler.info = mem_info,
2056
    },
2057
    {
2058
        .name       = "hpet",
2059
        .args_type  = "",
2060
        .params     = "",
2061
        .help       = "show state of HPET",
2062
        .mhandler.info = do_info_hpet,
2063
    },
2064
#endif
2065
    {
2066
        .name       = "jit",
2067
        .args_type  = "",
2068
        .params     = "",
2069
        .help       = "show dynamic compiler info",
2070
        .mhandler.info = do_info_jit,
2071
    },
2072
    {
2073
        .name       = "kvm",
2074
        .args_type  = "",
2075
        .params     = "",
2076
        .help       = "show KVM information",
2077
        .mhandler.info = do_info_kvm,
2078
    },
2079
    {
2080
        .name       = "numa",
2081
        .args_type  = "",
2082
        .params     = "",
2083
        .help       = "show NUMA information",
2084
        .mhandler.info = do_info_numa,
2085
    },
2086
    {
2087
        .name       = "usb",
2088
        .args_type  = "",
2089
        .params     = "",
2090
        .help       = "show guest USB devices",
2091
        .mhandler.info = usb_info,
2092
    },
2093
    {
2094
        .name       = "usbhost",
2095
        .args_type  = "",
2096
        .params     = "",
2097
        .help       = "show host USB devices",
2098
        .mhandler.info = usb_host_info,
2099
    },
2100
    {
2101
        .name       = "profile",
2102
        .args_type  = "",
2103
        .params     = "",
2104
        .help       = "show profiling information",
2105
        .mhandler.info = do_info_profile,
2106
    },
2107
    {
2108
        .name       = "capture",
2109
        .args_type  = "",
2110
        .params     = "",
2111
        .help       = "show capture information",
2112
        .mhandler.info = do_info_capture,
2113
    },
2114
    {
2115
        .name       = "snapshots",
2116
        .args_type  = "",
2117
        .params     = "",
2118
        .help       = "show the currently saved VM snapshots",
2119
        .mhandler.info = do_info_snapshots,
2120
    },
2121
    {
2122
        .name       = "status",
2123
        .args_type  = "",
2124
        .params     = "",
2125
        .help       = "show the current VM status (running|paused)",
2126
        .mhandler.info = do_info_status,
2127
    },
2128
    {
2129
        .name       = "pcmcia",
2130
        .args_type  = "",
2131
        .params     = "",
2132
        .help       = "show guest PCMCIA status",
2133
        .mhandler.info = pcmcia_info,
2134
    },
2135
    {
2136
        .name       = "mice",
2137
        .args_type  = "",
2138
        .params     = "",
2139
        .help       = "show which guest mouse is receiving events",
2140
        .mhandler.info = do_info_mice,
2141
    },
2142
    {
2143
        .name       = "vnc",
2144
        .args_type  = "",
2145
        .params     = "",
2146
        .help       = "show the vnc server status",
2147
        .mhandler.info = do_info_vnc,
2148
    },
2149
    {
2150
        .name       = "name",
2151
        .args_type  = "",
2152
        .params     = "",
2153
        .help       = "show the current VM name",
2154
        .mhandler.info = do_info_name,
2155
    },
2156
    {
2157
        .name       = "uuid",
2158
        .args_type  = "",
2159
        .params     = "",
2160
        .help       = "show the current VM UUID",
2161
        .mhandler.info = do_info_uuid,
2162
    },
2163
#if defined(TARGET_PPC)
2164
    {
2165
        .name       = "cpustats",
2166
        .args_type  = "",
2167
        .params     = "",
2168
        .help       = "show CPU statistics",
2169
        .mhandler.info = do_info_cpu_stats,
2170
    },
2171
#endif
2172
#if defined(CONFIG_SLIRP)
2173
    {
2174
        .name       = "usernet",
2175
        .args_type  = "",
2176
        .params     = "",
2177
        .help       = "show user network stack connection states",
2178
        .mhandler.info = do_info_usernet,
2179
    },
2180
#endif
2181
    {
2182
        .name       = "migrate",
2183
        .args_type  = "",
2184
        .params     = "",
2185
        .help       = "show migration status",
2186
        .mhandler.info = do_info_migrate,
2187
    },
2188
    {
2189
        .name       = "balloon",
2190
        .args_type  = "",
2191
        .params     = "",
2192
        .help       = "show balloon information",
2193
        .user_print = monitor_print_balloon,
2194
        .mhandler.info_new = do_info_balloon,
2195
    },
2196
    {
2197
        .name       = "qtree",
2198
        .args_type  = "",
2199
        .params     = "",
2200
        .help       = "show device tree",
2201
        .mhandler.info = do_info_qtree,
2202
    },
2203
    {
2204
        .name       = "qdm",
2205
        .args_type  = "",
2206
        .params     = "",
2207
        .help       = "show qdev device model list",
2208
        .mhandler.info = do_info_qdm,
2209
    },
2210
    {
2211
        .name       = "roms",
2212
        .args_type  = "",
2213
        .params     = "",
2214
        .help       = "show roms",
2215
        .mhandler.info = do_info_roms,
2216
    },
2217
    {
2218
        .name       = NULL,
2219
    },
2220
};
2221

    
2222
/*******************************************************************/
2223

    
2224
static const char *pch;
2225
static jmp_buf expr_env;
2226

    
2227
#define MD_TLONG 0
2228
#define MD_I32   1
2229

    
2230
typedef struct MonitorDef {
2231
    const char *name;
2232
    int offset;
2233
    target_long (*get_value)(const struct MonitorDef *md, int val);
2234
    int type;
2235
} MonitorDef;
2236

    
2237
#if defined(TARGET_I386)
2238
static target_long monitor_get_pc (const struct MonitorDef *md, int val)
2239
{
2240
    CPUState *env = mon_get_cpu();
2241
    if (!env)
2242
        return 0;
2243
    return env->eip + env->segs[R_CS].base;
2244
}
2245
#endif
2246

    
2247
#if defined(TARGET_PPC)
2248
static target_long monitor_get_ccr (const struct MonitorDef *md, int val)
2249
{
2250
    CPUState *env = mon_get_cpu();
2251
    unsigned int u;
2252
    int i;
2253

    
2254
    if (!env)
2255
        return 0;
2256

    
2257
    u = 0;
2258
    for (i = 0; i < 8; i++)
2259
        u |= env->crf[i] << (32 - (4 * i));
2260

    
2261
    return u;
2262
}
2263

    
2264
static target_long monitor_get_msr (const struct MonitorDef *md, int val)
2265
{
2266
    CPUState *env = mon_get_cpu();
2267
    if (!env)
2268
        return 0;
2269
    return env->msr;
2270
}
2271

    
2272
static target_long monitor_get_xer (const struct MonitorDef *md, int val)
2273
{
2274
    CPUState *env = mon_get_cpu();
2275
    if (!env)
2276
        return 0;
2277
    return env->xer;
2278
}
2279

    
2280
static target_long monitor_get_decr (const struct MonitorDef *md, int val)
2281
{
2282
    CPUState *env = mon_get_cpu();
2283
    if (!env)
2284
        return 0;
2285
    return cpu_ppc_load_decr(env);
2286
}
2287

    
2288
static target_long monitor_get_tbu (const struct MonitorDef *md, int val)
2289
{
2290
    CPUState *env = mon_get_cpu();
2291
    if (!env)
2292
        return 0;
2293
    return cpu_ppc_load_tbu(env);
2294
}
2295

    
2296
static target_long monitor_get_tbl (const struct MonitorDef *md, int val)
2297
{
2298
    CPUState *env = mon_get_cpu();
2299
    if (!env)
2300
        return 0;
2301
    return cpu_ppc_load_tbl(env);
2302
}
2303
#endif
2304

    
2305
#if defined(TARGET_SPARC)
2306
#ifndef TARGET_SPARC64
2307
static target_long monitor_get_psr (const struct MonitorDef *md, int val)
2308
{
2309
    CPUState *env = mon_get_cpu();
2310
    if (!env)
2311
        return 0;
2312
    return GET_PSR(env);
2313
}
2314
#endif
2315

    
2316
static target_long monitor_get_reg(const struct MonitorDef *md, int val)
2317
{
2318
    CPUState *env = mon_get_cpu();
2319
    if (!env)
2320
        return 0;
2321
    return env->regwptr[val];
2322
}
2323
#endif
2324

    
2325
static const MonitorDef monitor_defs[] = {
2326
#ifdef TARGET_I386
2327

    
2328
#define SEG(name, seg) \
2329
    { name, offsetof(CPUState, segs[seg].selector), NULL, MD_I32 },\
2330
    { name ".base", offsetof(CPUState, segs[seg].base) },\
2331
    { name ".limit", offsetof(CPUState, segs[seg].limit), NULL, MD_I32 },
2332

    
2333
    { "eax", offsetof(CPUState, regs[0]) },
2334
    { "ecx", offsetof(CPUState, regs[1]) },
2335
    { "edx", offsetof(CPUState, regs[2]) },
2336
    { "ebx", offsetof(CPUState, regs[3]) },
2337
    { "esp|sp", offsetof(CPUState, regs[4]) },
2338
    { "ebp|fp", offsetof(CPUState, regs[5]) },
2339
    { "esi", offsetof(CPUState, regs[6]) },
2340
    { "edi", offsetof(CPUState, regs[7]) },
2341
#ifdef TARGET_X86_64
2342
    { "r8", offsetof(CPUState, regs[8]) },
2343
    { "r9", offsetof(CPUState, regs[9]) },
2344
    { "r10", offsetof(CPUState, regs[10]) },
2345
    { "r11", offsetof(CPUState, regs[11]) },
2346
    { "r12", offsetof(CPUState, regs[12]) },
2347
    { "r13", offsetof(CPUState, regs[13]) },
2348
    { "r14", offsetof(CPUState, regs[14]) },
2349
    { "r15", offsetof(CPUState, regs[15]) },
2350
#endif
2351
    { "eflags", offsetof(CPUState, eflags) },
2352
    { "eip", offsetof(CPUState, eip) },
2353
    SEG("cs", R_CS)
2354
    SEG("ds", R_DS)
2355
    SEG("es", R_ES)
2356
    SEG("ss", R_SS)
2357
    SEG("fs", R_FS)
2358
    SEG("gs", R_GS)
2359
    { "pc", 0, monitor_get_pc, },
2360
#elif defined(TARGET_PPC)
2361
    /* General purpose registers */
2362
    { "r0", offsetof(CPUState, gpr[0]) },
2363
    { "r1", offsetof(CPUState, gpr[1]) },
2364
    { "r2", offsetof(CPUState, gpr[2]) },
2365
    { "r3", offsetof(CPUState, gpr[3]) },
2366
    { "r4", offsetof(CPUState, gpr[4]) },
2367
    { "r5", offsetof(CPUState, gpr[5]) },
2368
    { "r6", offsetof(CPUState, gpr[6]) },
2369
    { "r7", offsetof(CPUState, gpr[7]) },
2370
    { "r8", offsetof(CPUState, gpr[8]) },
2371
    { "r9", offsetof(CPUState, gpr[9]) },
2372
    { "r10", offsetof(CPUState, gpr[10]) },
2373
    { "r11", offsetof(CPUState, gpr[11]) },
2374
    { "r12", offsetof(CPUState, gpr[12]) },
2375
    { "r13", offsetof(CPUState, gpr[13]) },
2376
    { "r14", offsetof(CPUState, gpr[14]) },
2377
    { "r15", offsetof(CPUState, gpr[15]) },
2378
    { "r16", offsetof(CPUState, gpr[16]) },
2379
    { "r17", offsetof(CPUState, gpr[17]) },
2380
    { "r18", offsetof(CPUState, gpr[18]) },
2381
    { "r19", offsetof(CPUState, gpr[19]) },
2382
    { "r20", offsetof(CPUState, gpr[20]) },
2383
    { "r21", offsetof(CPUState, gpr[21]) },
2384
    { "r22", offsetof(CPUState, gpr[22]) },
2385
    { "r23", offsetof(CPUState, gpr[23]) },
2386
    { "r24", offsetof(CPUState, gpr[24]) },
2387
    { "r25", offsetof(CPUState, gpr[25]) },
2388
    { "r26", offsetof(CPUState, gpr[26]) },
2389
    { "r27", offsetof(CPUState, gpr[27]) },
2390
    { "r28", offsetof(CPUState, gpr[28]) },
2391
    { "r29", offsetof(CPUState, gpr[29]) },
2392
    { "r30", offsetof(CPUState, gpr[30]) },
2393
    { "r31", offsetof(CPUState, gpr[31]) },
2394
    /* Floating point registers */
2395
    { "f0", offsetof(CPUState, fpr[0]) },
2396
    { "f1", offsetof(CPUState, fpr[1]) },
2397
    { "f2", offsetof(CPUState, fpr[2]) },
2398
    { "f3", offsetof(CPUState, fpr[3]) },
2399
    { "f4", offsetof(CPUState, fpr[4]) },
2400
    { "f5", offsetof(CPUState, fpr[5]) },
2401
    { "f6", offsetof(CPUState, fpr[6]) },
2402
    { "f7", offsetof(CPUState, fpr[7]) },
2403
    { "f8", offsetof(CPUState, fpr[8]) },
2404
    { "f9", offsetof(CPUState, fpr[9]) },
2405
    { "f10", offsetof(CPUState, fpr[10]) },
2406
    { "f11", offsetof(CPUState, fpr[11]) },
2407
    { "f12", offsetof(CPUState, fpr[12]) },
2408
    { "f13", offsetof(CPUState, fpr[13]) },
2409
    { "f14", offsetof(CPUState, fpr[14]) },
2410
    { "f15", offsetof(CPUState, fpr[15]) },
2411
    { "f16", offsetof(CPUState, fpr[16]) },
2412
    { "f17", offsetof(CPUState, fpr[17]) },
2413
    { "f18", offsetof(CPUState, fpr[18]) },
2414
    { "f19", offsetof(CPUState, fpr[19]) },
2415
    { "f20", offsetof(CPUState, fpr[20]) },
2416
    { "f21", offsetof(CPUState, fpr[21]) },
2417
    { "f22", offsetof(CPUState, fpr[22]) },
2418
    { "f23", offsetof(CPUState, fpr[23]) },
2419
    { "f24", offsetof(CPUState, fpr[24]) },
2420
    { "f25", offsetof(CPUState, fpr[25]) },
2421
    { "f26", offsetof(CPUState, fpr[26]) },
2422
    { "f27", offsetof(CPUState, fpr[27]) },
2423
    { "f28", offsetof(CPUState, fpr[28]) },
2424
    { "f29", offsetof(CPUState, fpr[29]) },
2425
    { "f30", offsetof(CPUState, fpr[30]) },
2426
    { "f31", offsetof(CPUState, fpr[31]) },
2427
    { "fpscr", offsetof(CPUState, fpscr) },
2428
    /* Next instruction pointer */
2429
    { "nip|pc", offsetof(CPUState, nip) },
2430
    { "lr", offsetof(CPUState, lr) },
2431
    { "ctr", offsetof(CPUState, ctr) },
2432
    { "decr", 0, &monitor_get_decr, },
2433
    { "ccr", 0, &monitor_get_ccr, },
2434
    /* Machine state register */
2435
    { "msr", 0, &monitor_get_msr, },
2436
    { "xer", 0, &monitor_get_xer, },
2437
    { "tbu", 0, &monitor_get_tbu, },
2438
    { "tbl", 0, &monitor_get_tbl, },
2439
#if defined(TARGET_PPC64)
2440
    /* Address space register */
2441
    { "asr", offsetof(CPUState, asr) },
2442
#endif
2443
    /* Segment registers */
2444
    { "sdr1", offsetof(CPUState, sdr1) },
2445
    { "sr0", offsetof(CPUState, sr[0]) },
2446
    { "sr1", offsetof(CPUState, sr[1]) },
2447
    { "sr2", offsetof(CPUState, sr[2]) },
2448
    { "sr3", offsetof(CPUState, sr[3]) },
2449
    { "sr4", offsetof(CPUState, sr[4]) },
2450
    { "sr5", offsetof(CPUState, sr[5]) },
2451
    { "sr6", offsetof(CPUState, sr[6]) },
2452
    { "sr7", offsetof(CPUState, sr[7]) },
2453
    { "sr8", offsetof(CPUState, sr[8]) },
2454
    { "sr9", offsetof(CPUState, sr[9]) },
2455
    { "sr10", offsetof(CPUState, sr[10]) },
2456
    { "sr11", offsetof(CPUState, sr[11]) },
2457
    { "sr12", offsetof(CPUState, sr[12]) },
2458
    { "sr13", offsetof(CPUState, sr[13]) },
2459
    { "sr14", offsetof(CPUState, sr[14]) },
2460
    { "sr15", offsetof(CPUState, sr[15]) },
2461
    /* Too lazy to put BATs and SPRs ... */
2462
#elif defined(TARGET_SPARC)
2463
    { "g0", offsetof(CPUState, gregs[0]) },
2464
    { "g1", offsetof(CPUState, gregs[1]) },
2465
    { "g2", offsetof(CPUState, gregs[2]) },
2466
    { "g3", offsetof(CPUState, gregs[3]) },
2467
    { "g4", offsetof(CPUState, gregs[4]) },
2468
    { "g5", offsetof(CPUState, gregs[5]) },
2469
    { "g6", offsetof(CPUState, gregs[6]) },
2470
    { "g7", offsetof(CPUState, gregs[7]) },
2471
    { "o0", 0, monitor_get_reg },
2472
    { "o1", 1, monitor_get_reg },
2473
    { "o2", 2, monitor_get_reg },
2474
    { "o3", 3, monitor_get_reg },
2475
    { "o4", 4, monitor_get_reg },
2476
    { "o5", 5, monitor_get_reg },
2477
    { "o6", 6, monitor_get_reg },
2478
    { "o7", 7, monitor_get_reg },
2479
    { "l0", 8, monitor_get_reg },
2480
    { "l1", 9, monitor_get_reg },
2481
    { "l2", 10, monitor_get_reg },
2482
    { "l3", 11, monitor_get_reg },
2483
    { "l4", 12, monitor_get_reg },
2484
    { "l5", 13, monitor_get_reg },
2485
    { "l6", 14, monitor_get_reg },
2486
    { "l7", 15, monitor_get_reg },
2487
    { "i0", 16, monitor_get_reg },
2488
    { "i1", 17, monitor_get_reg },
2489
    { "i2", 18, monitor_get_reg },
2490
    { "i3", 19, monitor_get_reg },
2491
    { "i4", 20, monitor_get_reg },
2492
    { "i5", 21, monitor_get_reg },
2493
    { "i6", 22, monitor_get_reg },
2494
    { "i7", 23, monitor_get_reg },
2495
    { "pc", offsetof(CPUState, pc) },
2496
    { "npc", offsetof(CPUState, npc) },
2497
    { "y", offsetof(CPUState, y) },
2498
#ifndef TARGET_SPARC64
2499
    { "psr", 0, &monitor_get_psr, },
2500
    { "wim", offsetof(CPUState, wim) },
2501
#endif
2502
    { "tbr", offsetof(CPUState, tbr) },
2503
    { "fsr", offsetof(CPUState, fsr) },
2504
    { "f0", offsetof(CPUState, fpr[0]) },
2505
    { "f1", offsetof(CPUState, fpr[1]) },
2506
    { "f2", offsetof(CPUState, fpr[2]) },
2507
    { "f3", offsetof(CPUState, fpr[3]) },
2508
    { "f4", offsetof(CPUState, fpr[4]) },
2509
    { "f5", offsetof(CPUState, fpr[5]) },
2510
    { "f6", offsetof(CPUState, fpr[6]) },
2511
    { "f7", offsetof(CPUState, fpr[7]) },
2512
    { "f8", offsetof(CPUState, fpr[8]) },
2513
    { "f9", offsetof(CPUState, fpr[9]) },
2514
    { "f10", offsetof(CPUState, fpr[10]) },
2515
    { "f11", offsetof(CPUState, fpr[11]) },
2516
    { "f12", offsetof(CPUState, fpr[12]) },
2517
    { "f13", offsetof(CPUState, fpr[13]) },
2518
    { "f14", offsetof(CPUState, fpr[14]) },
2519
    { "f15", offsetof(CPUState, fpr[15]) },
2520
    { "f16", offsetof(CPUState, fpr[16]) },
2521
    { "f17", offsetof(CPUState, fpr[17]) },
2522
    { "f18", offsetof(CPUState, fpr[18]) },
2523
    { "f19", offsetof(CPUState, fpr[19]) },
2524
    { "f20", offsetof(CPUState, fpr[20]) },
2525
    { "f21", offsetof(CPUState, fpr[21]) },
2526
    { "f22", offsetof(CPUState, fpr[22]) },
2527
    { "f23", offsetof(CPUState, fpr[23]) },
2528
    { "f24", offsetof(CPUState, fpr[24]) },
2529
    { "f25", offsetof(CPUState, fpr[25]) },
2530
    { "f26", offsetof(CPUState, fpr[26]) },
2531
    { "f27", offsetof(CPUState, fpr[27]) },
2532
    { "f28", offsetof(CPUState, fpr[28]) },
2533
    { "f29", offsetof(CPUState, fpr[29]) },
2534
    { "f30", offsetof(CPUState, fpr[30]) },
2535
    { "f31", offsetof(CPUState, fpr[31]) },
2536
#ifdef TARGET_SPARC64
2537
    { "f32", offsetof(CPUState, fpr[32]) },
2538
    { "f34", offsetof(CPUState, fpr[34]) },
2539
    { "f36", offsetof(CPUState, fpr[36]) },
2540
    { "f38", offsetof(CPUState, fpr[38]) },
2541
    { "f40", offsetof(CPUState, fpr[40]) },
2542
    { "f42", offsetof(CPUState, fpr[42]) },
2543
    { "f44", offsetof(CPUState, fpr[44]) },
2544
    { "f46", offsetof(CPUState, fpr[46]) },
2545
    { "f48", offsetof(CPUState, fpr[48]) },
2546
    { "f50", offsetof(CPUState, fpr[50]) },
2547
    { "f52", offsetof(CPUState, fpr[52]) },
2548
    { "f54", offsetof(CPUState, fpr[54]) },
2549
    { "f56", offsetof(CPUState, fpr[56]) },
2550
    { "f58", offsetof(CPUState, fpr[58]) },
2551
    { "f60", offsetof(CPUState, fpr[60]) },
2552
    { "f62", offsetof(CPUState, fpr[62]) },
2553
    { "asi", offsetof(CPUState, asi) },
2554
    { "pstate", offsetof(CPUState, pstate) },
2555
    { "cansave", offsetof(CPUState, cansave) },
2556
    { "canrestore", offsetof(CPUState, canrestore) },
2557
    { "otherwin", offsetof(CPUState, otherwin) },
2558
    { "wstate", offsetof(CPUState, wstate) },
2559
    { "cleanwin", offsetof(CPUState, cleanwin) },
2560
    { "fprs", offsetof(CPUState, fprs) },
2561
#endif
2562
#endif
2563
    { NULL },
2564
};
2565

    
2566
static void expr_error(Monitor *mon, const char *msg)
2567
{
2568
    monitor_printf(mon, "%s\n", msg);
2569
    longjmp(expr_env, 1);
2570
}
2571

    
2572
/* return 0 if OK, -1 if not found, -2 if no CPU defined */
2573
static int get_monitor_def(target_long *pval, const char *name)
2574
{
2575
    const MonitorDef *md;
2576
    void *ptr;
2577

    
2578
    for(md = monitor_defs; md->name != NULL; md++) {
2579
        if (compare_cmd(name, md->name)) {
2580
            if (md->get_value) {
2581
                *pval = md->get_value(md, md->offset);
2582
            } else {
2583
                CPUState *env = mon_get_cpu();
2584
                if (!env)
2585
                    return -2;
2586
                ptr = (uint8_t *)env + md->offset;
2587
                switch(md->type) {
2588
                case MD_I32:
2589
                    *pval = *(int32_t *)ptr;
2590
                    break;
2591
                case MD_TLONG:
2592
                    *pval = *(target_long *)ptr;
2593
                    break;
2594
                default:
2595
                    *pval = 0;
2596
                    break;
2597
                }
2598
            }
2599
            return 0;
2600
        }
2601
    }
2602
    return -1;
2603
}
2604

    
2605
static void next(void)
2606
{
2607
    if (*pch != '\0') {
2608
        pch++;
2609
        while (qemu_isspace(*pch))
2610
            pch++;
2611
    }
2612
}
2613

    
2614
static int64_t expr_sum(Monitor *mon);
2615

    
2616
static int64_t expr_unary(Monitor *mon)
2617
{
2618
    int64_t n;
2619
    char *p;
2620
    int ret;
2621

    
2622
    switch(*pch) {
2623
    case '+':
2624
        next();
2625
        n = expr_unary(mon);
2626
        break;
2627
    case '-':
2628
        next();
2629
        n = -expr_unary(mon);
2630
        break;
2631
    case '~':
2632
        next();
2633
        n = ~expr_unary(mon);
2634
        break;
2635
    case '(':
2636
        next();
2637
        n = expr_sum(mon);
2638
        if (*pch != ')') {
2639
            expr_error(mon, "')' expected");
2640
        }
2641
        next();
2642
        break;
2643
    case '\'':
2644
        pch++;
2645
        if (*pch == '\0')
2646
            expr_error(mon, "character constant expected");
2647
        n = *pch;
2648
        pch++;
2649
        if (*pch != '\'')
2650
            expr_error(mon, "missing terminating \' character");
2651
        next();
2652
        break;
2653
    case '$':
2654
        {
2655
            char buf[128], *q;
2656
            target_long reg=0;
2657

    
2658
            pch++;
2659
            q = buf;
2660
            while ((*pch >= 'a' && *pch <= 'z') ||
2661
                   (*pch >= 'A' && *pch <= 'Z') ||
2662
                   (*pch >= '0' && *pch <= '9') ||
2663
                   *pch == '_' || *pch == '.') {
2664
                if ((q - buf) < sizeof(buf) - 1)
2665
                    *q++ = *pch;
2666
                pch++;
2667
            }
2668
            while (qemu_isspace(*pch))
2669
                pch++;
2670
            *q = 0;
2671
            ret = get_monitor_def(&reg, buf);
2672
            if (ret == -1)
2673
                expr_error(mon, "unknown register");
2674
            else if (ret == -2)
2675
                expr_error(mon, "no cpu defined");
2676
            n = reg;
2677
        }
2678
        break;
2679
    case '\0':
2680
        expr_error(mon, "unexpected end of expression");
2681
        n = 0;
2682
        break;
2683
    default:
2684
#if TARGET_PHYS_ADDR_BITS > 32
2685
        n = strtoull(pch, &p, 0);
2686
#else
2687
        n = strtoul(pch, &p, 0);
2688
#endif
2689
        if (pch == p) {
2690
            expr_error(mon, "invalid char in expression");
2691
        }
2692
        pch = p;
2693
        while (qemu_isspace(*pch))
2694
            pch++;
2695
        break;
2696
    }
2697
    return n;
2698
}
2699

    
2700

    
2701
static int64_t expr_prod(Monitor *mon)
2702
{
2703
    int64_t val, val2;
2704
    int op;
2705

    
2706
    val = expr_unary(mon);
2707
    for(;;) {
2708
        op = *pch;
2709
        if (op != '*' && op != '/' && op != '%')
2710
            break;
2711
        next();
2712
        val2 = expr_unary(mon);
2713
        switch(op) {
2714
        default:
2715
        case '*':
2716
            val *= val2;
2717
            break;
2718
        case '/':
2719
        case '%':
2720
            if (val2 == 0)
2721
                expr_error(mon, "division by zero");
2722
            if (op == '/')
2723
                val /= val2;
2724
            else
2725
                val %= val2;
2726
            break;
2727
        }
2728
    }
2729
    return val;
2730
}
2731

    
2732
static int64_t expr_logic(Monitor *mon)
2733
{
2734
    int64_t val, val2;
2735
    int op;
2736

    
2737
    val = expr_prod(mon);
2738
    for(;;) {
2739
        op = *pch;
2740
        if (op != '&' && op != '|' && op != '^')
2741
            break;
2742
        next();
2743
        val2 = expr_prod(mon);
2744
        switch(op) {
2745
        default:
2746
        case '&':
2747
            val &= val2;
2748
            break;
2749
        case '|':
2750
            val |= val2;
2751
            break;
2752
        case '^':
2753
            val ^= val2;
2754
            break;
2755
        }
2756
    }
2757
    return val;
2758
}
2759

    
2760
static int64_t expr_sum(Monitor *mon)
2761
{
2762
    int64_t val, val2;
2763
    int op;
2764

    
2765
    val = expr_logic(mon);
2766
    for(;;) {
2767
        op = *pch;
2768
        if (op != '+' && op != '-')
2769
            break;
2770
        next();
2771
        val2 = expr_logic(mon);
2772
        if (op == '+')
2773
            val += val2;
2774
        else
2775
            val -= val2;
2776
    }
2777
    return val;
2778
}
2779

    
2780
static int get_expr(Monitor *mon, int64_t *pval, const char **pp)
2781
{
2782
    pch = *pp;
2783
    if (setjmp(expr_env)) {
2784
        *pp = pch;
2785
        return -1;
2786
    }
2787
    while (qemu_isspace(*pch))
2788
        pch++;
2789
    *pval = expr_sum(mon);
2790
    *pp = pch;
2791
    return 0;
2792
}
2793

    
2794
static int get_str(char *buf, int buf_size, const char **pp)
2795
{
2796
    const char *p;
2797
    char *q;
2798
    int c;
2799

    
2800
    q = buf;
2801
    p = *pp;
2802
    while (qemu_isspace(*p))
2803
        p++;
2804
    if (*p == '\0') {
2805
    fail:
2806
        *q = '\0';
2807
        *pp = p;
2808
        return -1;
2809
    }
2810
    if (*p == '\"') {
2811
        p++;
2812
        while (*p != '\0' && *p != '\"') {
2813
            if (*p == '\\') {
2814
                p++;
2815
                c = *p++;
2816
                switch(c) {
2817
                case 'n':
2818
                    c = '\n';
2819
                    break;
2820
                case 'r':
2821
                    c = '\r';
2822
                    break;
2823
                case '\\':
2824
                case '\'':
2825
                case '\"':
2826
                    break;
2827
                default:
2828
                    qemu_printf("unsupported escape code: '\\%c'\n", c);
2829
                    goto fail;
2830
                }
2831
                if ((q - buf) < buf_size - 1) {
2832
                    *q++ = c;
2833
                }
2834
            } else {
2835
                if ((q - buf) < buf_size - 1) {
2836
                    *q++ = *p;
2837
                }
2838
                p++;
2839
            }
2840
        }
2841
        if (*p != '\"') {
2842
            qemu_printf("unterminated string\n");
2843
            goto fail;
2844
        }
2845
        p++;
2846
    } else {
2847
        while (*p != '\0' && !qemu_isspace(*p)) {
2848
            if ((q - buf) < buf_size - 1) {
2849
                *q++ = *p;
2850
            }
2851
            p++;
2852
        }
2853
    }
2854
    *q = '\0';
2855
    *pp = p;
2856
    return 0;
2857
}
2858

    
2859
/*
2860
 * Store the command-name in cmdname, and return a pointer to
2861
 * the remaining of the command string.
2862
 */
2863
static const char *get_command_name(const char *cmdline,
2864
                                    char *cmdname, size_t nlen)
2865
{
2866
    size_t len;
2867
    const char *p, *pstart;
2868

    
2869
    p = cmdline;
2870
    while (qemu_isspace(*p))
2871
        p++;
2872
    if (*p == '\0')
2873
        return NULL;
2874
    pstart = p;
2875
    while (*p != '\0' && *p != '/' && !qemu_isspace(*p))
2876
        p++;
2877
    len = p - pstart;
2878
    if (len > nlen - 1)
2879
        len = nlen - 1;
2880
    memcpy(cmdname, pstart, len);
2881
    cmdname[len] = '\0';
2882
    return p;
2883
}
2884

    
2885
/**
2886
 * Read key of 'type' into 'key' and return the current
2887
 * 'type' pointer.
2888
 */
2889
static char *key_get_info(const char *type, char **key)
2890
{
2891
    size_t len;
2892
    char *p, *str;
2893

    
2894
    if (*type == ',')
2895
        type++;
2896

    
2897
    p = strchr(type, ':');
2898
    if (!p) {
2899
        *key = NULL;
2900
        return NULL;
2901
    }
2902
    len = p - type;
2903

    
2904
    str = qemu_malloc(len + 1);
2905
    memcpy(str, type, len);
2906
    str[len] = '\0';
2907

    
2908
    *key = str;
2909
    return ++p;
2910
}
2911

    
2912
static int default_fmt_format = 'x';
2913
static int default_fmt_size = 4;
2914

    
2915
#define MAX_ARGS 16
2916

    
2917
static int is_valid_option(const char *c, const char *typestr)
2918
{
2919
    char option[3];
2920
  
2921
    option[0] = '-';
2922
    option[1] = *c;
2923
    option[2] = '\0';
2924
  
2925
    typestr = strstr(typestr, option);
2926
    return (typestr != NULL);
2927
}
2928

    
2929
static const mon_cmd_t *monitor_parse_command(Monitor *mon,
2930
                                              const char *cmdline,
2931
                                              QDict *qdict)
2932
{
2933
    const char *p, *typestr;
2934
    int c;
2935
    const mon_cmd_t *cmd;
2936
    char cmdname[256];
2937
    char buf[1024];
2938
    char *key;
2939

    
2940
#ifdef DEBUG
2941
    monitor_printf(mon, "command='%s'\n", cmdline);
2942
#endif
2943

    
2944
    /* extract the command name */
2945
    p = get_command_name(cmdline, cmdname, sizeof(cmdname));
2946
    if (!p)
2947
        return NULL;
2948

    
2949
    /* find the command */
2950
    for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
2951
        if (compare_cmd(cmdname, cmd->name))
2952
            break;
2953
    }
2954

    
2955
    if (cmd->name == NULL) {
2956
        monitor_printf(mon, "unknown command: '%s'\n", cmdname);
2957
        return NULL;
2958
    }
2959

    
2960
    /* parse the parameters */
2961
    typestr = cmd->args_type;
2962
    for(;;) {
2963
        typestr = key_get_info(typestr, &key);
2964
        if (!typestr)
2965
            break;
2966
        c = *typestr;
2967
        typestr++;
2968
        switch(c) {
2969
        case 'F':
2970
        case 'B':
2971
        case 's':
2972
            {
2973
                int ret;
2974

    
2975
                while (qemu_isspace(*p))
2976
                    p++;
2977
                if (*typestr == '?') {
2978
                    typestr++;
2979
                    if (*p == '\0') {
2980
                        /* no optional string: NULL argument */
2981
                        break;
2982
                    }
2983
                }
2984
                ret = get_str(buf, sizeof(buf), &p);
2985
                if (ret < 0) {
2986
                    switch(c) {
2987
                    case 'F':
2988
                        monitor_printf(mon, "%s: filename expected\n",
2989
                                       cmdname);
2990
                        break;
2991
                    case 'B':
2992
                        monitor_printf(mon, "%s: block device name expected\n",
2993
                                       cmdname);
2994
                        break;
2995
                    default:
2996
                        monitor_printf(mon, "%s: string expected\n", cmdname);
2997
                        break;
2998
                    }
2999
                    goto fail;
3000
                }
3001
                qdict_put(qdict, key, qstring_from_str(buf));
3002
            }
3003
            break;
3004
        case '/':
3005
            {
3006
                int count, format, size;
3007

    
3008
                while (qemu_isspace(*p))
3009
                    p++;
3010
                if (*p == '/') {
3011
                    /* format found */
3012
                    p++;
3013
                    count = 1;
3014
                    if (qemu_isdigit(*p)) {
3015
                        count = 0;
3016
                        while (qemu_isdigit(*p)) {
3017
                            count = count * 10 + (*p - '0');
3018
                            p++;
3019
                        }
3020
                    }
3021
                    size = -1;
3022
                    format = -1;
3023
                    for(;;) {
3024
                        switch(*p) {
3025
                        case 'o':
3026
                        case 'd':
3027
                        case 'u':
3028
                        case 'x':
3029
                        case 'i':
3030
                        case 'c':
3031
                            format = *p++;
3032
                            break;
3033
                        case 'b':
3034
                            size = 1;
3035
                            p++;
3036
                            break;
3037
                        case 'h':
3038
                            size = 2;
3039
                            p++;
3040
                            break;
3041
                        case 'w':
3042
                            size = 4;
3043
                            p++;
3044
                            break;
3045
                        case 'g':
3046
                        case 'L':
3047
                            size = 8;
3048
                            p++;
3049
                            break;
3050
                        default:
3051
                            goto next;
3052
                        }
3053
                    }
3054
                next:
3055
                    if (*p != '\0' && !qemu_isspace(*p)) {
3056
                        monitor_printf(mon, "invalid char in format: '%c'\n",
3057
                                       *p);
3058
                        goto fail;
3059
                    }
3060
                    if (format < 0)
3061
                        format = default_fmt_format;
3062
                    if (format != 'i') {
3063
                        /* for 'i', not specifying a size gives -1 as size */
3064
                        if (size < 0)
3065
                            size = default_fmt_size;
3066
                        default_fmt_size = size;
3067
                    }
3068
                    default_fmt_format = format;
3069
                } else {
3070
                    count = 1;
3071
                    format = default_fmt_format;
3072
                    if (format != 'i') {
3073
                        size = default_fmt_size;
3074
                    } else {
3075
                        size = -1;
3076
                    }
3077
                }
3078
                qdict_put(qdict, "count", qint_from_int(count));
3079
                qdict_put(qdict, "format", qint_from_int(format));
3080
                qdict_put(qdict, "size", qint_from_int(size));
3081
            }
3082
            break;
3083
        case 'i':
3084
        case 'l':
3085
            {
3086
                int64_t val;
3087

    
3088
                while (qemu_isspace(*p))
3089
                    p++;
3090
                if (*typestr == '?' || *typestr == '.') {
3091
                    if (*typestr == '?') {
3092
                        if (*p == '\0') {
3093
                            typestr++;
3094
                            break;
3095
                        }
3096
                    } else {
3097
                        if (*p == '.') {
3098
                            p++;
3099
                            while (qemu_isspace(*p))
3100
                                p++;
3101
                        } else {
3102
                            typestr++;
3103
                            break;
3104
                        }
3105
                    }
3106
                    typestr++;
3107
                }
3108
                if (get_expr(mon, &val, &p))
3109
                    goto fail;
3110
                /* Check if 'i' is greater than 32-bit */
3111
                if ((c == 'i') && ((val >> 32) & 0xffffffff)) {
3112
                    monitor_printf(mon, "\'%s\' has failed: ", cmdname);
3113
                    monitor_printf(mon, "integer is for 32-bit values\n");
3114
                    goto fail;
3115
                }
3116
                qdict_put(qdict, key, qint_from_int(val));
3117
            }
3118
            break;
3119
        case '-':
3120
            {
3121
                const char *tmp = p;
3122
                int has_option, skip_key = 0;
3123
                /* option */
3124

    
3125
                c = *typestr++;
3126
                if (c == '\0')
3127
                    goto bad_type;
3128
                while (qemu_isspace(*p))
3129
                    p++;
3130
                has_option = 0;
3131
                if (*p == '-') {
3132
                    p++;
3133
                    if(c != *p) {
3134
                        if(!is_valid_option(p, typestr)) {
3135
                  
3136
                            monitor_printf(mon, "%s: unsupported option -%c\n",
3137
                                           cmdname, *p);
3138
                            goto fail;
3139
                        } else {
3140
                            skip_key = 1;
3141
                        }
3142
                    }
3143
                    if(skip_key) {
3144
                        p = tmp;
3145
                    } else {
3146
                        p++;
3147
                        has_option = 1;
3148
                    }
3149
                }
3150
                qdict_put(qdict, key, qint_from_int(has_option));
3151
            }
3152
            break;
3153
        default:
3154
        bad_type:
3155
            monitor_printf(mon, "%s: unknown type '%c'\n", cmdname, c);
3156
            goto fail;
3157
        }
3158
        qemu_free(key);
3159
        key = NULL;
3160
    }
3161
    /* check that all arguments were parsed */
3162
    while (qemu_isspace(*p))
3163
        p++;
3164
    if (*p != '\0') {
3165
        monitor_printf(mon, "%s: extraneous characters at the end of line\n",
3166
                       cmdname);
3167
        goto fail;
3168
    }
3169

    
3170
    return cmd;
3171

    
3172
fail:
3173
    qemu_free(key);
3174
    return NULL;
3175
}
3176

    
3177
static void monitor_print_error(Monitor *mon)
3178
{
3179
    qerror_print(mon->error);
3180
    QDECREF(mon->error);
3181
    mon->error = NULL;
3182
}
3183

    
3184
static void monitor_handle_command(Monitor *mon, const char *cmdline)
3185
{
3186
    QDict *qdict;
3187
    const mon_cmd_t *cmd;
3188

    
3189
    qdict = qdict_new();
3190

    
3191
    cmd = monitor_parse_command(mon, cmdline, qdict);
3192
    if (!cmd)
3193
        goto out;
3194

    
3195
    qemu_errors_to_mon(mon);
3196

    
3197
    if (monitor_handler_ported(cmd)) {
3198
        QObject *data = NULL;
3199

    
3200
        cmd->mhandler.cmd_new(mon, qdict, &data);
3201
        if (data)
3202
            cmd->user_print(mon, data);
3203

    
3204
        qobject_decref(data);
3205
    } else {
3206
        cmd->mhandler.cmd(mon, qdict);
3207
    }
3208

    
3209
    if (monitor_has_error(mon))
3210
        monitor_print_error(mon);
3211

    
3212
    qemu_errors_to_previous();
3213

    
3214
out:
3215
    QDECREF(qdict);
3216
}
3217

    
3218
static void cmd_completion(const char *name, const char *list)
3219
{
3220
    const char *p, *pstart;
3221
    char cmd[128];
3222
    int len;
3223

    
3224
    p = list;
3225
    for(;;) {
3226
        pstart = p;
3227
        p = strchr(p, '|');
3228
        if (!p)
3229
            p = pstart + strlen(pstart);
3230
        len = p - pstart;
3231
        if (len > sizeof(cmd) - 2)
3232
            len = sizeof(cmd) - 2;
3233
        memcpy(cmd, pstart, len);
3234
        cmd[len] = '\0';
3235
        if (name[0] == '\0' || !strncmp(name, cmd, strlen(name))) {
3236
            readline_add_completion(cur_mon->rs, cmd);
3237
        }
3238
        if (*p == '\0')
3239
            break;
3240
        p++;
3241
    }
3242
}
3243

    
3244
static void file_completion(const char *input)
3245
{
3246
    DIR *ffs;
3247
    struct dirent *d;
3248
    char path[1024];
3249
    char file[1024], file_prefix[1024];
3250
    int input_path_len;
3251
    const char *p;
3252

    
3253
    p = strrchr(input, '/');
3254
    if (!p) {
3255
        input_path_len = 0;
3256
        pstrcpy(file_prefix, sizeof(file_prefix), input);
3257
        pstrcpy(path, sizeof(path), ".");
3258
    } else {
3259
        input_path_len = p - input + 1;
3260
        memcpy(path, input, input_path_len);
3261
        if (input_path_len > sizeof(path) - 1)
3262
            input_path_len = sizeof(path) - 1;
3263
        path[input_path_len] = '\0';
3264
        pstrcpy(file_prefix, sizeof(file_prefix), p + 1);
3265
    }
3266
#ifdef DEBUG_COMPLETION
3267
    monitor_printf(cur_mon, "input='%s' path='%s' prefix='%s'\n",
3268
                   input, path, file_prefix);
3269
#endif
3270
    ffs = opendir(path);
3271
    if (!ffs)
3272
        return;
3273
    for(;;) {
3274
        struct stat sb;
3275
        d = readdir(ffs);
3276
        if (!d)
3277
            break;
3278
        if (strstart(d->d_name, file_prefix, NULL)) {
3279
            memcpy(file, input, input_path_len);
3280
            if (input_path_len < sizeof(file))
3281
                pstrcpy(file + input_path_len, sizeof(file) - input_path_len,
3282
                        d->d_name);
3283
            /* stat the file to find out if it's a directory.
3284
             * In that case add a slash to speed up typing long paths
3285
             */
3286
            stat(file, &sb);
3287
            if(S_ISDIR(sb.st_mode))
3288
                pstrcat(file, sizeof(file), "/");
3289
            readline_add_completion(cur_mon->rs, file);
3290
        }
3291
    }
3292
    closedir(ffs);
3293
}
3294

    
3295
static void block_completion_it(void *opaque, BlockDriverState *bs)
3296
{
3297
    const char *name = bdrv_get_device_name(bs);
3298
    const char *input = opaque;
3299

    
3300
    if (input[0] == '\0' ||
3301
        !strncmp(name, (char *)input, strlen(input))) {
3302
        readline_add_completion(cur_mon->rs, name);
3303
    }
3304
}
3305

    
3306
/* NOTE: this parser is an approximate form of the real command parser */
3307
static void parse_cmdline(const char *cmdline,
3308
                         int *pnb_args, char **args)
3309
{
3310
    const char *p;
3311
    int nb_args, ret;
3312
    char buf[1024];
3313

    
3314
    p = cmdline;
3315
    nb_args = 0;
3316
    for(;;) {
3317
        while (qemu_isspace(*p))
3318
            p++;
3319
        if (*p == '\0')
3320
            break;
3321
        if (nb_args >= MAX_ARGS)
3322
            break;
3323
        ret = get_str(buf, sizeof(buf), &p);
3324
        args[nb_args] = qemu_strdup(buf);
3325
        nb_args++;
3326
        if (ret < 0)
3327
            break;
3328
    }
3329
    *pnb_args = nb_args;
3330
}
3331

    
3332
static const char *next_arg_type(const char *typestr)
3333
{
3334
    const char *p = strchr(typestr, ':');
3335
    return (p != NULL ? ++p : typestr);
3336
}
3337

    
3338
static void monitor_find_completion(const char *cmdline)
3339
{
3340
    const char *cmdname;
3341
    char *args[MAX_ARGS];
3342
    int nb_args, i, len;
3343
    const char *ptype, *str;
3344
    const mon_cmd_t *cmd;
3345
    const KeyDef *key;
3346

    
3347
    parse_cmdline(cmdline, &nb_args, args);
3348
#ifdef DEBUG_COMPLETION
3349
    for(i = 0; i < nb_args; i++) {
3350
        monitor_printf(cur_mon, "arg%d = '%s'\n", i, (char *)args[i]);
3351
    }
3352
#endif
3353

    
3354
    /* if the line ends with a space, it means we want to complete the
3355
       next arg */
3356
    len = strlen(cmdline);
3357
    if (len > 0 && qemu_isspace(cmdline[len - 1])) {
3358
        if (nb_args >= MAX_ARGS)
3359
            return;
3360
        args[nb_args++] = qemu_strdup("");
3361
    }
3362
    if (nb_args <= 1) {
3363
        /* command completion */
3364
        if (nb_args == 0)
3365
            cmdname = "";
3366
        else
3367
            cmdname = args[0];
3368
        readline_set_completion_index(cur_mon->rs, strlen(cmdname));
3369
        for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
3370
            cmd_completion(cmdname, cmd->name);
3371
        }
3372
    } else {
3373
        /* find the command */
3374
        for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
3375
            if (compare_cmd(args[0], cmd->name))
3376
                goto found;
3377
        }
3378
        return;
3379
    found:
3380
        ptype = next_arg_type(cmd->args_type);
3381
        for(i = 0; i < nb_args - 2; i++) {
3382
            if (*ptype != '\0') {
3383
                ptype = next_arg_type(ptype);
3384
                while (*ptype == '?')
3385
                    ptype = next_arg_type(ptype);
3386
            }
3387
        }
3388
        str = args[nb_args - 1];
3389
        if (*ptype == '-' && ptype[1] != '\0') {
3390
            ptype += 2;
3391
        }
3392
        switch(*ptype) {
3393
        case 'F':
3394
            /* file completion */
3395
            readline_set_completion_index(cur_mon->rs, strlen(str));
3396
            file_completion(str);
3397
            break;
3398
        case 'B':
3399
            /* block device name completion */
3400
            readline_set_completion_index(cur_mon->rs, strlen(str));
3401
            bdrv_iterate(block_completion_it, (void *)str);
3402
            break;
3403
        case 's':
3404
            /* XXX: more generic ? */
3405
            if (!strcmp(cmd->name, "info")) {
3406
                readline_set_completion_index(cur_mon->rs, strlen(str));
3407
                for(cmd = info_cmds; cmd->name != NULL; cmd++) {
3408
                    cmd_completion(str, cmd->name);
3409
                }
3410
            } else if (!strcmp(cmd->name, "sendkey")) {
3411
                char *sep = strrchr(str, '-');
3412
                if (sep)
3413
                    str = sep + 1;
3414
                readline_set_completion_index(cur_mon->rs, strlen(str));
3415
                for(key = key_defs; key->name != NULL; key++) {
3416
                    cmd_completion(str, key->name);
3417
                }
3418
            } else if (!strcmp(cmd->name, "help|?")) {
3419
                readline_set_completion_index(cur_mon->rs, strlen(str));
3420
                for (cmd = mon_cmds; cmd->name != NULL; cmd++) {
3421
                    cmd_completion(str, cmd->name);
3422
                }
3423
            }
3424
            break;
3425
        default:
3426
            break;
3427
        }
3428
    }
3429
    for(i = 0; i < nb_args; i++)
3430
        qemu_free(args[i]);
3431
}
3432

    
3433
static int monitor_can_read(void *opaque)
3434
{
3435
    Monitor *mon = opaque;
3436

    
3437
    return (mon->suspend_cnt == 0) ? 128 : 0;
3438
}
3439

    
3440
static void monitor_read(void *opaque, const uint8_t *buf, int size)
3441
{
3442
    Monitor *old_mon = cur_mon;
3443
    int i;
3444

    
3445
    cur_mon = opaque;
3446

    
3447
    if (cur_mon->rs) {
3448
        for (i = 0; i < size; i++)
3449
            readline_handle_byte(cur_mon->rs, buf[i]);
3450
    } else {
3451
        if (size == 0 || buf[size - 1] != 0)
3452
            monitor_printf(cur_mon, "corrupted command\n");
3453
        else
3454
            monitor_handle_command(cur_mon, (char *)buf);
3455
    }
3456

    
3457
    cur_mon = old_mon;
3458
}
3459

    
3460
static void monitor_command_cb(Monitor *mon, const char *cmdline, void *opaque)
3461
{
3462
    monitor_suspend(mon);
3463
    monitor_handle_command(mon, cmdline);
3464
    monitor_resume(mon);
3465
}
3466

    
3467
int monitor_suspend(Monitor *mon)
3468
{
3469
    if (!mon->rs)
3470
        return -ENOTTY;
3471
    mon->suspend_cnt++;
3472
    return 0;
3473
}
3474

    
3475
void monitor_resume(Monitor *mon)
3476
{
3477
    if (!mon->rs)
3478
        return;
3479
    if (--mon->suspend_cnt == 0)
3480
        readline_show_prompt(mon->rs);
3481
}
3482

    
3483
static void monitor_event(void *opaque, int event)
3484
{
3485
    Monitor *mon = opaque;
3486

    
3487
    switch (event) {
3488
    case CHR_EVENT_MUX_IN:
3489
        mon->mux_out = 0;
3490
        if (mon->reset_seen) {
3491
            readline_restart(mon->rs);
3492
            monitor_resume(mon);
3493
            monitor_flush(mon);
3494
        } else {
3495
            mon->suspend_cnt = 0;
3496
        }
3497
        break;
3498

    
3499
    case CHR_EVENT_MUX_OUT:
3500
        if (mon->reset_seen) {
3501
            if (mon->suspend_cnt == 0) {
3502
                monitor_printf(mon, "\n");
3503
            }
3504
            monitor_flush(mon);
3505
            monitor_suspend(mon);
3506
        } else {
3507
            mon->suspend_cnt++;
3508
        }
3509
        mon->mux_out = 1;
3510
        break;
3511

    
3512
    case CHR_EVENT_OPENED:
3513
        monitor_printf(mon, "QEMU %s monitor - type 'help' for more "
3514
                       "information\n", QEMU_VERSION);
3515
        if (!mon->mux_out) {
3516
            readline_show_prompt(mon->rs);
3517
        }
3518
        mon->reset_seen = 1;
3519
        break;
3520
    }
3521
}
3522

    
3523

    
3524
/*
3525
 * Local variables:
3526
 *  c-indent-level: 4
3527
 *  c-basic-offset: 4
3528
 *  tab-width: 8
3529
 * End:
3530
 */
3531

    
3532
void monitor_init(CharDriverState *chr, int flags)
3533
{
3534
    static int is_first_init = 1;
3535
    Monitor *mon;
3536

    
3537
    if (is_first_init) {
3538
        key_timer = qemu_new_timer(vm_clock, release_keys, NULL);
3539
        is_first_init = 0;
3540
    }
3541

    
3542
    mon = qemu_mallocz(sizeof(*mon));
3543

    
3544
    mon->chr = chr;
3545
    mon->flags = flags;
3546
    if (flags & MONITOR_USE_READLINE) {
3547
        mon->rs = readline_init(mon, monitor_find_completion);
3548
        monitor_read_command(mon, 0);
3549
    }
3550

    
3551
    qemu_chr_add_handlers(chr, monitor_can_read, monitor_read, monitor_event,
3552
                          mon);
3553

    
3554
    QLIST_INSERT_HEAD(&mon_list, mon, entry);
3555
    if (!cur_mon || (flags & MONITOR_IS_DEFAULT))
3556
        cur_mon = mon;
3557
}
3558

    
3559
static void bdrv_password_cb(Monitor *mon, const char *password, void *opaque)
3560
{
3561
    BlockDriverState *bs = opaque;
3562
    int ret = 0;
3563

    
3564
    if (bdrv_set_key(bs, password) != 0) {
3565
        monitor_printf(mon, "invalid password\n");
3566
        ret = -EPERM;
3567
    }
3568
    if (mon->password_completion_cb)
3569
        mon->password_completion_cb(mon->password_opaque, ret);
3570

    
3571
    monitor_read_command(mon, 1);
3572
}
3573

    
3574
void monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs,
3575
                                 BlockDriverCompletionFunc *completion_cb,
3576
                                 void *opaque)
3577
{
3578
    int err;
3579

    
3580
    if (!bdrv_key_required(bs)) {
3581
        if (completion_cb)
3582
            completion_cb(opaque, 0);
3583
        return;
3584
    }
3585

    
3586
    monitor_printf(mon, "%s (%s) is encrypted.\n", bdrv_get_device_name(bs),
3587
                   bdrv_get_encrypted_filename(bs));
3588

    
3589
    mon->password_completion_cb = completion_cb;
3590
    mon->password_opaque = opaque;
3591

    
3592
    err = monitor_read_password(mon, bdrv_password_cb, bs);
3593

    
3594
    if (err && completion_cb)
3595
        completion_cb(opaque, err);
3596
}
3597

    
3598
typedef struct QemuErrorSink QemuErrorSink;
3599
struct QemuErrorSink {
3600
    enum {
3601
        ERR_SINK_FILE,
3602
        ERR_SINK_MONITOR,
3603
    } dest;
3604
    union {
3605
        FILE    *fp;
3606
        Monitor *mon;
3607
    };
3608
    QemuErrorSink *previous;
3609
};
3610

    
3611
static QemuErrorSink *qemu_error_sink;
3612

    
3613
void qemu_errors_to_file(FILE *fp)
3614
{
3615
    QemuErrorSink *sink;
3616

    
3617
    sink = qemu_mallocz(sizeof(*sink));
3618
    sink->dest = ERR_SINK_FILE;
3619
    sink->fp = fp;
3620
    sink->previous = qemu_error_sink;
3621
    qemu_error_sink = sink;
3622
}
3623

    
3624
void qemu_errors_to_mon(Monitor *mon)
3625
{
3626
    QemuErrorSink *sink;
3627

    
3628
    sink = qemu_mallocz(sizeof(*sink));
3629
    sink->dest = ERR_SINK_MONITOR;
3630
    sink->mon = mon;
3631
    sink->previous = qemu_error_sink;
3632
    qemu_error_sink = sink;
3633
}
3634

    
3635
void qemu_errors_to_previous(void)
3636
{
3637
    QemuErrorSink *sink;
3638

    
3639
    assert(qemu_error_sink != NULL);
3640
    sink = qemu_error_sink;
3641
    qemu_error_sink = sink->previous;
3642
    qemu_free(sink);
3643
}
3644

    
3645
void qemu_error(const char *fmt, ...)
3646
{
3647
    va_list args;
3648

    
3649
    assert(qemu_error_sink != NULL);
3650
    switch (qemu_error_sink->dest) {
3651
    case ERR_SINK_FILE:
3652
        va_start(args, fmt);
3653
        vfprintf(qemu_error_sink->fp, fmt, args);
3654
        va_end(args);
3655
        break;
3656
    case ERR_SINK_MONITOR:
3657
        va_start(args, fmt);
3658
        monitor_vprintf(qemu_error_sink->mon, fmt, args);
3659
        va_end(args);
3660
        break;
3661
    }
3662
}
3663

    
3664
void qemu_error_internal(const char *file, int linenr, const char *func,
3665
                         const char *fmt, ...)
3666
{
3667
    va_list va;
3668
    QError *qerror;
3669

    
3670
    assert(qemu_error_sink != NULL);
3671

    
3672
    va_start(va, fmt);
3673
    qerror = qerror_from_info(file, linenr, func, fmt, &va);
3674
    va_end(va);
3675

    
3676
    switch (qemu_error_sink->dest) {
3677
    case ERR_SINK_FILE:
3678
        qerror_print(qerror);
3679
        QDECREF(qerror);
3680
        break;
3681
    case ERR_SINK_MONITOR:
3682
        assert(qemu_error_sink->mon->error == NULL);
3683
        qemu_error_sink->mon->error = qerror;
3684
        break;
3685
    }
3686
}