Statistics
| Branch: | Revision:

root / monitor.c @ 13917bee

History | View | Annotate | Download (91.3 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 "qdict.h"
50
#include "qstring.h"
51

    
52
//#define DEBUG
53
//#define DEBUG_COMPLETION
54

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

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

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

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

    
108
static QLIST_HEAD(mon_list, Monitor) mon_list;
109

    
110
static const mon_cmd_t mon_cmds[];
111
static const mon_cmd_t info_cmds[];
112

    
113
Monitor *cur_mon = NULL;
114

    
115
static void monitor_command_cb(Monitor *mon, const char *cmdline,
116
                               void *opaque);
117

    
118
static void monitor_read_command(Monitor *mon, int show_prompt)
119
{
120
    readline_start(mon->rs, "(qemu) ", 0, monitor_command_cb, NULL);
121
    if (show_prompt)
122
        readline_show_prompt(mon->rs);
123
}
124

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

    
138
void monitor_flush(Monitor *mon)
139
{
140
    if (mon && mon->outbuf_index != 0 && !mon->mux_out) {
141
        qemu_chr_write(mon->chr, mon->outbuf, mon->outbuf_index);
142
        mon->outbuf_index = 0;
143
    }
144
}
145

    
146
/* flush at every end of line or if the buffer is full */
147
static void monitor_puts(Monitor *mon, const char *str)
148
{
149
    char c;
150

    
151
    if (!mon)
152
        return;
153

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

    
167
void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
168
{
169
    char buf[4096];
170
    vsnprintf(buf, sizeof(buf), fmt, ap);
171
    monitor_puts(mon, buf);
172
}
173

    
174
void monitor_printf(Monitor *mon, const char *fmt, ...)
175
{
176
    va_list ap;
177
    va_start(ap, fmt);
178
    monitor_vprintf(mon, fmt, ap);
179
    va_end(ap);
180
}
181

    
182
void monitor_print_filename(Monitor *mon, const char *filename)
183
{
184
    int i;
185

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

    
209
static int monitor_fprintf(FILE *stream, const char *fmt, ...)
210
{
211
    va_list ap;
212
    va_start(ap, fmt);
213
    monitor_vprintf((Monitor *)stream, fmt, ap);
214
    va_end(ap);
215
    return 0;
216
}
217

    
218
static inline int monitor_handler_ported(const mon_cmd_t *cmd)
219
{
220
    return cmd->user_print != NULL;
221
}
222

    
223
static int compare_cmd(const char *name, const char *list)
224
{
225
    const char *p, *pstart;
226
    int len;
227
    len = strlen(name);
228
    p = list;
229
    for(;;) {
230
        pstart = p;
231
        p = strchr(p, '|');
232
        if (!p)
233
            p = pstart + strlen(pstart);
234
        if ((p - pstart) == len && !memcmp(pstart, name, len))
235
            return 1;
236
        if (*p == '\0')
237
            break;
238
        p++;
239
    }
240
    return 0;
241
}
242

    
243
static void help_cmd_dump(Monitor *mon, const mon_cmd_t *cmds,
244
                          const char *prefix, const char *name)
245
{
246
    const mon_cmd_t *cmd;
247

    
248
    for(cmd = cmds; cmd->name != NULL; cmd++) {
249
        if (!name || !strcmp(name, cmd->name))
250
            monitor_printf(mon, "%s%s %s -- %s\n", prefix, cmd->name,
251
                           cmd->params, cmd->help);
252
    }
253
}
254

    
255
static void help_cmd(Monitor *mon, const char *name)
256
{
257
    if (name && !strcmp(name, "info")) {
258
        help_cmd_dump(mon, info_cmds, "info ", NULL);
259
    } else {
260
        help_cmd_dump(mon, mon_cmds, "", name);
261
        if (name && !strcmp(name, "log")) {
262
            const CPULogItem *item;
263
            monitor_printf(mon, "Log items (comma separated):\n");
264
            monitor_printf(mon, "%-10s %s\n", "none", "remove all logs");
265
            for(item = cpu_log_items; item->mask != 0; item++) {
266
                monitor_printf(mon, "%-10s %s\n", item->name, item->help);
267
            }
268
        }
269
    }
270
}
271

    
272
static void do_help_cmd(Monitor *mon, const QDict *qdict)
273
{
274
    help_cmd(mon, qdict_get_try_str(qdict, "name"));
275
}
276

    
277
static void do_commit(Monitor *mon, const QDict *qdict)
278
{
279
    int all_devices;
280
    DriveInfo *dinfo;
281
    const char *device = qdict_get_str(qdict, "device");
282

    
283
    all_devices = !strcmp(device, "all");
284
    QTAILQ_FOREACH(dinfo, &drives, next) {
285
        if (!all_devices)
286
            if (strcmp(bdrv_get_device_name(dinfo->bdrv), device))
287
                continue;
288
        bdrv_commit(dinfo->bdrv);
289
    }
290
}
291

    
292
static void do_info(Monitor *mon, const QDict *qdict)
293
{
294
    const mon_cmd_t *cmd;
295
    const char *item = qdict_get_try_str(qdict, "item");
296

    
297
    if (!item)
298
        goto help;
299
    for(cmd = info_cmds; cmd->name != NULL; cmd++) {
300
        if (compare_cmd(item, cmd->name))
301
            goto found;
302
    }
303
 help:
304
    help_cmd(mon, "info");
305
    return;
306
 found:
307
    cmd->mhandler.info(mon);
308
}
309

    
310
static void do_info_version(Monitor *mon)
311
{
312
    monitor_printf(mon, "%s\n", QEMU_VERSION QEMU_PKGVERSION);
313
}
314

    
315
static void do_info_name(Monitor *mon)
316
{
317
    if (qemu_name)
318
        monitor_printf(mon, "%s\n", qemu_name);
319
}
320

    
321
#if defined(TARGET_I386)
322
static void do_info_hpet(Monitor *mon)
323
{
324
    monitor_printf(mon, "HPET is %s by QEMU\n",
325
                   (no_hpet) ? "disabled" : "enabled");
326
}
327
#endif
328

    
329
static void do_info_uuid(Monitor *mon)
330
{
331
    monitor_printf(mon, UUID_FMT "\n", qemu_uuid[0], qemu_uuid[1],
332
                   qemu_uuid[2], qemu_uuid[3], qemu_uuid[4], qemu_uuid[5],
333
                   qemu_uuid[6], qemu_uuid[7], qemu_uuid[8], qemu_uuid[9],
334
                   qemu_uuid[10], qemu_uuid[11], qemu_uuid[12], qemu_uuid[13],
335
                   qemu_uuid[14], qemu_uuid[15]);
336
}
337

    
338
/* get the current CPU defined by the user */
339
static int mon_set_cpu(int cpu_index)
340
{
341
    CPUState *env;
342

    
343
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
344
        if (env->cpu_index == cpu_index) {
345
            cur_mon->mon_cpu = env;
346
            return 0;
347
        }
348
    }
349
    return -1;
350
}
351

    
352
static CPUState *mon_get_cpu(void)
353
{
354
    if (!cur_mon->mon_cpu) {
355
        mon_set_cpu(0);
356
    }
357
    cpu_synchronize_state(cur_mon->mon_cpu);
358
    return cur_mon->mon_cpu;
359
}
360

    
361
static void do_info_registers(Monitor *mon)
362
{
363
    CPUState *env;
364
    env = mon_get_cpu();
365
    if (!env)
366
        return;
367
#ifdef TARGET_I386
368
    cpu_dump_state(env, (FILE *)mon, monitor_fprintf,
369
                   X86_DUMP_FPU);
370
#else
371
    cpu_dump_state(env, (FILE *)mon, monitor_fprintf,
372
                   0);
373
#endif
374
}
375

    
376
static void do_info_cpus(Monitor *mon)
377
{
378
    CPUState *env;
379

    
380
    /* just to set the default cpu if not already done */
381
    mon_get_cpu();
382

    
383
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
384
        cpu_synchronize_state(env);
385
        monitor_printf(mon, "%c CPU #%d:",
386
                       (env == mon->mon_cpu) ? '*' : ' ',
387
                       env->cpu_index);
388
#if defined(TARGET_I386)
389
        monitor_printf(mon, " pc=0x" TARGET_FMT_lx,
390
                       env->eip + env->segs[R_CS].base);
391
#elif defined(TARGET_PPC)
392
        monitor_printf(mon, " nip=0x" TARGET_FMT_lx, env->nip);
393
#elif defined(TARGET_SPARC)
394
        monitor_printf(mon, " pc=0x" TARGET_FMT_lx " npc=0x" TARGET_FMT_lx,
395
                       env->pc, env->npc);
396
#elif defined(TARGET_MIPS)
397
        monitor_printf(mon, " PC=0x" TARGET_FMT_lx, env->active_tc.PC);
398
#endif
399
        if (env->halted)
400
            monitor_printf(mon, " (halted)");
401
        monitor_printf(mon, "\n");
402
    }
403
}
404

    
405
static void do_cpu_set(Monitor *mon, const QDict *qdict)
406
{
407
    int index = qdict_get_int(qdict, "index");
408
    if (mon_set_cpu(index) < 0)
409
        monitor_printf(mon, "Invalid CPU index\n");
410
}
411

    
412
static void do_info_jit(Monitor *mon)
413
{
414
    dump_exec_info((FILE *)mon, monitor_fprintf);
415
}
416

    
417
static void do_info_history(Monitor *mon)
418
{
419
    int i;
420
    const char *str;
421

    
422
    if (!mon->rs)
423
        return;
424
    i = 0;
425
    for(;;) {
426
        str = readline_get_history(mon->rs, i);
427
        if (!str)
428
            break;
429
        monitor_printf(mon, "%d: '%s'\n", i, str);
430
        i++;
431
    }
432
}
433

    
434
#if defined(TARGET_PPC)
435
/* XXX: not implemented in other targets */
436
static void do_info_cpu_stats(Monitor *mon)
437
{
438
    CPUState *env;
439

    
440
    env = mon_get_cpu();
441
    cpu_dump_statistics(env, (FILE *)mon, &monitor_fprintf, 0);
442
}
443
#endif
444

    
445
static void do_quit(Monitor *mon, const QDict *qdict)
446
{
447
    exit(0);
448
}
449

    
450
static int eject_device(Monitor *mon, BlockDriverState *bs, int force)
451
{
452
    if (bdrv_is_inserted(bs)) {
453
        if (!force) {
454
            if (!bdrv_is_removable(bs)) {
455
                monitor_printf(mon, "device is not removable\n");
456
                return -1;
457
            }
458
            if (bdrv_is_locked(bs)) {
459
                monitor_printf(mon, "device is locked\n");
460
                return -1;
461
            }
462
        }
463
        bdrv_close(bs);
464
    }
465
    return 0;
466
}
467

    
468
static void do_eject(Monitor *mon, const QDict *qdict)
469
{
470
    BlockDriverState *bs;
471
    int force = qdict_get_int(qdict, "force");
472
    const char *filename = qdict_get_str(qdict, "filename");
473

    
474
    bs = bdrv_find(filename);
475
    if (!bs) {
476
        monitor_printf(mon, "device not found\n");
477
        return;
478
    }
479
    eject_device(mon, bs, force);
480
}
481

    
482
static void do_change_block(Monitor *mon, const char *device,
483
                            const char *filename, const char *fmt)
484
{
485
    BlockDriverState *bs;
486
    BlockDriver *drv = NULL;
487

    
488
    bs = bdrv_find(device);
489
    if (!bs) {
490
        monitor_printf(mon, "device not found\n");
491
        return;
492
    }
493
    if (fmt) {
494
        drv = bdrv_find_format(fmt);
495
        if (!drv) {
496
            monitor_printf(mon, "invalid format %s\n", fmt);
497
            return;
498
        }
499
    }
500
    if (eject_device(mon, bs, 0) < 0)
501
        return;
502
    bdrv_open2(bs, filename, 0, drv);
503
    monitor_read_bdrv_key_start(mon, bs, NULL, NULL);
504
}
505

    
506
static void change_vnc_password_cb(Monitor *mon, const char *password,
507
                                   void *opaque)
508
{
509
    if (vnc_display_password(NULL, password) < 0)
510
        monitor_printf(mon, "could not set VNC server password\n");
511

    
512
    monitor_read_command(mon, 1);
513
}
514

    
515
static void do_change_vnc(Monitor *mon, const char *target, const char *arg)
516
{
517
    if (strcmp(target, "passwd") == 0 ||
518
        strcmp(target, "password") == 0) {
519
        if (arg) {
520
            char password[9];
521
            strncpy(password, arg, sizeof(password));
522
            password[sizeof(password) - 1] = '\0';
523
            change_vnc_password_cb(mon, password, NULL);
524
        } else {
525
            monitor_read_password(mon, change_vnc_password_cb, NULL);
526
        }
527
    } else {
528
        if (vnc_display_open(NULL, target) < 0)
529
            monitor_printf(mon, "could not start VNC server on %s\n", target);
530
    }
531
}
532

    
533
static void do_change(Monitor *mon, const QDict *qdict)
534
{
535
    const char *device = qdict_get_str(qdict, "device");
536
    const char *target = qdict_get_str(qdict, "target");
537
    const char *arg = qdict_get_try_str(qdict, "arg");
538
    if (strcmp(device, "vnc") == 0) {
539
        do_change_vnc(mon, target, arg);
540
    } else {
541
        do_change_block(mon, device, target, arg);
542
    }
543
}
544

    
545
static void do_screen_dump(Monitor *mon, const QDict *qdict)
546
{
547
    vga_hw_screen_dump(qdict_get_str(qdict, "filename"));
548
}
549

    
550
static void do_logfile(Monitor *mon, const QDict *qdict)
551
{
552
    cpu_set_log_filename(qdict_get_str(qdict, "filename"));
553
}
554

    
555
static void do_log(Monitor *mon, const QDict *qdict)
556
{
557
    int mask;
558
    const char *items = qdict_get_str(qdict, "items");
559

    
560
    if (!strcmp(items, "none")) {
561
        mask = 0;
562
    } else {
563
        mask = cpu_str_to_log_mask(items);
564
        if (!mask) {
565
            help_cmd(mon, "log");
566
            return;
567
        }
568
    }
569
    cpu_set_log(mask);
570
}
571

    
572
static void do_singlestep(Monitor *mon, const QDict *qdict)
573
{
574
    const char *option = qdict_get_try_str(qdict, "option");
575
    if (!option || !strcmp(option, "on")) {
576
        singlestep = 1;
577
    } else if (!strcmp(option, "off")) {
578
        singlestep = 0;
579
    } else {
580
        monitor_printf(mon, "unexpected option %s\n", option);
581
    }
582
}
583

    
584
static void do_stop(Monitor *mon, const QDict *qdict)
585
{
586
    vm_stop(EXCP_INTERRUPT);
587
}
588

    
589
static void encrypted_bdrv_it(void *opaque, BlockDriverState *bs);
590

    
591
struct bdrv_iterate_context {
592
    Monitor *mon;
593
    int err;
594
};
595

    
596
static void do_cont(Monitor *mon, const QDict *qdict)
597
{
598
    struct bdrv_iterate_context context = { mon, 0 };
599

    
600
    bdrv_iterate(encrypted_bdrv_it, &context);
601
    /* only resume the vm if all keys are set and valid */
602
    if (!context.err)
603
        vm_start();
604
}
605

    
606
static void bdrv_key_cb(void *opaque, int err)
607
{
608
    Monitor *mon = opaque;
609

    
610
    /* another key was set successfully, retry to continue */
611
    if (!err)
612
        do_cont(mon, NULL);
613
}
614

    
615
static void encrypted_bdrv_it(void *opaque, BlockDriverState *bs)
616
{
617
    struct bdrv_iterate_context *context = opaque;
618

    
619
    if (!context->err && bdrv_key_required(bs)) {
620
        context->err = -EBUSY;
621
        monitor_read_bdrv_key_start(context->mon, bs, bdrv_key_cb,
622
                                    context->mon);
623
    }
624
}
625

    
626
static void do_gdbserver(Monitor *mon, const QDict *qdict)
627
{
628
    const char *device = qdict_get_try_str(qdict, "device");
629
    if (!device)
630
        device = "tcp::" DEFAULT_GDBSTUB_PORT;
631
    if (gdbserver_start(device) < 0) {
632
        monitor_printf(mon, "Could not open gdbserver on device '%s'\n",
633
                       device);
634
    } else if (strcmp(device, "none") == 0) {
635
        monitor_printf(mon, "Disabled gdbserver\n");
636
    } else {
637
        monitor_printf(mon, "Waiting for gdb connection on device '%s'\n",
638
                       device);
639
    }
640
}
641

    
642
static void do_watchdog_action(Monitor *mon, const QDict *qdict)
643
{
644
    const char *action = qdict_get_str(qdict, "action");
645
    if (select_watchdog_action(action) == -1) {
646
        monitor_printf(mon, "Unknown watchdog action '%s'\n", action);
647
    }
648
}
649

    
650
static void monitor_printc(Monitor *mon, int c)
651
{
652
    monitor_printf(mon, "'");
653
    switch(c) {
654
    case '\'':
655
        monitor_printf(mon, "\\'");
656
        break;
657
    case '\\':
658
        monitor_printf(mon, "\\\\");
659
        break;
660
    case '\n':
661
        monitor_printf(mon, "\\n");
662
        break;
663
    case '\r':
664
        monitor_printf(mon, "\\r");
665
        break;
666
    default:
667
        if (c >= 32 && c <= 126) {
668
            monitor_printf(mon, "%c", c);
669
        } else {
670
            monitor_printf(mon, "\\x%02x", c);
671
        }
672
        break;
673
    }
674
    monitor_printf(mon, "'");
675
}
676

    
677
static void memory_dump(Monitor *mon, int count, int format, int wsize,
678
                        target_phys_addr_t addr, int is_physical)
679
{
680
    CPUState *env;
681
    int nb_per_line, l, line_size, i, max_digits, len;
682
    uint8_t buf[16];
683
    uint64_t v;
684

    
685
    if (format == 'i') {
686
        int flags;
687
        flags = 0;
688
        env = mon_get_cpu();
689
        if (!env && !is_physical)
690
            return;
691
#ifdef TARGET_I386
692
        if (wsize == 2) {
693
            flags = 1;
694
        } else if (wsize == 4) {
695
            flags = 0;
696
        } else {
697
            /* as default we use the current CS size */
698
            flags = 0;
699
            if (env) {
700
#ifdef TARGET_X86_64
701
                if ((env->efer & MSR_EFER_LMA) &&
702
                    (env->segs[R_CS].flags & DESC_L_MASK))
703
                    flags = 2;
704
                else
705
#endif
706
                if (!(env->segs[R_CS].flags & DESC_B_MASK))
707
                    flags = 1;
708
            }
709
        }
710
#endif
711
        monitor_disas(mon, env, addr, count, is_physical, flags);
712
        return;
713
    }
714

    
715
    len = wsize * count;
716
    if (wsize == 1)
717
        line_size = 8;
718
    else
719
        line_size = 16;
720
    nb_per_line = line_size / wsize;
721
    max_digits = 0;
722

    
723
    switch(format) {
724
    case 'o':
725
        max_digits = (wsize * 8 + 2) / 3;
726
        break;
727
    default:
728
    case 'x':
729
        max_digits = (wsize * 8) / 4;
730
        break;
731
    case 'u':
732
    case 'd':
733
        max_digits = (wsize * 8 * 10 + 32) / 33;
734
        break;
735
    case 'c':
736
        wsize = 1;
737
        break;
738
    }
739

    
740
    while (len > 0) {
741
        if (is_physical)
742
            monitor_printf(mon, TARGET_FMT_plx ":", addr);
743
        else
744
            monitor_printf(mon, TARGET_FMT_lx ":", (target_ulong)addr);
745
        l = len;
746
        if (l > line_size)
747
            l = line_size;
748
        if (is_physical) {
749
            cpu_physical_memory_rw(addr, buf, l, 0);
750
        } else {
751
            env = mon_get_cpu();
752
            if (!env)
753
                break;
754
            if (cpu_memory_rw_debug(env, addr, buf, l, 0) < 0) {
755
                monitor_printf(mon, " Cannot access memory\n");
756
                break;
757
            }
758
        }
759
        i = 0;
760
        while (i < l) {
761
            switch(wsize) {
762
            default:
763
            case 1:
764
                v = ldub_raw(buf + i);
765
                break;
766
            case 2:
767
                v = lduw_raw(buf + i);
768
                break;
769
            case 4:
770
                v = (uint32_t)ldl_raw(buf + i);
771
                break;
772
            case 8:
773
                v = ldq_raw(buf + i);
774
                break;
775
            }
776
            monitor_printf(mon, " ");
777
            switch(format) {
778
            case 'o':
779
                monitor_printf(mon, "%#*" PRIo64, max_digits, v);
780
                break;
781
            case 'x':
782
                monitor_printf(mon, "0x%0*" PRIx64, max_digits, v);
783
                break;
784
            case 'u':
785
                monitor_printf(mon, "%*" PRIu64, max_digits, v);
786
                break;
787
            case 'd':
788
                monitor_printf(mon, "%*" PRId64, max_digits, v);
789
                break;
790
            case 'c':
791
                monitor_printc(mon, v);
792
                break;
793
            }
794
            i += wsize;
795
        }
796
        monitor_printf(mon, "\n");
797
        addr += l;
798
        len -= l;
799
    }
800
}
801

    
802
static void do_memory_dump(Monitor *mon, const QDict *qdict)
803
{
804
    int count = qdict_get_int(qdict, "count");
805
    int format = qdict_get_int(qdict, "format");
806
    int size = qdict_get_int(qdict, "size");
807
    target_long addr = qdict_get_int(qdict, "addr");
808

    
809
    memory_dump(mon, count, format, size, addr, 0);
810
}
811

    
812
static void do_physical_memory_dump(Monitor *mon, const QDict *qdict)
813
{
814
    int count = qdict_get_int(qdict, "count");
815
    int format = qdict_get_int(qdict, "format");
816
    int size = qdict_get_int(qdict, "size");
817
    target_phys_addr_t addr = qdict_get_int(qdict, "addr");
818

    
819
    memory_dump(mon, count, format, size, addr, 1);
820
}
821

    
822
static void do_print(Monitor *mon, const QDict *qdict)
823
{
824
    int format = qdict_get_int(qdict, "format");
825
    target_phys_addr_t val = qdict_get_int(qdict, "val");
826

    
827
#if TARGET_PHYS_ADDR_BITS == 32
828
    switch(format) {
829
    case 'o':
830
        monitor_printf(mon, "%#o", val);
831
        break;
832
    case 'x':
833
        monitor_printf(mon, "%#x", val);
834
        break;
835
    case 'u':
836
        monitor_printf(mon, "%u", val);
837
        break;
838
    default:
839
    case 'd':
840
        monitor_printf(mon, "%d", val);
841
        break;
842
    case 'c':
843
        monitor_printc(mon, val);
844
        break;
845
    }
846
#else
847
    switch(format) {
848
    case 'o':
849
        monitor_printf(mon, "%#" PRIo64, val);
850
        break;
851
    case 'x':
852
        monitor_printf(mon, "%#" PRIx64, val);
853
        break;
854
    case 'u':
855
        monitor_printf(mon, "%" PRIu64, val);
856
        break;
857
    default:
858
    case 'd':
859
        monitor_printf(mon, "%" PRId64, val);
860
        break;
861
    case 'c':
862
        monitor_printc(mon, val);
863
        break;
864
    }
865
#endif
866
    monitor_printf(mon, "\n");
867
}
868

    
869
static void do_memory_save(Monitor *mon, const QDict *qdict)
870
{
871
    FILE *f;
872
    uint32_t size = qdict_get_int(qdict, "size");
873
    const char *filename = qdict_get_str(qdict, "filename");
874
    target_long addr = qdict_get_int(qdict, "val");
875
    uint32_t l;
876
    CPUState *env;
877
    uint8_t buf[1024];
878

    
879
    env = mon_get_cpu();
880
    if (!env)
881
        return;
882

    
883
    f = fopen(filename, "wb");
884
    if (!f) {
885
        monitor_printf(mon, "could not open '%s'\n", filename);
886
        return;
887
    }
888
    while (size != 0) {
889
        l = sizeof(buf);
890
        if (l > size)
891
            l = size;
892
        cpu_memory_rw_debug(env, addr, buf, l, 0);
893
        fwrite(buf, 1, l, f);
894
        addr += l;
895
        size -= l;
896
    }
897
    fclose(f);
898
}
899

    
900
static void do_physical_memory_save(Monitor *mon, const QDict *qdict)
901
{
902
    FILE *f;
903
    uint32_t l;
904
    uint8_t buf[1024];
905
    uint32_t size = qdict_get_int(qdict, "size");
906
    const char *filename = qdict_get_str(qdict, "filename");
907
    target_phys_addr_t addr = qdict_get_int(qdict, "val");
908

    
909
    f = fopen(filename, "wb");
910
    if (!f) {
911
        monitor_printf(mon, "could not open '%s'\n", filename);
912
        return;
913
    }
914
    while (size != 0) {
915
        l = sizeof(buf);
916
        if (l > size)
917
            l = size;
918
        cpu_physical_memory_rw(addr, buf, l, 0);
919
        fwrite(buf, 1, l, f);
920
        fflush(f);
921
        addr += l;
922
        size -= l;
923
    }
924
    fclose(f);
925
}
926

    
927
static void do_sum(Monitor *mon, const QDict *qdict)
928
{
929
    uint32_t addr;
930
    uint8_t buf[1];
931
    uint16_t sum;
932
    uint32_t start = qdict_get_int(qdict, "start");
933
    uint32_t size = qdict_get_int(qdict, "size");
934

    
935
    sum = 0;
936
    for(addr = start; addr < (start + size); addr++) {
937
        cpu_physical_memory_rw(addr, buf, 1, 0);
938
        /* BSD sum algorithm ('sum' Unix command) */
939
        sum = (sum >> 1) | (sum << 15);
940
        sum += buf[0];
941
    }
942
    monitor_printf(mon, "%05d\n", sum);
943
}
944

    
945
typedef struct {
946
    int keycode;
947
    const char *name;
948
} KeyDef;
949

    
950
static const KeyDef key_defs[] = {
951
    { 0x2a, "shift" },
952
    { 0x36, "shift_r" },
953

    
954
    { 0x38, "alt" },
955
    { 0xb8, "alt_r" },
956
    { 0x64, "altgr" },
957
    { 0xe4, "altgr_r" },
958
    { 0x1d, "ctrl" },
959
    { 0x9d, "ctrl_r" },
960

    
961
    { 0xdd, "menu" },
962

    
963
    { 0x01, "esc" },
964

    
965
    { 0x02, "1" },
966
    { 0x03, "2" },
967
    { 0x04, "3" },
968
    { 0x05, "4" },
969
    { 0x06, "5" },
970
    { 0x07, "6" },
971
    { 0x08, "7" },
972
    { 0x09, "8" },
973
    { 0x0a, "9" },
974
    { 0x0b, "0" },
975
    { 0x0c, "minus" },
976
    { 0x0d, "equal" },
977
    { 0x0e, "backspace" },
978

    
979
    { 0x0f, "tab" },
980
    { 0x10, "q" },
981
    { 0x11, "w" },
982
    { 0x12, "e" },
983
    { 0x13, "r" },
984
    { 0x14, "t" },
985
    { 0x15, "y" },
986
    { 0x16, "u" },
987
    { 0x17, "i" },
988
    { 0x18, "o" },
989
    { 0x19, "p" },
990

    
991
    { 0x1c, "ret" },
992

    
993
    { 0x1e, "a" },
994
    { 0x1f, "s" },
995
    { 0x20, "d" },
996
    { 0x21, "f" },
997
    { 0x22, "g" },
998
    { 0x23, "h" },
999
    { 0x24, "j" },
1000
    { 0x25, "k" },
1001
    { 0x26, "l" },
1002

    
1003
    { 0x2c, "z" },
1004
    { 0x2d, "x" },
1005
    { 0x2e, "c" },
1006
    { 0x2f, "v" },
1007
    { 0x30, "b" },
1008
    { 0x31, "n" },
1009
    { 0x32, "m" },
1010
    { 0x33, "comma" },
1011
    { 0x34, "dot" },
1012
    { 0x35, "slash" },
1013

    
1014
    { 0x37, "asterisk" },
1015

    
1016
    { 0x39, "spc" },
1017
    { 0x3a, "caps_lock" },
1018
    { 0x3b, "f1" },
1019
    { 0x3c, "f2" },
1020
    { 0x3d, "f3" },
1021
    { 0x3e, "f4" },
1022
    { 0x3f, "f5" },
1023
    { 0x40, "f6" },
1024
    { 0x41, "f7" },
1025
    { 0x42, "f8" },
1026
    { 0x43, "f9" },
1027
    { 0x44, "f10" },
1028
    { 0x45, "num_lock" },
1029
    { 0x46, "scroll_lock" },
1030

    
1031
    { 0xb5, "kp_divide" },
1032
    { 0x37, "kp_multiply" },
1033
    { 0x4a, "kp_subtract" },
1034
    { 0x4e, "kp_add" },
1035
    { 0x9c, "kp_enter" },
1036
    { 0x53, "kp_decimal" },
1037
    { 0x54, "sysrq" },
1038

    
1039
    { 0x52, "kp_0" },
1040
    { 0x4f, "kp_1" },
1041
    { 0x50, "kp_2" },
1042
    { 0x51, "kp_3" },
1043
    { 0x4b, "kp_4" },
1044
    { 0x4c, "kp_5" },
1045
    { 0x4d, "kp_6" },
1046
    { 0x47, "kp_7" },
1047
    { 0x48, "kp_8" },
1048
    { 0x49, "kp_9" },
1049

    
1050
    { 0x56, "<" },
1051

    
1052
    { 0x57, "f11" },
1053
    { 0x58, "f12" },
1054

    
1055
    { 0xb7, "print" },
1056

    
1057
    { 0xc7, "home" },
1058
    { 0xc9, "pgup" },
1059
    { 0xd1, "pgdn" },
1060
    { 0xcf, "end" },
1061

    
1062
    { 0xcb, "left" },
1063
    { 0xc8, "up" },
1064
    { 0xd0, "down" },
1065
    { 0xcd, "right" },
1066

    
1067
    { 0xd2, "insert" },
1068
    { 0xd3, "delete" },
1069
#if defined(TARGET_SPARC) && !defined(TARGET_SPARC64)
1070
    { 0xf0, "stop" },
1071
    { 0xf1, "again" },
1072
    { 0xf2, "props" },
1073
    { 0xf3, "undo" },
1074
    { 0xf4, "front" },
1075
    { 0xf5, "copy" },
1076
    { 0xf6, "open" },
1077
    { 0xf7, "paste" },
1078
    { 0xf8, "find" },
1079
    { 0xf9, "cut" },
1080
    { 0xfa, "lf" },
1081
    { 0xfb, "help" },
1082
    { 0xfc, "meta_l" },
1083
    { 0xfd, "meta_r" },
1084
    { 0xfe, "compose" },
1085
#endif
1086
    { 0, NULL },
1087
};
1088

    
1089
static int get_keycode(const char *key)
1090
{
1091
    const KeyDef *p;
1092
    char *endp;
1093
    int ret;
1094

    
1095
    for(p = key_defs; p->name != NULL; p++) {
1096
        if (!strcmp(key, p->name))
1097
            return p->keycode;
1098
    }
1099
    if (strstart(key, "0x", NULL)) {
1100
        ret = strtoul(key, &endp, 0);
1101
        if (*endp == '\0' && ret >= 0x01 && ret <= 0xff)
1102
            return ret;
1103
    }
1104
    return -1;
1105
}
1106

    
1107
#define MAX_KEYCODES 16
1108
static uint8_t keycodes[MAX_KEYCODES];
1109
static int nb_pending_keycodes;
1110
static QEMUTimer *key_timer;
1111

    
1112
static void release_keys(void *opaque)
1113
{
1114
    int keycode;
1115

    
1116
    while (nb_pending_keycodes > 0) {
1117
        nb_pending_keycodes--;
1118
        keycode = keycodes[nb_pending_keycodes];
1119
        if (keycode & 0x80)
1120
            kbd_put_keycode(0xe0);
1121
        kbd_put_keycode(keycode | 0x80);
1122
    }
1123
}
1124

    
1125
static void do_sendkey(Monitor *mon, const QDict *qdict)
1126
{
1127
    char keyname_buf[16];
1128
    char *separator;
1129
    int keyname_len, keycode, i;
1130
    const char *string = qdict_get_str(qdict, "string");
1131
    int has_hold_time = qdict_haskey(qdict, "hold_time");
1132
    int hold_time = qdict_get_try_int(qdict, "hold_time", -1);
1133

    
1134
    if (nb_pending_keycodes > 0) {
1135
        qemu_del_timer(key_timer);
1136
        release_keys(NULL);
1137
    }
1138
    if (!has_hold_time)
1139
        hold_time = 100;
1140
    i = 0;
1141
    while (1) {
1142
        separator = strchr(string, '-');
1143
        keyname_len = separator ? separator - string : strlen(string);
1144
        if (keyname_len > 0) {
1145
            pstrcpy(keyname_buf, sizeof(keyname_buf), string);
1146
            if (keyname_len > sizeof(keyname_buf) - 1) {
1147
                monitor_printf(mon, "invalid key: '%s...'\n", keyname_buf);
1148
                return;
1149
            }
1150
            if (i == MAX_KEYCODES) {
1151
                monitor_printf(mon, "too many keys\n");
1152
                return;
1153
            }
1154
            keyname_buf[keyname_len] = 0;
1155
            keycode = get_keycode(keyname_buf);
1156
            if (keycode < 0) {
1157
                monitor_printf(mon, "unknown key: '%s'\n", keyname_buf);
1158
                return;
1159
            }
1160
            keycodes[i++] = keycode;
1161
        }
1162
        if (!separator)
1163
            break;
1164
        string = separator + 1;
1165
    }
1166
    nb_pending_keycodes = i;
1167
    /* key down events */
1168
    for (i = 0; i < nb_pending_keycodes; i++) {
1169
        keycode = keycodes[i];
1170
        if (keycode & 0x80)
1171
            kbd_put_keycode(0xe0);
1172
        kbd_put_keycode(keycode & 0x7f);
1173
    }
1174
    /* delayed key up events */
1175
    qemu_mod_timer(key_timer, qemu_get_clock(vm_clock) +
1176
                   muldiv64(get_ticks_per_sec(), hold_time, 1000));
1177
}
1178

    
1179
static int mouse_button_state;
1180

    
1181
static void do_mouse_move(Monitor *mon, const QDict *qdict)
1182
{
1183
    int dx, dy, dz;
1184
    const char *dx_str = qdict_get_str(qdict, "dx_str");
1185
    const char *dy_str = qdict_get_str(qdict, "dy_str");
1186
    const char *dz_str = qdict_get_try_str(qdict, "dz_str");
1187
    dx = strtol(dx_str, NULL, 0);
1188
    dy = strtol(dy_str, NULL, 0);
1189
    dz = 0;
1190
    if (dz_str)
1191
        dz = strtol(dz_str, NULL, 0);
1192
    kbd_mouse_event(dx, dy, dz, mouse_button_state);
1193
}
1194

    
1195
static void do_mouse_button(Monitor *mon, const QDict *qdict)
1196
{
1197
    int button_state = qdict_get_int(qdict, "button_state");
1198
    mouse_button_state = button_state;
1199
    kbd_mouse_event(0, 0, 0, mouse_button_state);
1200
}
1201

    
1202
static void do_ioport_read(Monitor *mon, const QDict *qdict)
1203
{
1204
    int size = qdict_get_int(qdict, "size");
1205
    int addr = qdict_get_int(qdict, "addr");
1206
    int has_index = qdict_haskey(qdict, "index");
1207
    uint32_t val;
1208
    int suffix;
1209

    
1210
    if (has_index) {
1211
        int index = qdict_get_int(qdict, "index");
1212
        cpu_outb(addr & IOPORTS_MASK, index & 0xff);
1213
        addr++;
1214
    }
1215
    addr &= 0xffff;
1216

    
1217
    switch(size) {
1218
    default:
1219
    case 1:
1220
        val = cpu_inb(addr);
1221
        suffix = 'b';
1222
        break;
1223
    case 2:
1224
        val = cpu_inw(addr);
1225
        suffix = 'w';
1226
        break;
1227
    case 4:
1228
        val = cpu_inl(addr);
1229
        suffix = 'l';
1230
        break;
1231
    }
1232
    monitor_printf(mon, "port%c[0x%04x] = %#0*x\n",
1233
                   suffix, addr, size * 2, val);
1234
}
1235

    
1236
static void do_ioport_write(Monitor *mon, const QDict *qdict)
1237
{
1238
    int size = qdict_get_int(qdict, "size");
1239
    int addr = qdict_get_int(qdict, "addr");
1240
    int val = qdict_get_int(qdict, "val");
1241

    
1242
    addr &= IOPORTS_MASK;
1243

    
1244
    switch (size) {
1245
    default:
1246
    case 1:
1247
        cpu_outb(addr, val);
1248
        break;
1249
    case 2:
1250
        cpu_outw(addr, val);
1251
        break;
1252
    case 4:
1253
        cpu_outl(addr, val);
1254
        break;
1255
    }
1256
}
1257

    
1258
static void do_boot_set(Monitor *mon, const QDict *qdict)
1259
{
1260
    int res;
1261
    const char *bootdevice = qdict_get_str(qdict, "bootdevice");
1262

    
1263
    res = qemu_boot_set(bootdevice);
1264
    if (res == 0) {
1265
        monitor_printf(mon, "boot device list now set to %s\n", bootdevice);
1266
    } else if (res > 0) {
1267
        monitor_printf(mon, "setting boot device list failed\n");
1268
    } else {
1269
        monitor_printf(mon, "no function defined to set boot device list for "
1270
                       "this architecture\n");
1271
    }
1272
}
1273

    
1274
static void do_system_reset(Monitor *mon, const QDict *qdict)
1275
{
1276
    qemu_system_reset_request();
1277
}
1278

    
1279
static void do_system_powerdown(Monitor *mon, const QDict *qdict)
1280
{
1281
    qemu_system_powerdown_request();
1282
}
1283

    
1284
#if defined(TARGET_I386)
1285
static void print_pte(Monitor *mon, uint32_t addr, uint32_t pte, uint32_t mask)
1286
{
1287
    monitor_printf(mon, "%08x: %08x %c%c%c%c%c%c%c%c\n",
1288
                   addr,
1289
                   pte & mask,
1290
                   pte & PG_GLOBAL_MASK ? 'G' : '-',
1291
                   pte & PG_PSE_MASK ? 'P' : '-',
1292
                   pte & PG_DIRTY_MASK ? 'D' : '-',
1293
                   pte & PG_ACCESSED_MASK ? 'A' : '-',
1294
                   pte & PG_PCD_MASK ? 'C' : '-',
1295
                   pte & PG_PWT_MASK ? 'T' : '-',
1296
                   pte & PG_USER_MASK ? 'U' : '-',
1297
                   pte & PG_RW_MASK ? 'W' : '-');
1298
}
1299

    
1300
static void tlb_info(Monitor *mon)
1301
{
1302
    CPUState *env;
1303
    int l1, l2;
1304
    uint32_t pgd, pde, pte;
1305

    
1306
    env = mon_get_cpu();
1307
    if (!env)
1308
        return;
1309

    
1310
    if (!(env->cr[0] & CR0_PG_MASK)) {
1311
        monitor_printf(mon, "PG disabled\n");
1312
        return;
1313
    }
1314
    pgd = env->cr[3] & ~0xfff;
1315
    for(l1 = 0; l1 < 1024; l1++) {
1316
        cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4);
1317
        pde = le32_to_cpu(pde);
1318
        if (pde & PG_PRESENT_MASK) {
1319
            if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
1320
                print_pte(mon, (l1 << 22), pde, ~((1 << 20) - 1));
1321
            } else {
1322
                for(l2 = 0; l2 < 1024; l2++) {
1323
                    cpu_physical_memory_read((pde & ~0xfff) + l2 * 4,
1324
                                             (uint8_t *)&pte, 4);
1325
                    pte = le32_to_cpu(pte);
1326
                    if (pte & PG_PRESENT_MASK) {
1327
                        print_pte(mon, (l1 << 22) + (l2 << 12),
1328
                                  pte & ~PG_PSE_MASK,
1329
                                  ~0xfff);
1330
                    }
1331
                }
1332
            }
1333
        }
1334
    }
1335
}
1336

    
1337
static void mem_print(Monitor *mon, uint32_t *pstart, int *plast_prot,
1338
                      uint32_t end, int prot)
1339
{
1340
    int prot1;
1341
    prot1 = *plast_prot;
1342
    if (prot != prot1) {
1343
        if (*pstart != -1) {
1344
            monitor_printf(mon, "%08x-%08x %08x %c%c%c\n",
1345
                           *pstart, end, end - *pstart,
1346
                           prot1 & PG_USER_MASK ? 'u' : '-',
1347
                           'r',
1348
                           prot1 & PG_RW_MASK ? 'w' : '-');
1349
        }
1350
        if (prot != 0)
1351
            *pstart = end;
1352
        else
1353
            *pstart = -1;
1354
        *plast_prot = prot;
1355
    }
1356
}
1357

    
1358
static void mem_info(Monitor *mon)
1359
{
1360
    CPUState *env;
1361
    int l1, l2, prot, last_prot;
1362
    uint32_t pgd, pde, pte, start, end;
1363

    
1364
    env = mon_get_cpu();
1365
    if (!env)
1366
        return;
1367

    
1368
    if (!(env->cr[0] & CR0_PG_MASK)) {
1369
        monitor_printf(mon, "PG disabled\n");
1370
        return;
1371
    }
1372
    pgd = env->cr[3] & ~0xfff;
1373
    last_prot = 0;
1374
    start = -1;
1375
    for(l1 = 0; l1 < 1024; l1++) {
1376
        cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4);
1377
        pde = le32_to_cpu(pde);
1378
        end = l1 << 22;
1379
        if (pde & PG_PRESENT_MASK) {
1380
            if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
1381
                prot = pde & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
1382
                mem_print(mon, &start, &last_prot, end, prot);
1383
            } else {
1384
                for(l2 = 0; l2 < 1024; l2++) {
1385
                    cpu_physical_memory_read((pde & ~0xfff) + l2 * 4,
1386
                                             (uint8_t *)&pte, 4);
1387
                    pte = le32_to_cpu(pte);
1388
                    end = (l1 << 22) + (l2 << 12);
1389
                    if (pte & PG_PRESENT_MASK) {
1390
                        prot = pte & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
1391
                    } else {
1392
                        prot = 0;
1393
                    }
1394
                    mem_print(mon, &start, &last_prot, end, prot);
1395
                }
1396
            }
1397
        } else {
1398
            prot = 0;
1399
            mem_print(mon, &start, &last_prot, end, prot);
1400
        }
1401
    }
1402
}
1403
#endif
1404

    
1405
#if defined(TARGET_SH4)
1406

    
1407
static void print_tlb(Monitor *mon, int idx, tlb_t *tlb)
1408
{
1409
    monitor_printf(mon, " tlb%i:\t"
1410
                   "asid=%hhu vpn=%x\tppn=%x\tsz=%hhu size=%u\t"
1411
                   "v=%hhu shared=%hhu cached=%hhu prot=%hhu "
1412
                   "dirty=%hhu writethrough=%hhu\n",
1413
                   idx,
1414
                   tlb->asid, tlb->vpn, tlb->ppn, tlb->sz, tlb->size,
1415
                   tlb->v, tlb->sh, tlb->c, tlb->pr,
1416
                   tlb->d, tlb->wt);
1417
}
1418

    
1419
static void tlb_info(Monitor *mon)
1420
{
1421
    CPUState *env = mon_get_cpu();
1422
    int i;
1423

    
1424
    monitor_printf (mon, "ITLB:\n");
1425
    for (i = 0 ; i < ITLB_SIZE ; i++)
1426
        print_tlb (mon, i, &env->itlb[i]);
1427
    monitor_printf (mon, "UTLB:\n");
1428
    for (i = 0 ; i < UTLB_SIZE ; i++)
1429
        print_tlb (mon, i, &env->utlb[i]);
1430
}
1431

    
1432
#endif
1433

    
1434
static void do_info_kvm(Monitor *mon)
1435
{
1436
#ifdef CONFIG_KVM
1437
    monitor_printf(mon, "kvm support: ");
1438
    if (kvm_enabled())
1439
        monitor_printf(mon, "enabled\n");
1440
    else
1441
        monitor_printf(mon, "disabled\n");
1442
#else
1443
    monitor_printf(mon, "kvm support: not compiled\n");
1444
#endif
1445
}
1446

    
1447
static void do_info_numa(Monitor *mon)
1448
{
1449
    int i;
1450
    CPUState *env;
1451

    
1452
    monitor_printf(mon, "%d nodes\n", nb_numa_nodes);
1453
    for (i = 0; i < nb_numa_nodes; i++) {
1454
        monitor_printf(mon, "node %d cpus:", i);
1455
        for (env = first_cpu; env != NULL; env = env->next_cpu) {
1456
            if (env->numa_node == i) {
1457
                monitor_printf(mon, " %d", env->cpu_index);
1458
            }
1459
        }
1460
        monitor_printf(mon, "\n");
1461
        monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i,
1462
            node_mem[i] >> 20);
1463
    }
1464
}
1465

    
1466
#ifdef CONFIG_PROFILER
1467

    
1468
int64_t qemu_time;
1469
int64_t dev_time;
1470

    
1471
static void do_info_profile(Monitor *mon)
1472
{
1473
    int64_t total;
1474
    total = qemu_time;
1475
    if (total == 0)
1476
        total = 1;
1477
    monitor_printf(mon, "async time  %" PRId64 " (%0.3f)\n",
1478
                   dev_time, dev_time / (double)get_ticks_per_sec());
1479
    monitor_printf(mon, "qemu time   %" PRId64 " (%0.3f)\n",
1480
                   qemu_time, qemu_time / (double)get_ticks_per_sec());
1481
    qemu_time = 0;
1482
    dev_time = 0;
1483
}
1484
#else
1485
static void do_info_profile(Monitor *mon)
1486
{
1487
    monitor_printf(mon, "Internal profiler not compiled\n");
1488
}
1489
#endif
1490

    
1491
/* Capture support */
1492
static QLIST_HEAD (capture_list_head, CaptureState) capture_head;
1493

    
1494
static void do_info_capture(Monitor *mon)
1495
{
1496
    int i;
1497
    CaptureState *s;
1498

    
1499
    for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1500
        monitor_printf(mon, "[%d]: ", i);
1501
        s->ops.info (s->opaque);
1502
    }
1503
}
1504

    
1505
#ifdef HAS_AUDIO
1506
static void do_stop_capture(Monitor *mon, const QDict *qdict)
1507
{
1508
    int i;
1509
    int n = qdict_get_int(qdict, "n");
1510
    CaptureState *s;
1511

    
1512
    for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1513
        if (i == n) {
1514
            s->ops.destroy (s->opaque);
1515
            QLIST_REMOVE (s, entries);
1516
            qemu_free (s);
1517
            return;
1518
        }
1519
    }
1520
}
1521

    
1522
static void do_wav_capture(Monitor *mon, const QDict *qdict)
1523
{
1524
    const char *path = qdict_get_str(qdict, "path");
1525
    int has_freq = qdict_haskey(qdict, "freq");
1526
    int freq = qdict_get_try_int(qdict, "freq", -1);
1527
    int has_bits = qdict_haskey(qdict, "bits");
1528
    int bits = qdict_get_try_int(qdict, "bits", -1);
1529
    int has_channels = qdict_haskey(qdict, "nchannels");
1530
    int nchannels = qdict_get_try_int(qdict, "nchannels", -1);
1531
    CaptureState *s;
1532

    
1533
    s = qemu_mallocz (sizeof (*s));
1534

    
1535
    freq = has_freq ? freq : 44100;
1536
    bits = has_bits ? bits : 16;
1537
    nchannels = has_channels ? nchannels : 2;
1538

    
1539
    if (wav_start_capture (s, path, freq, bits, nchannels)) {
1540
        monitor_printf(mon, "Faied to add wave capture\n");
1541
        qemu_free (s);
1542
    }
1543
    QLIST_INSERT_HEAD (&capture_head, s, entries);
1544
}
1545
#endif
1546

    
1547
#if defined(TARGET_I386)
1548
static void do_inject_nmi(Monitor *mon, const QDict *qdict)
1549
{
1550
    CPUState *env;
1551
    int cpu_index = qdict_get_int(qdict, "cpu_index");
1552

    
1553
    for (env = first_cpu; env != NULL; env = env->next_cpu)
1554
        if (env->cpu_index == cpu_index) {
1555
            cpu_interrupt(env, CPU_INTERRUPT_NMI);
1556
            break;
1557
        }
1558
}
1559
#endif
1560

    
1561
static void do_info_status(Monitor *mon)
1562
{
1563
    if (vm_running) {
1564
        if (singlestep) {
1565
            monitor_printf(mon, "VM status: running (single step mode)\n");
1566
        } else {
1567
            monitor_printf(mon, "VM status: running\n");
1568
        }
1569
    } else
1570
       monitor_printf(mon, "VM status: paused\n");
1571
}
1572

    
1573

    
1574
static void do_balloon(Monitor *mon, const QDict *qdict)
1575
{
1576
    int value = qdict_get_int(qdict, "value");
1577
    ram_addr_t target = value;
1578
    qemu_balloon(target << 20);
1579
}
1580

    
1581
static void do_info_balloon(Monitor *mon)
1582
{
1583
    ram_addr_t actual;
1584

    
1585
    actual = qemu_balloon_status();
1586
    if (kvm_enabled() && !kvm_has_sync_mmu())
1587
        monitor_printf(mon, "Using KVM without synchronous MMU, "
1588
                       "ballooning disabled\n");
1589
    else if (actual == 0)
1590
        monitor_printf(mon, "Ballooning not activated in VM\n");
1591
    else
1592
        monitor_printf(mon, "balloon: actual=%d\n", (int)(actual >> 20));
1593
}
1594

    
1595
static qemu_acl *find_acl(Monitor *mon, const char *name)
1596
{
1597
    qemu_acl *acl = qemu_acl_find(name);
1598

    
1599
    if (!acl) {
1600
        monitor_printf(mon, "acl: unknown list '%s'\n", name);
1601
    }
1602
    return acl;
1603
}
1604

    
1605
static void do_acl_show(Monitor *mon, const QDict *qdict)
1606
{
1607
    const char *aclname = qdict_get_str(qdict, "aclname");
1608
    qemu_acl *acl = find_acl(mon, aclname);
1609
    qemu_acl_entry *entry;
1610
    int i = 0;
1611

    
1612
    if (acl) {
1613
        monitor_printf(mon, "policy: %s\n",
1614
                       acl->defaultDeny ? "deny" : "allow");
1615
        QTAILQ_FOREACH(entry, &acl->entries, next) {
1616
            i++;
1617
            monitor_printf(mon, "%d: %s %s\n", i,
1618
                           entry->deny ? "deny" : "allow", entry->match);
1619
        }
1620
    }
1621
}
1622

    
1623
static void do_acl_reset(Monitor *mon, const QDict *qdict)
1624
{
1625
    const char *aclname = qdict_get_str(qdict, "aclname");
1626
    qemu_acl *acl = find_acl(mon, aclname);
1627

    
1628
    if (acl) {
1629
        qemu_acl_reset(acl);
1630
        monitor_printf(mon, "acl: removed all rules\n");
1631
    }
1632
}
1633

    
1634
static void do_acl_policy(Monitor *mon, const QDict *qdict)
1635
{
1636
    const char *aclname = qdict_get_str(qdict, "aclname");
1637
    const char *policy = qdict_get_str(qdict, "policy");
1638
    qemu_acl *acl = find_acl(mon, aclname);
1639

    
1640
    if (acl) {
1641
        if (strcmp(policy, "allow") == 0) {
1642
            acl->defaultDeny = 0;
1643
            monitor_printf(mon, "acl: policy set to 'allow'\n");
1644
        } else if (strcmp(policy, "deny") == 0) {
1645
            acl->defaultDeny = 1;
1646
            monitor_printf(mon, "acl: policy set to 'deny'\n");
1647
        } else {
1648
            monitor_printf(mon, "acl: unknown policy '%s', "
1649
                           "expected 'deny' or 'allow'\n", policy);
1650
        }
1651
    }
1652
}
1653

    
1654
static void do_acl_add(Monitor *mon, const QDict *qdict)
1655
{
1656
    const char *aclname = qdict_get_str(qdict, "aclname");
1657
    const char *match = qdict_get_str(qdict, "match");
1658
    const char *policy = qdict_get_str(qdict, "policy");
1659
    int has_index = qdict_haskey(qdict, "index");
1660
    int index = qdict_get_try_int(qdict, "index", -1);
1661
    qemu_acl *acl = find_acl(mon, aclname);
1662
    int deny, ret;
1663

    
1664
    if (acl) {
1665
        if (strcmp(policy, "allow") == 0) {
1666
            deny = 0;
1667
        } else if (strcmp(policy, "deny") == 0) {
1668
            deny = 1;
1669
        } else {
1670
            monitor_printf(mon, "acl: unknown policy '%s', "
1671
                           "expected 'deny' or 'allow'\n", policy);
1672
            return;
1673
        }
1674
        if (has_index)
1675
            ret = qemu_acl_insert(acl, deny, match, index);
1676
        else
1677
            ret = qemu_acl_append(acl, deny, match);
1678
        if (ret < 0)
1679
            monitor_printf(mon, "acl: unable to add acl entry\n");
1680
        else
1681
            monitor_printf(mon, "acl: added rule at position %d\n", ret);
1682
    }
1683
}
1684

    
1685
static void do_acl_remove(Monitor *mon, const QDict *qdict)
1686
{
1687
    const char *aclname = qdict_get_str(qdict, "aclname");
1688
    const char *match = qdict_get_str(qdict, "match");
1689
    qemu_acl *acl = find_acl(mon, aclname);
1690
    int ret;
1691

    
1692
    if (acl) {
1693
        ret = qemu_acl_remove(acl, match);
1694
        if (ret < 0)
1695
            monitor_printf(mon, "acl: no matching acl entry\n");
1696
        else
1697
            monitor_printf(mon, "acl: removed rule at position %d\n", ret);
1698
    }
1699
}
1700

    
1701
#if defined(TARGET_I386)
1702
static void do_inject_mce(Monitor *mon, const QDict *qdict)
1703
{
1704
    CPUState *cenv;
1705
    int cpu_index = qdict_get_int(qdict, "cpu_index");
1706
    int bank = qdict_get_int(qdict, "bank");
1707
    uint64_t status = qdict_get_int(qdict, "status");
1708
    uint64_t mcg_status = qdict_get_int(qdict, "mcg_status");
1709
    uint64_t addr = qdict_get_int(qdict, "addr");
1710
    uint64_t misc = qdict_get_int(qdict, "misc");
1711

    
1712
    for (cenv = first_cpu; cenv != NULL; cenv = cenv->next_cpu)
1713
        if (cenv->cpu_index == cpu_index && cenv->mcg_cap) {
1714
            cpu_inject_x86_mce(cenv, bank, status, mcg_status, addr, misc);
1715
            break;
1716
        }
1717
}
1718
#endif
1719

    
1720
static void do_getfd(Monitor *mon, const QDict *qdict)
1721
{
1722
    const char *fdname = qdict_get_str(qdict, "fdname");
1723
    mon_fd_t *monfd;
1724
    int fd;
1725

    
1726
    fd = qemu_chr_get_msgfd(mon->chr);
1727
    if (fd == -1) {
1728
        monitor_printf(mon, "getfd: no file descriptor supplied via SCM_RIGHTS\n");
1729
        return;
1730
    }
1731

    
1732
    if (qemu_isdigit(fdname[0])) {
1733
        monitor_printf(mon, "getfd: monitor names may not begin with a number\n");
1734
        return;
1735
    }
1736

    
1737
    fd = dup(fd);
1738
    if (fd == -1) {
1739
        monitor_printf(mon, "Failed to dup() file descriptor: %s\n",
1740
                       strerror(errno));
1741
        return;
1742
    }
1743

    
1744
    QLIST_FOREACH(monfd, &mon->fds, next) {
1745
        if (strcmp(monfd->name, fdname) != 0) {
1746
            continue;
1747
        }
1748

    
1749
        close(monfd->fd);
1750
        monfd->fd = fd;
1751
        return;
1752
    }
1753

    
1754
    monfd = qemu_mallocz(sizeof(mon_fd_t));
1755
    monfd->name = qemu_strdup(fdname);
1756
    monfd->fd = fd;
1757

    
1758
    QLIST_INSERT_HEAD(&mon->fds, monfd, next);
1759
}
1760

    
1761
static void do_closefd(Monitor *mon, const QDict *qdict)
1762
{
1763
    const char *fdname = qdict_get_str(qdict, "fdname");
1764
    mon_fd_t *monfd;
1765

    
1766
    QLIST_FOREACH(monfd, &mon->fds, next) {
1767
        if (strcmp(monfd->name, fdname) != 0) {
1768
            continue;
1769
        }
1770

    
1771
        QLIST_REMOVE(monfd, next);
1772
        close(monfd->fd);
1773
        qemu_free(monfd->name);
1774
        qemu_free(monfd);
1775
        return;
1776
    }
1777

    
1778
    monitor_printf(mon, "Failed to find file descriptor named %s\n",
1779
                   fdname);
1780
}
1781

    
1782
static void do_loadvm(Monitor *mon, const QDict *qdict)
1783
{
1784
    int saved_vm_running  = vm_running;
1785
    const char *name = qdict_get_str(qdict, "name");
1786

    
1787
    vm_stop(0);
1788

    
1789
    if (load_vmstate(mon, name) >= 0 && saved_vm_running)
1790
        vm_start();
1791
}
1792

    
1793
int monitor_get_fd(Monitor *mon, const char *fdname)
1794
{
1795
    mon_fd_t *monfd;
1796

    
1797
    QLIST_FOREACH(monfd, &mon->fds, next) {
1798
        int fd;
1799

    
1800
        if (strcmp(monfd->name, fdname) != 0) {
1801
            continue;
1802
        }
1803

    
1804
        fd = monfd->fd;
1805

    
1806
        /* caller takes ownership of fd */
1807
        QLIST_REMOVE(monfd, next);
1808
        qemu_free(monfd->name);
1809
        qemu_free(monfd);
1810

    
1811
        return fd;
1812
    }
1813

    
1814
    return -1;
1815
}
1816

    
1817
static const mon_cmd_t mon_cmds[] = {
1818
#include "qemu-monitor.h"
1819
    { NULL, NULL, },
1820
};
1821

    
1822
/* Please update qemu-monitor.hx when adding or changing commands */
1823
static const mon_cmd_t info_cmds[] = {
1824
    {
1825
        .name       = "version",
1826
        .args_type  = "",
1827
        .params     = "",
1828
        .help       = "show the version of QEMU",
1829
        .mhandler.info = do_info_version,
1830
    },
1831
    {
1832
        .name       = "network",
1833
        .args_type  = "",
1834
        .params     = "",
1835
        .help       = "show the network state",
1836
        .mhandler.info = do_info_network,
1837
    },
1838
    {
1839
        .name       = "chardev",
1840
        .args_type  = "",
1841
        .params     = "",
1842
        .help       = "show the character devices",
1843
        .mhandler.info = qemu_chr_info,
1844
    },
1845
    {
1846
        .name       = "block",
1847
        .args_type  = "",
1848
        .params     = "",
1849
        .help       = "show the block devices",
1850
        .mhandler.info = bdrv_info,
1851
    },
1852
    {
1853
        .name       = "blockstats",
1854
        .args_type  = "",
1855
        .params     = "",
1856
        .help       = "show block device statistics",
1857
        .mhandler.info = bdrv_info_stats,
1858
    },
1859
    {
1860
        .name       = "registers",
1861
        .args_type  = "",
1862
        .params     = "",
1863
        .help       = "show the cpu registers",
1864
        .mhandler.info = do_info_registers,
1865
    },
1866
    {
1867
        .name       = "cpus",
1868
        .args_type  = "",
1869
        .params     = "",
1870
        .help       = "show infos for each CPU",
1871
        .mhandler.info = do_info_cpus,
1872
    },
1873
    {
1874
        .name       = "history",
1875
        .args_type  = "",
1876
        .params     = "",
1877
        .help       = "show the command line history",
1878
        .mhandler.info = do_info_history,
1879
    },
1880
    {
1881
        .name       = "irq",
1882
        .args_type  = "",
1883
        .params     = "",
1884
        .help       = "show the interrupts statistics (if available)",
1885
        .mhandler.info = irq_info,
1886
    },
1887
    {
1888
        .name       = "pic",
1889
        .args_type  = "",
1890
        .params     = "",
1891
        .help       = "show i8259 (PIC) state",
1892
        .mhandler.info = pic_info,
1893
    },
1894
    {
1895
        .name       = "pci",
1896
        .args_type  = "",
1897
        .params     = "",
1898
        .help       = "show PCI info",
1899
        .mhandler.info = pci_info,
1900
    },
1901
#if defined(TARGET_I386) || defined(TARGET_SH4)
1902
    {
1903
        .name       = "tlb",
1904
        .args_type  = "",
1905
        .params     = "",
1906
        .help       = "show virtual to physical memory mappings",
1907
        .mhandler.info = tlb_info,
1908
    },
1909
#endif
1910
#if defined(TARGET_I386)
1911
    {
1912
        .name       = "mem",
1913
        .args_type  = "",
1914
        .params     = "",
1915
        .help       = "show the active virtual memory mappings",
1916
        .mhandler.info = mem_info,
1917
    },
1918
    {
1919
        .name       = "hpet",
1920
        .args_type  = "",
1921
        .params     = "",
1922
        .help       = "show state of HPET",
1923
        .mhandler.info = do_info_hpet,
1924
    },
1925
#endif
1926
    {
1927
        .name       = "jit",
1928
        .args_type  = "",
1929
        .params     = "",
1930
        .help       = "show dynamic compiler info",
1931
        .mhandler.info = do_info_jit,
1932
    },
1933
    {
1934
        .name       = "kvm",
1935
        .args_type  = "",
1936
        .params     = "",
1937
        .help       = "show KVM information",
1938
        .mhandler.info = do_info_kvm,
1939
    },
1940
    {
1941
        .name       = "numa",
1942
        .args_type  = "",
1943
        .params     = "",
1944
        .help       = "show NUMA information",
1945
        .mhandler.info = do_info_numa,
1946
    },
1947
    {
1948
        .name       = "usb",
1949
        .args_type  = "",
1950
        .params     = "",
1951
        .help       = "show guest USB devices",
1952
        .mhandler.info = usb_info,
1953
    },
1954
    {
1955
        .name       = "usbhost",
1956
        .args_type  = "",
1957
        .params     = "",
1958
        .help       = "show host USB devices",
1959
        .mhandler.info = usb_host_info,
1960
    },
1961
    {
1962
        .name       = "profile",
1963
        .args_type  = "",
1964
        .params     = "",
1965
        .help       = "show profiling information",
1966
        .mhandler.info = do_info_profile,
1967
    },
1968
    {
1969
        .name       = "capture",
1970
        .args_type  = "",
1971
        .params     = "",
1972
        .help       = "show capture information",
1973
        .mhandler.info = do_info_capture,
1974
    },
1975
    {
1976
        .name       = "snapshots",
1977
        .args_type  = "",
1978
        .params     = "",
1979
        .help       = "show the currently saved VM snapshots",
1980
        .mhandler.info = do_info_snapshots,
1981
    },
1982
    {
1983
        .name       = "status",
1984
        .args_type  = "",
1985
        .params     = "",
1986
        .help       = "show the current VM status (running|paused)",
1987
        .mhandler.info = do_info_status,
1988
    },
1989
    {
1990
        .name       = "pcmcia",
1991
        .args_type  = "",
1992
        .params     = "",
1993
        .help       = "show guest PCMCIA status",
1994
        .mhandler.info = pcmcia_info,
1995
    },
1996
    {
1997
        .name       = "mice",
1998
        .args_type  = "",
1999
        .params     = "",
2000
        .help       = "show which guest mouse is receiving events",
2001
        .mhandler.info = do_info_mice,
2002
    },
2003
    {
2004
        .name       = "vnc",
2005
        .args_type  = "",
2006
        .params     = "",
2007
        .help       = "show the vnc server status",
2008
        .mhandler.info = do_info_vnc,
2009
    },
2010
    {
2011
        .name       = "name",
2012
        .args_type  = "",
2013
        .params     = "",
2014
        .help       = "show the current VM name",
2015
        .mhandler.info = do_info_name,
2016
    },
2017
    {
2018
        .name       = "uuid",
2019
        .args_type  = "",
2020
        .params     = "",
2021
        .help       = "show the current VM UUID",
2022
        .mhandler.info = do_info_uuid,
2023
    },
2024
#if defined(TARGET_PPC)
2025
    {
2026
        .name       = "cpustats",
2027
        .args_type  = "",
2028
        .params     = "",
2029
        .help       = "show CPU statistics",
2030
        .mhandler.info = do_info_cpu_stats,
2031
    },
2032
#endif
2033
#if defined(CONFIG_SLIRP)
2034
    {
2035
        .name       = "usernet",
2036
        .args_type  = "",
2037
        .params     = "",
2038
        .help       = "show user network stack connection states",
2039
        .mhandler.info = do_info_usernet,
2040
    },
2041
#endif
2042
    {
2043
        .name       = "migrate",
2044
        .args_type  = "",
2045
        .params     = "",
2046
        .help       = "show migration status",
2047
        .mhandler.info = do_info_migrate,
2048
    },
2049
    {
2050
        .name       = "balloon",
2051
        .args_type  = "",
2052
        .params     = "",
2053
        .help       = "show balloon information",
2054
        .mhandler.info = do_info_balloon,
2055
    },
2056
    {
2057
        .name       = "qtree",
2058
        .args_type  = "",
2059
        .params     = "",
2060
        .help       = "show device tree",
2061
        .mhandler.info = do_info_qtree,
2062
    },
2063
    {
2064
        .name       = "qdm",
2065
        .args_type  = "",
2066
        .params     = "",
2067
        .help       = "show qdev device model list",
2068
        .mhandler.info = do_info_qdm,
2069
    },
2070
    {
2071
        .name       = "roms",
2072
        .args_type  = "",
2073
        .params     = "",
2074
        .help       = "show roms",
2075
        .mhandler.info = do_info_roms,
2076
    },
2077
    {
2078
        .name       = NULL,
2079
    },
2080
};
2081

    
2082
/*******************************************************************/
2083

    
2084
static const char *pch;
2085
static jmp_buf expr_env;
2086

    
2087
#define MD_TLONG 0
2088
#define MD_I32   1
2089

    
2090
typedef struct MonitorDef {
2091
    const char *name;
2092
    int offset;
2093
    target_long (*get_value)(const struct MonitorDef *md, int val);
2094
    int type;
2095
} MonitorDef;
2096

    
2097
#if defined(TARGET_I386)
2098
static target_long monitor_get_pc (const struct MonitorDef *md, int val)
2099
{
2100
    CPUState *env = mon_get_cpu();
2101
    if (!env)
2102
        return 0;
2103
    return env->eip + env->segs[R_CS].base;
2104
}
2105
#endif
2106

    
2107
#if defined(TARGET_PPC)
2108
static target_long monitor_get_ccr (const struct MonitorDef *md, int val)
2109
{
2110
    CPUState *env = mon_get_cpu();
2111
    unsigned int u;
2112
    int i;
2113

    
2114
    if (!env)
2115
        return 0;
2116

    
2117
    u = 0;
2118
    for (i = 0; i < 8; i++)
2119
        u |= env->crf[i] << (32 - (4 * i));
2120

    
2121
    return u;
2122
}
2123

    
2124
static target_long monitor_get_msr (const struct MonitorDef *md, int val)
2125
{
2126
    CPUState *env = mon_get_cpu();
2127
    if (!env)
2128
        return 0;
2129
    return env->msr;
2130
}
2131

    
2132
static target_long monitor_get_xer (const struct MonitorDef *md, int val)
2133
{
2134
    CPUState *env = mon_get_cpu();
2135
    if (!env)
2136
        return 0;
2137
    return env->xer;
2138
}
2139

    
2140
static target_long monitor_get_decr (const struct MonitorDef *md, int val)
2141
{
2142
    CPUState *env = mon_get_cpu();
2143
    if (!env)
2144
        return 0;
2145
    return cpu_ppc_load_decr(env);
2146
}
2147

    
2148
static target_long monitor_get_tbu (const struct MonitorDef *md, int val)
2149
{
2150
    CPUState *env = mon_get_cpu();
2151
    if (!env)
2152
        return 0;
2153
    return cpu_ppc_load_tbu(env);
2154
}
2155

    
2156
static target_long monitor_get_tbl (const struct MonitorDef *md, int val)
2157
{
2158
    CPUState *env = mon_get_cpu();
2159
    if (!env)
2160
        return 0;
2161
    return cpu_ppc_load_tbl(env);
2162
}
2163
#endif
2164

    
2165
#if defined(TARGET_SPARC)
2166
#ifndef TARGET_SPARC64
2167
static target_long monitor_get_psr (const struct MonitorDef *md, int val)
2168
{
2169
    CPUState *env = mon_get_cpu();
2170
    if (!env)
2171
        return 0;
2172
    return GET_PSR(env);
2173
}
2174
#endif
2175

    
2176
static target_long monitor_get_reg(const struct MonitorDef *md, int val)
2177
{
2178
    CPUState *env = mon_get_cpu();
2179
    if (!env)
2180
        return 0;
2181
    return env->regwptr[val];
2182
}
2183
#endif
2184

    
2185
static const MonitorDef monitor_defs[] = {
2186
#ifdef TARGET_I386
2187

    
2188
#define SEG(name, seg) \
2189
    { name, offsetof(CPUState, segs[seg].selector), NULL, MD_I32 },\
2190
    { name ".base", offsetof(CPUState, segs[seg].base) },\
2191
    { name ".limit", offsetof(CPUState, segs[seg].limit), NULL, MD_I32 },
2192

    
2193
    { "eax", offsetof(CPUState, regs[0]) },
2194
    { "ecx", offsetof(CPUState, regs[1]) },
2195
    { "edx", offsetof(CPUState, regs[2]) },
2196
    { "ebx", offsetof(CPUState, regs[3]) },
2197
    { "esp|sp", offsetof(CPUState, regs[4]) },
2198
    { "ebp|fp", offsetof(CPUState, regs[5]) },
2199
    { "esi", offsetof(CPUState, regs[6]) },
2200
    { "edi", offsetof(CPUState, regs[7]) },
2201
#ifdef TARGET_X86_64
2202
    { "r8", offsetof(CPUState, regs[8]) },
2203
    { "r9", offsetof(CPUState, regs[9]) },
2204
    { "r10", offsetof(CPUState, regs[10]) },
2205
    { "r11", offsetof(CPUState, regs[11]) },
2206
    { "r12", offsetof(CPUState, regs[12]) },
2207
    { "r13", offsetof(CPUState, regs[13]) },
2208
    { "r14", offsetof(CPUState, regs[14]) },
2209
    { "r15", offsetof(CPUState, regs[15]) },
2210
#endif
2211
    { "eflags", offsetof(CPUState, eflags) },
2212
    { "eip", offsetof(CPUState, eip) },
2213
    SEG("cs", R_CS)
2214
    SEG("ds", R_DS)
2215
    SEG("es", R_ES)
2216
    SEG("ss", R_SS)
2217
    SEG("fs", R_FS)
2218
    SEG("gs", R_GS)
2219
    { "pc", 0, monitor_get_pc, },
2220
#elif defined(TARGET_PPC)
2221
    /* General purpose registers */
2222
    { "r0", offsetof(CPUState, gpr[0]) },
2223
    { "r1", offsetof(CPUState, gpr[1]) },
2224
    { "r2", offsetof(CPUState, gpr[2]) },
2225
    { "r3", offsetof(CPUState, gpr[3]) },
2226
    { "r4", offsetof(CPUState, gpr[4]) },
2227
    { "r5", offsetof(CPUState, gpr[5]) },
2228
    { "r6", offsetof(CPUState, gpr[6]) },
2229
    { "r7", offsetof(CPUState, gpr[7]) },
2230
    { "r8", offsetof(CPUState, gpr[8]) },
2231
    { "r9", offsetof(CPUState, gpr[9]) },
2232
    { "r10", offsetof(CPUState, gpr[10]) },
2233
    { "r11", offsetof(CPUState, gpr[11]) },
2234
    { "r12", offsetof(CPUState, gpr[12]) },
2235
    { "r13", offsetof(CPUState, gpr[13]) },
2236
    { "r14", offsetof(CPUState, gpr[14]) },
2237
    { "r15", offsetof(CPUState, gpr[15]) },
2238
    { "r16", offsetof(CPUState, gpr[16]) },
2239
    { "r17", offsetof(CPUState, gpr[17]) },
2240
    { "r18", offsetof(CPUState, gpr[18]) },
2241
    { "r19", offsetof(CPUState, gpr[19]) },
2242
    { "r20", offsetof(CPUState, gpr[20]) },
2243
    { "r21", offsetof(CPUState, gpr[21]) },
2244
    { "r22", offsetof(CPUState, gpr[22]) },
2245
    { "r23", offsetof(CPUState, gpr[23]) },
2246
    { "r24", offsetof(CPUState, gpr[24]) },
2247
    { "r25", offsetof(CPUState, gpr[25]) },
2248
    { "r26", offsetof(CPUState, gpr[26]) },
2249
    { "r27", offsetof(CPUState, gpr[27]) },
2250
    { "r28", offsetof(CPUState, gpr[28]) },
2251
    { "r29", offsetof(CPUState, gpr[29]) },
2252
    { "r30", offsetof(CPUState, gpr[30]) },
2253
    { "r31", offsetof(CPUState, gpr[31]) },
2254
    /* Floating point registers */
2255
    { "f0", offsetof(CPUState, fpr[0]) },
2256
    { "f1", offsetof(CPUState, fpr[1]) },
2257
    { "f2", offsetof(CPUState, fpr[2]) },
2258
    { "f3", offsetof(CPUState, fpr[3]) },
2259
    { "f4", offsetof(CPUState, fpr[4]) },
2260
    { "f5", offsetof(CPUState, fpr[5]) },
2261
    { "f6", offsetof(CPUState, fpr[6]) },
2262
    { "f7", offsetof(CPUState, fpr[7]) },
2263
    { "f8", offsetof(CPUState, fpr[8]) },
2264
    { "f9", offsetof(CPUState, fpr[9]) },
2265
    { "f10", offsetof(CPUState, fpr[10]) },
2266
    { "f11", offsetof(CPUState, fpr[11]) },
2267
    { "f12", offsetof(CPUState, fpr[12]) },
2268
    { "f13", offsetof(CPUState, fpr[13]) },
2269
    { "f14", offsetof(CPUState, fpr[14]) },
2270
    { "f15", offsetof(CPUState, fpr[15]) },
2271
    { "f16", offsetof(CPUState, fpr[16]) },
2272
    { "f17", offsetof(CPUState, fpr[17]) },
2273
    { "f18", offsetof(CPUState, fpr[18]) },
2274
    { "f19", offsetof(CPUState, fpr[19]) },
2275
    { "f20", offsetof(CPUState, fpr[20]) },
2276
    { "f21", offsetof(CPUState, fpr[21]) },
2277
    { "f22", offsetof(CPUState, fpr[22]) },
2278
    { "f23", offsetof(CPUState, fpr[23]) },
2279
    { "f24", offsetof(CPUState, fpr[24]) },
2280
    { "f25", offsetof(CPUState, fpr[25]) },
2281
    { "f26", offsetof(CPUState, fpr[26]) },
2282
    { "f27", offsetof(CPUState, fpr[27]) },
2283
    { "f28", offsetof(CPUState, fpr[28]) },
2284
    { "f29", offsetof(CPUState, fpr[29]) },
2285
    { "f30", offsetof(CPUState, fpr[30]) },
2286
    { "f31", offsetof(CPUState, fpr[31]) },
2287
    { "fpscr", offsetof(CPUState, fpscr) },
2288
    /* Next instruction pointer */
2289
    { "nip|pc", offsetof(CPUState, nip) },
2290
    { "lr", offsetof(CPUState, lr) },
2291
    { "ctr", offsetof(CPUState, ctr) },
2292
    { "decr", 0, &monitor_get_decr, },
2293
    { "ccr", 0, &monitor_get_ccr, },
2294
    /* Machine state register */
2295
    { "msr", 0, &monitor_get_msr, },
2296
    { "xer", 0, &monitor_get_xer, },
2297
    { "tbu", 0, &monitor_get_tbu, },
2298
    { "tbl", 0, &monitor_get_tbl, },
2299
#if defined(TARGET_PPC64)
2300
    /* Address space register */
2301
    { "asr", offsetof(CPUState, asr) },
2302
#endif
2303
    /* Segment registers */
2304
    { "sdr1", offsetof(CPUState, sdr1) },
2305
    { "sr0", offsetof(CPUState, sr[0]) },
2306
    { "sr1", offsetof(CPUState, sr[1]) },
2307
    { "sr2", offsetof(CPUState, sr[2]) },
2308
    { "sr3", offsetof(CPUState, sr[3]) },
2309
    { "sr4", offsetof(CPUState, sr[4]) },
2310
    { "sr5", offsetof(CPUState, sr[5]) },
2311
    { "sr6", offsetof(CPUState, sr[6]) },
2312
    { "sr7", offsetof(CPUState, sr[7]) },
2313
    { "sr8", offsetof(CPUState, sr[8]) },
2314
    { "sr9", offsetof(CPUState, sr[9]) },
2315
    { "sr10", offsetof(CPUState, sr[10]) },
2316
    { "sr11", offsetof(CPUState, sr[11]) },
2317
    { "sr12", offsetof(CPUState, sr[12]) },
2318
    { "sr13", offsetof(CPUState, sr[13]) },
2319
    { "sr14", offsetof(CPUState, sr[14]) },
2320
    { "sr15", offsetof(CPUState, sr[15]) },
2321
    /* Too lazy to put BATs and SPRs ... */
2322
#elif defined(TARGET_SPARC)
2323
    { "g0", offsetof(CPUState, gregs[0]) },
2324
    { "g1", offsetof(CPUState, gregs[1]) },
2325
    { "g2", offsetof(CPUState, gregs[2]) },
2326
    { "g3", offsetof(CPUState, gregs[3]) },
2327
    { "g4", offsetof(CPUState, gregs[4]) },
2328
    { "g5", offsetof(CPUState, gregs[5]) },
2329
    { "g6", offsetof(CPUState, gregs[6]) },
2330
    { "g7", offsetof(CPUState, gregs[7]) },
2331
    { "o0", 0, monitor_get_reg },
2332
    { "o1", 1, monitor_get_reg },
2333
    { "o2", 2, monitor_get_reg },
2334
    { "o3", 3, monitor_get_reg },
2335
    { "o4", 4, monitor_get_reg },
2336
    { "o5", 5, monitor_get_reg },
2337
    { "o6", 6, monitor_get_reg },
2338
    { "o7", 7, monitor_get_reg },
2339
    { "l0", 8, monitor_get_reg },
2340
    { "l1", 9, monitor_get_reg },
2341
    { "l2", 10, monitor_get_reg },
2342
    { "l3", 11, monitor_get_reg },
2343
    { "l4", 12, monitor_get_reg },
2344
    { "l5", 13, monitor_get_reg },
2345
    { "l6", 14, monitor_get_reg },
2346
    { "l7", 15, monitor_get_reg },
2347
    { "i0", 16, monitor_get_reg },
2348
    { "i1", 17, monitor_get_reg },
2349
    { "i2", 18, monitor_get_reg },
2350
    { "i3", 19, monitor_get_reg },
2351
    { "i4", 20, monitor_get_reg },
2352
    { "i5", 21, monitor_get_reg },
2353
    { "i6", 22, monitor_get_reg },
2354
    { "i7", 23, monitor_get_reg },
2355
    { "pc", offsetof(CPUState, pc) },
2356
    { "npc", offsetof(CPUState, npc) },
2357
    { "y", offsetof(CPUState, y) },
2358
#ifndef TARGET_SPARC64
2359
    { "psr", 0, &monitor_get_psr, },
2360
    { "wim", offsetof(CPUState, wim) },
2361
#endif
2362
    { "tbr", offsetof(CPUState, tbr) },
2363
    { "fsr", offsetof(CPUState, fsr) },
2364
    { "f0", offsetof(CPUState, fpr[0]) },
2365
    { "f1", offsetof(CPUState, fpr[1]) },
2366
    { "f2", offsetof(CPUState, fpr[2]) },
2367
    { "f3", offsetof(CPUState, fpr[3]) },
2368
    { "f4", offsetof(CPUState, fpr[4]) },
2369
    { "f5", offsetof(CPUState, fpr[5]) },
2370
    { "f6", offsetof(CPUState, fpr[6]) },
2371
    { "f7", offsetof(CPUState, fpr[7]) },
2372
    { "f8", offsetof(CPUState, fpr[8]) },
2373
    { "f9", offsetof(CPUState, fpr[9]) },
2374
    { "f10", offsetof(CPUState, fpr[10]) },
2375
    { "f11", offsetof(CPUState, fpr[11]) },
2376
    { "f12", offsetof(CPUState, fpr[12]) },
2377
    { "f13", offsetof(CPUState, fpr[13]) },
2378
    { "f14", offsetof(CPUState, fpr[14]) },
2379
    { "f15", offsetof(CPUState, fpr[15]) },
2380
    { "f16", offsetof(CPUState, fpr[16]) },
2381
    { "f17", offsetof(CPUState, fpr[17]) },
2382
    { "f18", offsetof(CPUState, fpr[18]) },
2383
    { "f19", offsetof(CPUState, fpr[19]) },
2384
    { "f20", offsetof(CPUState, fpr[20]) },
2385
    { "f21", offsetof(CPUState, fpr[21]) },
2386
    { "f22", offsetof(CPUState, fpr[22]) },
2387
    { "f23", offsetof(CPUState, fpr[23]) },
2388
    { "f24", offsetof(CPUState, fpr[24]) },
2389
    { "f25", offsetof(CPUState, fpr[25]) },
2390
    { "f26", offsetof(CPUState, fpr[26]) },
2391
    { "f27", offsetof(CPUState, fpr[27]) },
2392
    { "f28", offsetof(CPUState, fpr[28]) },
2393
    { "f29", offsetof(CPUState, fpr[29]) },
2394
    { "f30", offsetof(CPUState, fpr[30]) },
2395
    { "f31", offsetof(CPUState, fpr[31]) },
2396
#ifdef TARGET_SPARC64
2397
    { "f32", offsetof(CPUState, fpr[32]) },
2398
    { "f34", offsetof(CPUState, fpr[34]) },
2399
    { "f36", offsetof(CPUState, fpr[36]) },
2400
    { "f38", offsetof(CPUState, fpr[38]) },
2401
    { "f40", offsetof(CPUState, fpr[40]) },
2402
    { "f42", offsetof(CPUState, fpr[42]) },
2403
    { "f44", offsetof(CPUState, fpr[44]) },
2404
    { "f46", offsetof(CPUState, fpr[46]) },
2405
    { "f48", offsetof(CPUState, fpr[48]) },
2406
    { "f50", offsetof(CPUState, fpr[50]) },
2407
    { "f52", offsetof(CPUState, fpr[52]) },
2408
    { "f54", offsetof(CPUState, fpr[54]) },
2409
    { "f56", offsetof(CPUState, fpr[56]) },
2410
    { "f58", offsetof(CPUState, fpr[58]) },
2411
    { "f60", offsetof(CPUState, fpr[60]) },
2412
    { "f62", offsetof(CPUState, fpr[62]) },
2413
    { "asi", offsetof(CPUState, asi) },
2414
    { "pstate", offsetof(CPUState, pstate) },
2415
    { "cansave", offsetof(CPUState, cansave) },
2416
    { "canrestore", offsetof(CPUState, canrestore) },
2417
    { "otherwin", offsetof(CPUState, otherwin) },
2418
    { "wstate", offsetof(CPUState, wstate) },
2419
    { "cleanwin", offsetof(CPUState, cleanwin) },
2420
    { "fprs", offsetof(CPUState, fprs) },
2421
#endif
2422
#endif
2423
    { NULL },
2424
};
2425

    
2426
static void expr_error(Monitor *mon, const char *msg)
2427
{
2428
    monitor_printf(mon, "%s\n", msg);
2429
    longjmp(expr_env, 1);
2430
}
2431

    
2432
/* return 0 if OK, -1 if not found, -2 if no CPU defined */
2433
static int get_monitor_def(target_long *pval, const char *name)
2434
{
2435
    const MonitorDef *md;
2436
    void *ptr;
2437

    
2438
    for(md = monitor_defs; md->name != NULL; md++) {
2439
        if (compare_cmd(name, md->name)) {
2440
            if (md->get_value) {
2441
                *pval = md->get_value(md, md->offset);
2442
            } else {
2443
                CPUState *env = mon_get_cpu();
2444
                if (!env)
2445
                    return -2;
2446
                ptr = (uint8_t *)env + md->offset;
2447
                switch(md->type) {
2448
                case MD_I32:
2449
                    *pval = *(int32_t *)ptr;
2450
                    break;
2451
                case MD_TLONG:
2452
                    *pval = *(target_long *)ptr;
2453
                    break;
2454
                default:
2455
                    *pval = 0;
2456
                    break;
2457
                }
2458
            }
2459
            return 0;
2460
        }
2461
    }
2462
    return -1;
2463
}
2464

    
2465
static void next(void)
2466
{
2467
    if (*pch != '\0') {
2468
        pch++;
2469
        while (qemu_isspace(*pch))
2470
            pch++;
2471
    }
2472
}
2473

    
2474
static int64_t expr_sum(Monitor *mon);
2475

    
2476
static int64_t expr_unary(Monitor *mon)
2477
{
2478
    int64_t n;
2479
    char *p;
2480
    int ret;
2481

    
2482
    switch(*pch) {
2483
    case '+':
2484
        next();
2485
        n = expr_unary(mon);
2486
        break;
2487
    case '-':
2488
        next();
2489
        n = -expr_unary(mon);
2490
        break;
2491
    case '~':
2492
        next();
2493
        n = ~expr_unary(mon);
2494
        break;
2495
    case '(':
2496
        next();
2497
        n = expr_sum(mon);
2498
        if (*pch != ')') {
2499
            expr_error(mon, "')' expected");
2500
        }
2501
        next();
2502
        break;
2503
    case '\'':
2504
        pch++;
2505
        if (*pch == '\0')
2506
            expr_error(mon, "character constant expected");
2507
        n = *pch;
2508
        pch++;
2509
        if (*pch != '\'')
2510
            expr_error(mon, "missing terminating \' character");
2511
        next();
2512
        break;
2513
    case '$':
2514
        {
2515
            char buf[128], *q;
2516
            target_long reg=0;
2517

    
2518
            pch++;
2519
            q = buf;
2520
            while ((*pch >= 'a' && *pch <= 'z') ||
2521
                   (*pch >= 'A' && *pch <= 'Z') ||
2522
                   (*pch >= '0' && *pch <= '9') ||
2523
                   *pch == '_' || *pch == '.') {
2524
                if ((q - buf) < sizeof(buf) - 1)
2525
                    *q++ = *pch;
2526
                pch++;
2527
            }
2528
            while (qemu_isspace(*pch))
2529
                pch++;
2530
            *q = 0;
2531
            ret = get_monitor_def(&reg, buf);
2532
            if (ret == -1)
2533
                expr_error(mon, "unknown register");
2534
            else if (ret == -2)
2535
                expr_error(mon, "no cpu defined");
2536
            n = reg;
2537
        }
2538
        break;
2539
    case '\0':
2540
        expr_error(mon, "unexpected end of expression");
2541
        n = 0;
2542
        break;
2543
    default:
2544
#if TARGET_PHYS_ADDR_BITS > 32
2545
        n = strtoull(pch, &p, 0);
2546
#else
2547
        n = strtoul(pch, &p, 0);
2548
#endif
2549
        if (pch == p) {
2550
            expr_error(mon, "invalid char in expression");
2551
        }
2552
        pch = p;
2553
        while (qemu_isspace(*pch))
2554
            pch++;
2555
        break;
2556
    }
2557
    return n;
2558
}
2559

    
2560

    
2561
static int64_t expr_prod(Monitor *mon)
2562
{
2563
    int64_t val, val2;
2564
    int op;
2565

    
2566
    val = expr_unary(mon);
2567
    for(;;) {
2568
        op = *pch;
2569
        if (op != '*' && op != '/' && op != '%')
2570
            break;
2571
        next();
2572
        val2 = expr_unary(mon);
2573
        switch(op) {
2574
        default:
2575
        case '*':
2576
            val *= val2;
2577
            break;
2578
        case '/':
2579
        case '%':
2580
            if (val2 == 0)
2581
                expr_error(mon, "division by zero");
2582
            if (op == '/')
2583
                val /= val2;
2584
            else
2585
                val %= val2;
2586
            break;
2587
        }
2588
    }
2589
    return val;
2590
}
2591

    
2592
static int64_t expr_logic(Monitor *mon)
2593
{
2594
    int64_t val, val2;
2595
    int op;
2596

    
2597
    val = expr_prod(mon);
2598
    for(;;) {
2599
        op = *pch;
2600
        if (op != '&' && op != '|' && op != '^')
2601
            break;
2602
        next();
2603
        val2 = expr_prod(mon);
2604
        switch(op) {
2605
        default:
2606
        case '&':
2607
            val &= val2;
2608
            break;
2609
        case '|':
2610
            val |= val2;
2611
            break;
2612
        case '^':
2613
            val ^= val2;
2614
            break;
2615
        }
2616
    }
2617
    return val;
2618
}
2619

    
2620
static int64_t expr_sum(Monitor *mon)
2621
{
2622
    int64_t val, val2;
2623
    int op;
2624

    
2625
    val = expr_logic(mon);
2626
    for(;;) {
2627
        op = *pch;
2628
        if (op != '+' && op != '-')
2629
            break;
2630
        next();
2631
        val2 = expr_logic(mon);
2632
        if (op == '+')
2633
            val += val2;
2634
        else
2635
            val -= val2;
2636
    }
2637
    return val;
2638
}
2639

    
2640
static int get_expr(Monitor *mon, int64_t *pval, const char **pp)
2641
{
2642
    pch = *pp;
2643
    if (setjmp(expr_env)) {
2644
        *pp = pch;
2645
        return -1;
2646
    }
2647
    while (qemu_isspace(*pch))
2648
        pch++;
2649
    *pval = expr_sum(mon);
2650
    *pp = pch;
2651
    return 0;
2652
}
2653

    
2654
static int get_str(char *buf, int buf_size, const char **pp)
2655
{
2656
    const char *p;
2657
    char *q;
2658
    int c;
2659

    
2660
    q = buf;
2661
    p = *pp;
2662
    while (qemu_isspace(*p))
2663
        p++;
2664
    if (*p == '\0') {
2665
    fail:
2666
        *q = '\0';
2667
        *pp = p;
2668
        return -1;
2669
    }
2670
    if (*p == '\"') {
2671
        p++;
2672
        while (*p != '\0' && *p != '\"') {
2673
            if (*p == '\\') {
2674
                p++;
2675
                c = *p++;
2676
                switch(c) {
2677
                case 'n':
2678
                    c = '\n';
2679
                    break;
2680
                case 'r':
2681
                    c = '\r';
2682
                    break;
2683
                case '\\':
2684
                case '\'':
2685
                case '\"':
2686
                    break;
2687
                default:
2688
                    qemu_printf("unsupported escape code: '\\%c'\n", c);
2689
                    goto fail;
2690
                }
2691
                if ((q - buf) < buf_size - 1) {
2692
                    *q++ = c;
2693
                }
2694
            } else {
2695
                if ((q - buf) < buf_size - 1) {
2696
                    *q++ = *p;
2697
                }
2698
                p++;
2699
            }
2700
        }
2701
        if (*p != '\"') {
2702
            qemu_printf("unterminated string\n");
2703
            goto fail;
2704
        }
2705
        p++;
2706
    } else {
2707
        while (*p != '\0' && !qemu_isspace(*p)) {
2708
            if ((q - buf) < buf_size - 1) {
2709
                *q++ = *p;
2710
            }
2711
            p++;
2712
        }
2713
    }
2714
    *q = '\0';
2715
    *pp = p;
2716
    return 0;
2717
}
2718

    
2719
/*
2720
 * Store the command-name in cmdname, and return a pointer to
2721
 * the remaining of the command string.
2722
 */
2723
static const char *get_command_name(const char *cmdline,
2724
                                    char *cmdname, size_t nlen)
2725
{
2726
    size_t len;
2727
    const char *p, *pstart;
2728

    
2729
    p = cmdline;
2730
    while (qemu_isspace(*p))
2731
        p++;
2732
    if (*p == '\0')
2733
        return NULL;
2734
    pstart = p;
2735
    while (*p != '\0' && *p != '/' && !qemu_isspace(*p))
2736
        p++;
2737
    len = p - pstart;
2738
    if (len > nlen - 1)
2739
        len = nlen - 1;
2740
    memcpy(cmdname, pstart, len);
2741
    cmdname[len] = '\0';
2742
    return p;
2743
}
2744

    
2745
/**
2746
 * Read key of 'type' into 'key' and return the current
2747
 * 'type' pointer.
2748
 */
2749
static char *key_get_info(const char *type, char **key)
2750
{
2751
    size_t len;
2752
    char *p, *str;
2753

    
2754
    if (*type == ',')
2755
        type++;
2756

    
2757
    p = strchr(type, ':');
2758
    if (!p) {
2759
        *key = NULL;
2760
        return NULL;
2761
    }
2762
    len = p - type;
2763

    
2764
    str = qemu_malloc(len + 1);
2765
    memcpy(str, type, len);
2766
    str[len] = '\0';
2767

    
2768
    *key = str;
2769
    return ++p;
2770
}
2771

    
2772
static int default_fmt_format = 'x';
2773
static int default_fmt_size = 4;
2774

    
2775
#define MAX_ARGS 16
2776

    
2777
static const mon_cmd_t *monitor_parse_command(Monitor *mon,
2778
                                              const char *cmdline,
2779
                                              QDict *qdict)
2780
{
2781
    const char *p, *typestr;
2782
    int c;
2783
    const mon_cmd_t *cmd;
2784
    char cmdname[256];
2785
    char buf[1024];
2786
    char *key;
2787

    
2788
#ifdef DEBUG
2789
    monitor_printf(mon, "command='%s'\n", cmdline);
2790
#endif
2791

    
2792
    /* extract the command name */
2793
    p = get_command_name(cmdline, cmdname, sizeof(cmdname));
2794
    if (!p)
2795
        return NULL;
2796

    
2797
    /* find the command */
2798
    for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
2799
        if (compare_cmd(cmdname, cmd->name))
2800
            break;
2801
    }
2802

    
2803
    if (cmd->name == NULL) {
2804
        monitor_printf(mon, "unknown command: '%s'\n", cmdname);
2805
        return NULL;
2806
    }
2807

    
2808
    /* parse the parameters */
2809
    typestr = cmd->args_type;
2810
    for(;;) {
2811
        typestr = key_get_info(typestr, &key);
2812
        if (!typestr)
2813
            break;
2814
        c = *typestr;
2815
        typestr++;
2816
        switch(c) {
2817
        case 'F':
2818
        case 'B':
2819
        case 's':
2820
            {
2821
                int ret;
2822

    
2823
                while (qemu_isspace(*p))
2824
                    p++;
2825
                if (*typestr == '?') {
2826
                    typestr++;
2827
                    if (*p == '\0') {
2828
                        /* no optional string: NULL argument */
2829
                        break;
2830
                    }
2831
                }
2832
                ret = get_str(buf, sizeof(buf), &p);
2833
                if (ret < 0) {
2834
                    switch(c) {
2835
                    case 'F':
2836
                        monitor_printf(mon, "%s: filename expected\n",
2837
                                       cmdname);
2838
                        break;
2839
                    case 'B':
2840
                        monitor_printf(mon, "%s: block device name expected\n",
2841
                                       cmdname);
2842
                        break;
2843
                    default:
2844
                        monitor_printf(mon, "%s: string expected\n", cmdname);
2845
                        break;
2846
                    }
2847
                    goto fail;
2848
                }
2849
                qdict_put(qdict, key, qstring_from_str(buf));
2850
            }
2851
            break;
2852
        case '/':
2853
            {
2854
                int count, format, size;
2855

    
2856
                while (qemu_isspace(*p))
2857
                    p++;
2858
                if (*p == '/') {
2859
                    /* format found */
2860
                    p++;
2861
                    count = 1;
2862
                    if (qemu_isdigit(*p)) {
2863
                        count = 0;
2864
                        while (qemu_isdigit(*p)) {
2865
                            count = count * 10 + (*p - '0');
2866
                            p++;
2867
                        }
2868
                    }
2869
                    size = -1;
2870
                    format = -1;
2871
                    for(;;) {
2872
                        switch(*p) {
2873
                        case 'o':
2874
                        case 'd':
2875
                        case 'u':
2876
                        case 'x':
2877
                        case 'i':
2878
                        case 'c':
2879
                            format = *p++;
2880
                            break;
2881
                        case 'b':
2882
                            size = 1;
2883
                            p++;
2884
                            break;
2885
                        case 'h':
2886
                            size = 2;
2887
                            p++;
2888
                            break;
2889
                        case 'w':
2890
                            size = 4;
2891
                            p++;
2892
                            break;
2893
                        case 'g':
2894
                        case 'L':
2895
                            size = 8;
2896
                            p++;
2897
                            break;
2898
                        default:
2899
                            goto next;
2900
                        }
2901
                    }
2902
                next:
2903
                    if (*p != '\0' && !qemu_isspace(*p)) {
2904
                        monitor_printf(mon, "invalid char in format: '%c'\n",
2905
                                       *p);
2906
                        goto fail;
2907
                    }
2908
                    if (format < 0)
2909
                        format = default_fmt_format;
2910
                    if (format != 'i') {
2911
                        /* for 'i', not specifying a size gives -1 as size */
2912
                        if (size < 0)
2913
                            size = default_fmt_size;
2914
                        default_fmt_size = size;
2915
                    }
2916
                    default_fmt_format = format;
2917
                } else {
2918
                    count = 1;
2919
                    format = default_fmt_format;
2920
                    if (format != 'i') {
2921
                        size = default_fmt_size;
2922
                    } else {
2923
                        size = -1;
2924
                    }
2925
                }
2926
                qdict_put(qdict, "count", qint_from_int(count));
2927
                qdict_put(qdict, "format", qint_from_int(format));
2928
                qdict_put(qdict, "size", qint_from_int(size));
2929
            }
2930
            break;
2931
        case 'i':
2932
        case 'l':
2933
            {
2934
                int64_t val;
2935

    
2936
                while (qemu_isspace(*p))
2937
                    p++;
2938
                if (*typestr == '?' || *typestr == '.') {
2939
                    if (*typestr == '?') {
2940
                        if (*p == '\0') {
2941
                            typestr++;
2942
                            break;
2943
                        }
2944
                    } else {
2945
                        if (*p == '.') {
2946
                            p++;
2947
                            while (qemu_isspace(*p))
2948
                                p++;
2949
                        } else {
2950
                            typestr++;
2951
                            break;
2952
                        }
2953
                    }
2954
                    typestr++;
2955
                }
2956
                if (get_expr(mon, &val, &p))
2957
                    goto fail;
2958
                /* Check if 'i' is greater than 32-bit */
2959
                if ((c == 'i') && ((val >> 32) & 0xffffffff)) {
2960
                    monitor_printf(mon, "\'%s\' has failed: ", cmdname);
2961
                    monitor_printf(mon, "integer is for 32-bit values\n");
2962
                    goto fail;
2963
                }
2964
                qdict_put(qdict, key, qint_from_int(val));
2965
            }
2966
            break;
2967
        case '-':
2968
            {
2969
                int has_option;
2970
                /* option */
2971

    
2972
                c = *typestr++;
2973
                if (c == '\0')
2974
                    goto bad_type;
2975
                while (qemu_isspace(*p))
2976
                    p++;
2977
                has_option = 0;
2978
                if (*p == '-') {
2979
                    p++;
2980
                    if (*p != c) {
2981
                        monitor_printf(mon, "%s: unsupported option -%c\n",
2982
                                       cmdname, *p);
2983
                        goto fail;
2984
                    }
2985
                    p++;
2986
                    has_option = 1;
2987
                }
2988
                qdict_put(qdict, key, qint_from_int(has_option));
2989
            }
2990
            break;
2991
        default:
2992
        bad_type:
2993
            monitor_printf(mon, "%s: unknown type '%c'\n", cmdname, c);
2994
            goto fail;
2995
        }
2996
        qemu_free(key);
2997
        key = NULL;
2998
    }
2999
    /* check that all arguments were parsed */
3000
    while (qemu_isspace(*p))
3001
        p++;
3002
    if (*p != '\0') {
3003
        monitor_printf(mon, "%s: extraneous characters at the end of line\n",
3004
                       cmdname);
3005
        goto fail;
3006
    }
3007

    
3008
    return cmd;
3009

    
3010
fail:
3011
    qemu_free(key);
3012
    return NULL;
3013
}
3014

    
3015
static void monitor_handle_command(Monitor *mon, const char *cmdline)
3016
{
3017
    QDict *qdict;
3018
    const mon_cmd_t *cmd;
3019

    
3020
    qdict = qdict_new();
3021

    
3022
    cmd = monitor_parse_command(mon, cmdline, qdict);
3023
    if (!cmd)
3024
        goto out;
3025

    
3026
    qemu_errors_to_mon(mon);
3027

    
3028
    if (monitor_handler_ported(cmd)) {
3029
        QObject *data = NULL;
3030

    
3031
        cmd->mhandler.cmd_new(mon, qdict, &data);
3032
        if (data)
3033
            cmd->user_print(mon, data);
3034

    
3035
        qobject_decref(data);
3036
    } else {
3037
        cmd->mhandler.cmd(mon, qdict);
3038
    }
3039

    
3040
   qemu_errors_to_previous();
3041

    
3042
out:
3043
    QDECREF(qdict);
3044
}
3045

    
3046
static void cmd_completion(const char *name, const char *list)
3047
{
3048
    const char *p, *pstart;
3049
    char cmd[128];
3050
    int len;
3051

    
3052
    p = list;
3053
    for(;;) {
3054
        pstart = p;
3055
        p = strchr(p, '|');
3056
        if (!p)
3057
            p = pstart + strlen(pstart);
3058
        len = p - pstart;
3059
        if (len > sizeof(cmd) - 2)
3060
            len = sizeof(cmd) - 2;
3061
        memcpy(cmd, pstart, len);
3062
        cmd[len] = '\0';
3063
        if (name[0] == '\0' || !strncmp(name, cmd, strlen(name))) {
3064
            readline_add_completion(cur_mon->rs, cmd);
3065
        }
3066
        if (*p == '\0')
3067
            break;
3068
        p++;
3069
    }
3070
}
3071

    
3072
static void file_completion(const char *input)
3073
{
3074
    DIR *ffs;
3075
    struct dirent *d;
3076
    char path[1024];
3077
    char file[1024], file_prefix[1024];
3078
    int input_path_len;
3079
    const char *p;
3080

    
3081
    p = strrchr(input, '/');
3082
    if (!p) {
3083
        input_path_len = 0;
3084
        pstrcpy(file_prefix, sizeof(file_prefix), input);
3085
        pstrcpy(path, sizeof(path), ".");
3086
    } else {
3087
        input_path_len = p - input + 1;
3088
        memcpy(path, input, input_path_len);
3089
        if (input_path_len > sizeof(path) - 1)
3090
            input_path_len = sizeof(path) - 1;
3091
        path[input_path_len] = '\0';
3092
        pstrcpy(file_prefix, sizeof(file_prefix), p + 1);
3093
    }
3094
#ifdef DEBUG_COMPLETION
3095
    monitor_printf(cur_mon, "input='%s' path='%s' prefix='%s'\n",
3096
                   input, path, file_prefix);
3097
#endif
3098
    ffs = opendir(path);
3099
    if (!ffs)
3100
        return;
3101
    for(;;) {
3102
        struct stat sb;
3103
        d = readdir(ffs);
3104
        if (!d)
3105
            break;
3106
        if (strstart(d->d_name, file_prefix, NULL)) {
3107
            memcpy(file, input, input_path_len);
3108
            if (input_path_len < sizeof(file))
3109
                pstrcpy(file + input_path_len, sizeof(file) - input_path_len,
3110
                        d->d_name);
3111
            /* stat the file to find out if it's a directory.
3112
             * In that case add a slash to speed up typing long paths
3113
             */
3114
            stat(file, &sb);
3115
            if(S_ISDIR(sb.st_mode))
3116
                pstrcat(file, sizeof(file), "/");
3117
            readline_add_completion(cur_mon->rs, file);
3118
        }
3119
    }
3120
    closedir(ffs);
3121
}
3122

    
3123
static void block_completion_it(void *opaque, BlockDriverState *bs)
3124
{
3125
    const char *name = bdrv_get_device_name(bs);
3126
    const char *input = opaque;
3127

    
3128
    if (input[0] == '\0' ||
3129
        !strncmp(name, (char *)input, strlen(input))) {
3130
        readline_add_completion(cur_mon->rs, name);
3131
    }
3132
}
3133

    
3134
/* NOTE: this parser is an approximate form of the real command parser */
3135
static void parse_cmdline(const char *cmdline,
3136
                         int *pnb_args, char **args)
3137
{
3138
    const char *p;
3139
    int nb_args, ret;
3140
    char buf[1024];
3141

    
3142
    p = cmdline;
3143
    nb_args = 0;
3144
    for(;;) {
3145
        while (qemu_isspace(*p))
3146
            p++;
3147
        if (*p == '\0')
3148
            break;
3149
        if (nb_args >= MAX_ARGS)
3150
            break;
3151
        ret = get_str(buf, sizeof(buf), &p);
3152
        args[nb_args] = qemu_strdup(buf);
3153
        nb_args++;
3154
        if (ret < 0)
3155
            break;
3156
    }
3157
    *pnb_args = nb_args;
3158
}
3159

    
3160
static const char *next_arg_type(const char *typestr)
3161
{
3162
    const char *p = strchr(typestr, ':');
3163
    return (p != NULL ? ++p : typestr);
3164
}
3165

    
3166
static void monitor_find_completion(const char *cmdline)
3167
{
3168
    const char *cmdname;
3169
    char *args[MAX_ARGS];
3170
    int nb_args, i, len;
3171
    const char *ptype, *str;
3172
    const mon_cmd_t *cmd;
3173
    const KeyDef *key;
3174

    
3175
    parse_cmdline(cmdline, &nb_args, args);
3176
#ifdef DEBUG_COMPLETION
3177
    for(i = 0; i < nb_args; i++) {
3178
        monitor_printf(cur_mon, "arg%d = '%s'\n", i, (char *)args[i]);
3179
    }
3180
#endif
3181

    
3182
    /* if the line ends with a space, it means we want to complete the
3183
       next arg */
3184
    len = strlen(cmdline);
3185
    if (len > 0 && qemu_isspace(cmdline[len - 1])) {
3186
        if (nb_args >= MAX_ARGS)
3187
            return;
3188
        args[nb_args++] = qemu_strdup("");
3189
    }
3190
    if (nb_args <= 1) {
3191
        /* command completion */
3192
        if (nb_args == 0)
3193
            cmdname = "";
3194
        else
3195
            cmdname = args[0];
3196
        readline_set_completion_index(cur_mon->rs, strlen(cmdname));
3197
        for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
3198
            cmd_completion(cmdname, cmd->name);
3199
        }
3200
    } else {
3201
        /* find the command */
3202
        for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
3203
            if (compare_cmd(args[0], cmd->name))
3204
                goto found;
3205
        }
3206
        return;
3207
    found:
3208
        ptype = next_arg_type(cmd->args_type);
3209
        for(i = 0; i < nb_args - 2; i++) {
3210
            if (*ptype != '\0') {
3211
                ptype = next_arg_type(ptype);
3212
                while (*ptype == '?')
3213
                    ptype = next_arg_type(ptype);
3214
            }
3215
        }
3216
        str = args[nb_args - 1];
3217
        if (*ptype == '-' && ptype[1] != '\0') {
3218
            ptype += 2;
3219
        }
3220
        switch(*ptype) {
3221
        case 'F':
3222
            /* file completion */
3223
            readline_set_completion_index(cur_mon->rs, strlen(str));
3224
            file_completion(str);
3225
            break;
3226
        case 'B':
3227
            /* block device name completion */
3228
            readline_set_completion_index(cur_mon->rs, strlen(str));
3229
            bdrv_iterate(block_completion_it, (void *)str);
3230
            break;
3231
        case 's':
3232
            /* XXX: more generic ? */
3233
            if (!strcmp(cmd->name, "info")) {
3234
                readline_set_completion_index(cur_mon->rs, strlen(str));
3235
                for(cmd = info_cmds; cmd->name != NULL; cmd++) {
3236
                    cmd_completion(str, cmd->name);
3237
                }
3238
            } else if (!strcmp(cmd->name, "sendkey")) {
3239
                char *sep = strrchr(str, '-');
3240
                if (sep)
3241
                    str = sep + 1;
3242
                readline_set_completion_index(cur_mon->rs, strlen(str));
3243
                for(key = key_defs; key->name != NULL; key++) {
3244
                    cmd_completion(str, key->name);
3245
                }
3246
            } else if (!strcmp(cmd->name, "help|?")) {
3247
                readline_set_completion_index(cur_mon->rs, strlen(str));
3248
                for (cmd = mon_cmds; cmd->name != NULL; cmd++) {
3249
                    cmd_completion(str, cmd->name);
3250
                }
3251
            }
3252
            break;
3253
        default:
3254
            break;
3255
        }
3256
    }
3257
    for(i = 0; i < nb_args; i++)
3258
        qemu_free(args[i]);
3259
}
3260

    
3261
static int monitor_can_read(void *opaque)
3262
{
3263
    Monitor *mon = opaque;
3264

    
3265
    return (mon->suspend_cnt == 0) ? 128 : 0;
3266
}
3267

    
3268
static void monitor_read(void *opaque, const uint8_t *buf, int size)
3269
{
3270
    Monitor *old_mon = cur_mon;
3271
    int i;
3272

    
3273
    cur_mon = opaque;
3274

    
3275
    if (cur_mon->rs) {
3276
        for (i = 0; i < size; i++)
3277
            readline_handle_byte(cur_mon->rs, buf[i]);
3278
    } else {
3279
        if (size == 0 || buf[size - 1] != 0)
3280
            monitor_printf(cur_mon, "corrupted command\n");
3281
        else
3282
            monitor_handle_command(cur_mon, (char *)buf);
3283
    }
3284

    
3285
    cur_mon = old_mon;
3286
}
3287

    
3288
static void monitor_command_cb(Monitor *mon, const char *cmdline, void *opaque)
3289
{
3290
    monitor_suspend(mon);
3291
    monitor_handle_command(mon, cmdline);
3292
    monitor_resume(mon);
3293
}
3294

    
3295
int monitor_suspend(Monitor *mon)
3296
{
3297
    if (!mon->rs)
3298
        return -ENOTTY;
3299
    mon->suspend_cnt++;
3300
    return 0;
3301
}
3302

    
3303
void monitor_resume(Monitor *mon)
3304
{
3305
    if (!mon->rs)
3306
        return;
3307
    if (--mon->suspend_cnt == 0)
3308
        readline_show_prompt(mon->rs);
3309
}
3310

    
3311
static void monitor_event(void *opaque, int event)
3312
{
3313
    Monitor *mon = opaque;
3314

    
3315
    switch (event) {
3316
    case CHR_EVENT_MUX_IN:
3317
        mon->mux_out = 0;
3318
        if (mon->reset_seen) {
3319
            readline_restart(mon->rs);
3320
            monitor_resume(mon);
3321
            monitor_flush(mon);
3322
        } else {
3323
            mon->suspend_cnt = 0;
3324
        }
3325
        break;
3326

    
3327
    case CHR_EVENT_MUX_OUT:
3328
        if (mon->reset_seen) {
3329
            if (mon->suspend_cnt == 0) {
3330
                monitor_printf(mon, "\n");
3331
            }
3332
            monitor_flush(mon);
3333
            monitor_suspend(mon);
3334
        } else {
3335
            mon->suspend_cnt++;
3336
        }
3337
        mon->mux_out = 1;
3338
        break;
3339

    
3340
    case CHR_EVENT_RESET:
3341
        monitor_printf(mon, "QEMU %s monitor - type 'help' for more "
3342
                       "information\n", QEMU_VERSION);
3343
        if (!mon->mux_out) {
3344
            readline_show_prompt(mon->rs);
3345
        }
3346
        mon->reset_seen = 1;
3347
        break;
3348
    }
3349
}
3350

    
3351

    
3352
/*
3353
 * Local variables:
3354
 *  c-indent-level: 4
3355
 *  c-basic-offset: 4
3356
 *  tab-width: 8
3357
 * End:
3358
 */
3359

    
3360
void monitor_init(CharDriverState *chr, int flags)
3361
{
3362
    static int is_first_init = 1;
3363
    Monitor *mon;
3364

    
3365
    if (is_first_init) {
3366
        key_timer = qemu_new_timer(vm_clock, release_keys, NULL);
3367
        is_first_init = 0;
3368
    }
3369

    
3370
    mon = qemu_mallocz(sizeof(*mon));
3371

    
3372
    mon->chr = chr;
3373
    mon->flags = flags;
3374
    if (flags & MONITOR_USE_READLINE) {
3375
        mon->rs = readline_init(mon, monitor_find_completion);
3376
        monitor_read_command(mon, 0);
3377
    }
3378

    
3379
    qemu_chr_add_handlers(chr, monitor_can_read, monitor_read, monitor_event,
3380
                          mon);
3381

    
3382
    QLIST_INSERT_HEAD(&mon_list, mon, entry);
3383
    if (!cur_mon || (flags & MONITOR_IS_DEFAULT))
3384
        cur_mon = mon;
3385
}
3386

    
3387
static void bdrv_password_cb(Monitor *mon, const char *password, void *opaque)
3388
{
3389
    BlockDriverState *bs = opaque;
3390
    int ret = 0;
3391

    
3392
    if (bdrv_set_key(bs, password) != 0) {
3393
        monitor_printf(mon, "invalid password\n");
3394
        ret = -EPERM;
3395
    }
3396
    if (mon->password_completion_cb)
3397
        mon->password_completion_cb(mon->password_opaque, ret);
3398

    
3399
    monitor_read_command(mon, 1);
3400
}
3401

    
3402
void monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs,
3403
                                 BlockDriverCompletionFunc *completion_cb,
3404
                                 void *opaque)
3405
{
3406
    int err;
3407

    
3408
    if (!bdrv_key_required(bs)) {
3409
        if (completion_cb)
3410
            completion_cb(opaque, 0);
3411
        return;
3412
    }
3413

    
3414
    monitor_printf(mon, "%s (%s) is encrypted.\n", bdrv_get_device_name(bs),
3415
                   bdrv_get_encrypted_filename(bs));
3416

    
3417
    mon->password_completion_cb = completion_cb;
3418
    mon->password_opaque = opaque;
3419

    
3420
    err = monitor_read_password(mon, bdrv_password_cb, bs);
3421

    
3422
    if (err && completion_cb)
3423
        completion_cb(opaque, err);
3424
}
3425

    
3426
typedef struct QemuErrorSink QemuErrorSink;
3427
struct QemuErrorSink {
3428
    enum {
3429
        ERR_SINK_FILE,
3430
        ERR_SINK_MONITOR,
3431
    } dest;
3432
    union {
3433
        FILE    *fp;
3434
        Monitor *mon;
3435
    };
3436
    QemuErrorSink *previous;
3437
};
3438

    
3439
static QemuErrorSink *qemu_error_sink;
3440

    
3441
void qemu_errors_to_file(FILE *fp)
3442
{
3443
    QemuErrorSink *sink;
3444

    
3445
    sink = qemu_mallocz(sizeof(*sink));
3446
    sink->dest = ERR_SINK_FILE;
3447
    sink->fp = fp;
3448
    sink->previous = qemu_error_sink;
3449
    qemu_error_sink = sink;
3450
}
3451

    
3452
void qemu_errors_to_mon(Monitor *mon)
3453
{
3454
    QemuErrorSink *sink;
3455

    
3456
    sink = qemu_mallocz(sizeof(*sink));
3457
    sink->dest = ERR_SINK_MONITOR;
3458
    sink->mon = mon;
3459
    sink->previous = qemu_error_sink;
3460
    qemu_error_sink = sink;
3461
}
3462

    
3463
void qemu_errors_to_previous(void)
3464
{
3465
    QemuErrorSink *sink;
3466

    
3467
    assert(qemu_error_sink != NULL);
3468
    sink = qemu_error_sink;
3469
    qemu_error_sink = sink->previous;
3470
    qemu_free(sink);
3471
}
3472

    
3473
void qemu_error(const char *fmt, ...)
3474
{
3475
    va_list args;
3476

    
3477
    assert(qemu_error_sink != NULL);
3478
    switch (qemu_error_sink->dest) {
3479
    case ERR_SINK_FILE:
3480
        va_start(args, fmt);
3481
        vfprintf(qemu_error_sink->fp, fmt, args);
3482
        va_end(args);
3483
        break;
3484
    case ERR_SINK_MONITOR:
3485
        va_start(args, fmt);
3486
        monitor_vprintf(qemu_error_sink->mon, fmt, args);
3487
        va_end(args);
3488
        break;
3489
    }
3490
}