Statistics
| Branch: | Revision:

root / monitor.c @ 12a4b2aa

History | View | Annotate | Download (65.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 "vl.h"
25
#include "disas.h"
26
#include <dirent.h>
27

    
28
//#define DEBUG
29
//#define DEBUG_COMPLETION
30

    
31
#ifndef offsetof
32
#define offsetof(type, field) ((size_t) &((type *)0)->field)
33
#endif
34

    
35
/*
36
 * Supported types:
37
 * 
38
 * 'F'          filename
39
 * 'B'          block device name
40
 * 's'          string (accept optional quote)
41
 * 'i'          32 bit integer
42
 * 'l'          target long (32 or 64 bit)
43
 * '/'          optional gdb-like print format (like "/10x")
44
 *
45
 * '?'          optional type (for 'F', 's' and 'i')
46
 *
47
 */
48

    
49
typedef struct term_cmd_t {
50
    const char *name;
51
    const char *args_type;
52
    void (*handler)();
53
    const char *params;
54
    const char *help;
55
} term_cmd_t;
56

    
57
#define MAX_MON 4
58
static CharDriverState *monitor_hd[MAX_MON];
59
static int hide_banner;
60

    
61
static term_cmd_t term_cmds[];
62
static term_cmd_t info_cmds[];
63

    
64
static char term_outbuf[1024];
65
static int term_outbuf_index;
66

    
67
static void monitor_start_input(void);
68

    
69
CPUState *mon_cpu = NULL;
70

    
71
void term_flush(void)
72
{
73
    int i;
74
    if (term_outbuf_index > 0) {
75
        for (i = 0; i < MAX_MON; i++)
76
            if (monitor_hd[i] && monitor_hd[i]->focus == 0)
77
                qemu_chr_write(monitor_hd[i], term_outbuf, term_outbuf_index);
78
        term_outbuf_index = 0;
79
    }
80
}
81

    
82
/* flush at every end of line or if the buffer is full */
83
void term_puts(const char *str)
84
{
85
    int c;
86
    for(;;) {
87
        c = *str++;
88
        if (c == '\0')
89
            break;
90
        if (c == '\n')
91
            term_outbuf[term_outbuf_index++] = '\r';
92
        term_outbuf[term_outbuf_index++] = c;
93
        if (term_outbuf_index >= (sizeof(term_outbuf) - 1) ||
94
            c == '\n')
95
            term_flush();
96
    }
97
}
98

    
99
void term_vprintf(const char *fmt, va_list ap)
100
{
101
    char buf[4096];
102
    vsnprintf(buf, sizeof(buf), fmt, ap);
103
    term_puts(buf);
104
}
105

    
106
void term_printf(const char *fmt, ...)
107
{
108
    va_list ap;
109
    va_start(ap, fmt);
110
    term_vprintf(fmt, ap);
111
    va_end(ap);
112
}
113

    
114
void term_print_filename(const char *filename)
115
{
116
    int i;
117

    
118
    for (i = 0; filename[i]; i++) {
119
        switch (filename[i]) {
120
        case ' ':
121
        case '"':
122
        case '\\':
123
            term_printf("\\%c", filename[i]);
124
            break;
125
        case '\t':
126
            term_printf("\\t");
127
            break;
128
        case '\r':
129
            term_printf("\\r");
130
            break;
131
        case '\n':
132
            term_printf("\\n");
133
            break;
134
        default:
135
            term_printf("%c", filename[i]);
136
            break;
137
        }
138
    }
139
}
140

    
141
static int monitor_fprintf(FILE *stream, const char *fmt, ...)
142
{
143
    va_list ap;
144
    va_start(ap, fmt);
145
    term_vprintf(fmt, ap);
146
    va_end(ap);
147
    return 0;
148
}
149

    
150
static int compare_cmd(const char *name, const char *list)
151
{
152
    const char *p, *pstart;
153
    int len;
154
    len = strlen(name);
155
    p = list;
156
    for(;;) {
157
        pstart = p;
158
        p = strchr(p, '|');
159
        if (!p)
160
            p = pstart + strlen(pstart);
161
        if ((p - pstart) == len && !memcmp(pstart, name, len))
162
            return 1;
163
        if (*p == '\0')
164
            break;
165
        p++;
166
    }
167
    return 0;
168
}
169

    
170
static void help_cmd1(term_cmd_t *cmds, const char *prefix, const char *name)
171
{
172
    term_cmd_t *cmd;
173

    
174
    for(cmd = cmds; cmd->name != NULL; cmd++) {
175
        if (!name || !strcmp(name, cmd->name))
176
            term_printf("%s%s %s -- %s\n", prefix, cmd->name, cmd->params, cmd->help);
177
    }
178
}
179

    
180
static void help_cmd(const char *name)
181
{
182
    if (name && !strcmp(name, "info")) {
183
        help_cmd1(info_cmds, "info ", NULL);
184
    } else {
185
        help_cmd1(term_cmds, "", name);
186
        if (name && !strcmp(name, "log")) {
187
            CPULogItem *item;
188
            term_printf("Log items (comma separated):\n");
189
            term_printf("%-10s %s\n", "none", "remove all logs");
190
            for(item = cpu_log_items; item->mask != 0; item++) {
191
                term_printf("%-10s %s\n", item->name, item->help);
192
            }
193
        }
194
    }
195
}
196

    
197
static void do_help(const char *name)
198
{
199
    help_cmd(name);
200
}
201

    
202
static void do_commit(const char *device)
203
{
204
    int i, all_devices;
205

    
206
    all_devices = !strcmp(device, "all");
207
    for (i = 0; i < MAX_DISKS; i++) {
208
        if (bs_table[i]) {
209
            if (all_devices || 
210
                !strcmp(bdrv_get_device_name(bs_table[i]), device))
211
                bdrv_commit(bs_table[i]);
212
        }
213
    }
214
    if (mtd_bdrv)
215
        if (all_devices || !strcmp(bdrv_get_device_name(mtd_bdrv), device))
216
            bdrv_commit(mtd_bdrv);
217
}
218

    
219
static void do_info(const char *item)
220
{
221
    term_cmd_t *cmd;
222

    
223
    if (!item)
224
        goto help;
225
    for(cmd = info_cmds; cmd->name != NULL; cmd++) {
226
        if (compare_cmd(item, cmd->name)) 
227
            goto found;
228
    }
229
 help:
230
    help_cmd("info");
231
    return;
232
 found:
233
    cmd->handler();
234
}
235

    
236
static void do_info_version(void)
237
{
238
  term_printf("%s\n", QEMU_VERSION);
239
}
240

    
241
static void do_info_name(void)
242
{
243
    if (qemu_name)
244
        term_printf("%s\n", qemu_name);
245
}
246

    
247
static void do_info_block(void)
248
{
249
    bdrv_info();
250
}
251

    
252
/* get the current CPU defined by the user */
253
int mon_set_cpu(int cpu_index)
254
{
255
    CPUState *env;
256

    
257
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
258
        if (env->cpu_index == cpu_index) {
259
            mon_cpu = env;
260
            return 0;
261
        }
262
    }
263
    return -1;
264
}
265

    
266
CPUState *mon_get_cpu(void)
267
{
268
    if (!mon_cpu) {
269
        mon_set_cpu(0);
270
    }
271
    return mon_cpu;
272
}
273

    
274
static void do_info_registers(void)
275
{
276
    CPUState *env;
277
    env = mon_get_cpu();
278
    if (!env)
279
        return;
280
#ifdef TARGET_I386
281
    cpu_dump_state(env, NULL, monitor_fprintf,
282
                   X86_DUMP_FPU);
283
#else
284
    cpu_dump_state(env, NULL, monitor_fprintf, 
285
                   0);
286
#endif
287
}
288

    
289
static void do_info_cpus(void)
290
{
291
    CPUState *env;
292

    
293
    /* just to set the default cpu if not already done */
294
    mon_get_cpu();
295

    
296
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
297
        term_printf("%c CPU #%d:", 
298
                    (env == mon_cpu) ? '*' : ' ',
299
                    env->cpu_index);
300
#if defined(TARGET_I386)
301
        term_printf(" pc=0x" TARGET_FMT_lx, env->eip + env->segs[R_CS].base);
302
        if (env->hflags & HF_HALTED_MASK)
303
            term_printf(" (halted)");
304
#elif defined(TARGET_PPC)
305
        term_printf(" nip=0x" TARGET_FMT_lx, env->nip);
306
        if (env->halted)
307
            term_printf(" (halted)");
308
#elif defined(TARGET_SPARC)
309
        term_printf(" pc=0x" TARGET_FMT_lx " npc=0x" TARGET_FMT_lx, env->pc, env->npc);
310
        if (env->halted)
311
            term_printf(" (halted)");
312
#endif
313
        term_printf("\n");
314
    }
315
}
316

    
317
static void do_cpu_set(int index)
318
{
319
    if (mon_set_cpu(index) < 0)
320
        term_printf("Invalid CPU index\n");
321
}
322

    
323
static void do_info_jit(void)
324
{
325
    dump_exec_info(NULL, monitor_fprintf);
326
}
327

    
328
static void do_info_history (void)
329
{
330
    int i;
331
    const char *str;
332
    
333
    i = 0;
334
    for(;;) {
335
        str = readline_get_history(i);
336
        if (!str)
337
            break;
338
        term_printf("%d: '%s'\n", i, str);
339
        i++;
340
    }
341
}
342

    
343
#if defined(TARGET_PPC)
344
/* XXX: not implemented in other targets */
345
static void do_info_cpu_stats (void)
346
{
347
    CPUState *env;
348

    
349
    env = mon_get_cpu();
350
    cpu_dump_statistics(env, NULL, &monitor_fprintf, 0);
351
}
352
#endif
353

    
354
static void do_quit(void)
355
{
356
    exit(0);
357
}
358

    
359
static int eject_device(BlockDriverState *bs, int force)
360
{
361
    if (bdrv_is_inserted(bs)) {
362
        if (!force) {
363
            if (!bdrv_is_removable(bs)) {
364
                term_printf("device is not removable\n");
365
                return -1;
366
            }
367
            if (bdrv_is_locked(bs)) {
368
                term_printf("device is locked\n");
369
                return -1;
370
            }
371
        }
372
        bdrv_close(bs);
373
    }
374
    return 0;
375
}
376

    
377
static void do_eject(int force, const char *filename)
378
{
379
    BlockDriverState *bs;
380

    
381
    bs = bdrv_find(filename);
382
    if (!bs) {
383
        term_printf("device not found\n");
384
        return;
385
    }
386
    eject_device(bs, force);
387
}
388

    
389
static void do_change(const char *device, const char *filename)
390
{
391
    BlockDriverState *bs;
392

    
393
    bs = bdrv_find(device);
394
    if (!bs) {
395
        term_printf("device not found\n");
396
        return;
397
    }
398
    if (eject_device(bs, 0) < 0)
399
        return;
400
    bdrv_open(bs, filename, 0);
401
    qemu_key_check(bs, filename);
402
}
403

    
404
static void do_screen_dump(const char *filename)
405
{
406
    vga_hw_screen_dump(filename);
407
}
408

    
409
static void do_log(const char *items)
410
{
411
    int mask;
412
    
413
    if (!strcmp(items, "none")) {
414
        mask = 0;
415
    } else {
416
        mask = cpu_str_to_log_mask(items);
417
        if (!mask) {
418
            help_cmd("log");
419
            return;
420
        }
421
    }
422
    cpu_set_log(mask);
423
}
424

    
425
static void do_stop(void)
426
{
427
    vm_stop(EXCP_INTERRUPT);
428
}
429

    
430
static void do_cont(void)
431
{
432
    vm_start();
433
}
434

    
435
#ifdef CONFIG_GDBSTUB
436
static void do_gdbserver(const char *port)
437
{
438
    if (!port)
439
        port = DEFAULT_GDBSTUB_PORT;
440
    if (gdbserver_start(port) < 0) {
441
        qemu_printf("Could not open gdbserver socket on port '%s'\n", port);
442
    } else {
443
        qemu_printf("Waiting gdb connection on port '%s'\n", port);
444
    }
445
}
446
#endif
447

    
448
static void term_printc(int c)
449
{
450
    term_printf("'");
451
    switch(c) {
452
    case '\'':
453
        term_printf("\\'");
454
        break;
455
    case '\\':
456
        term_printf("\\\\");
457
        break;
458
    case '\n':
459
        term_printf("\\n");
460
        break;
461
    case '\r':
462
        term_printf("\\r");
463
        break;
464
    default:
465
        if (c >= 32 && c <= 126) {
466
            term_printf("%c", c);
467
        } else {
468
            term_printf("\\x%02x", c);
469
        }
470
        break;
471
    }
472
    term_printf("'");
473
}
474

    
475
static void memory_dump(int count, int format, int wsize, 
476
                        target_ulong addr, int is_physical)
477
{
478
    CPUState *env;
479
    int nb_per_line, l, line_size, i, max_digits, len;
480
    uint8_t buf[16];
481
    uint64_t v;
482

    
483
    if (format == 'i') {
484
        int flags;
485
        flags = 0;
486
        env = mon_get_cpu();
487
        if (!env && !is_physical)
488
            return;
489
#ifdef TARGET_I386
490
        if (wsize == 2) {
491
            flags = 1;
492
        } else if (wsize == 4) {
493
            flags = 0;
494
        } else {
495
            /* as default we use the current CS size */
496
            flags = 0;
497
            if (env) {
498
#ifdef TARGET_X86_64
499
                if ((env->efer & MSR_EFER_LMA) && 
500
                    (env->segs[R_CS].flags & DESC_L_MASK))
501
                    flags = 2;
502
                else
503
#endif
504
                if (!(env->segs[R_CS].flags & DESC_B_MASK))
505
                    flags = 1;
506
            }
507
        }
508
#endif
509
        monitor_disas(env, addr, count, is_physical, flags);
510
        return;
511
    }
512

    
513
    len = wsize * count;
514
    if (wsize == 1)
515
        line_size = 8;
516
    else
517
        line_size = 16;
518
    nb_per_line = line_size / wsize;
519
    max_digits = 0;
520

    
521
    switch(format) {
522
    case 'o':
523
        max_digits = (wsize * 8 + 2) / 3;
524
        break;
525
    default:
526
    case 'x':
527
        max_digits = (wsize * 8) / 4;
528
        break;
529
    case 'u':
530
    case 'd':
531
        max_digits = (wsize * 8 * 10 + 32) / 33;
532
        break;
533
    case 'c':
534
        wsize = 1;
535
        break;
536
    }
537

    
538
    while (len > 0) {
539
        term_printf(TARGET_FMT_lx ":", addr);
540
        l = len;
541
        if (l > line_size)
542
            l = line_size;
543
        if (is_physical) {
544
            cpu_physical_memory_rw(addr, buf, l, 0);
545
        } else {
546
            env = mon_get_cpu();
547
            if (!env)
548
                break;
549
            cpu_memory_rw_debug(env, addr, buf, l, 0);
550
        }
551
        i = 0; 
552
        while (i < l) {
553
            switch(wsize) {
554
            default:
555
            case 1:
556
                v = ldub_raw(buf + i);
557
                break;
558
            case 2:
559
                v = lduw_raw(buf + i);
560
                break;
561
            case 4:
562
                v = (uint32_t)ldl_raw(buf + i);
563
                break;
564
            case 8:
565
                v = ldq_raw(buf + i);
566
                break;
567
            }
568
            term_printf(" ");
569
            switch(format) {
570
            case 'o':
571
                term_printf("%#*" PRIo64, max_digits, v);
572
                break;
573
            case 'x':
574
                term_printf("0x%0*" PRIx64, max_digits, v);
575
                break;
576
            case 'u':
577
                term_printf("%*" PRIu64, max_digits, v);
578
                break;
579
            case 'd':
580
                term_printf("%*" PRId64, max_digits, v);
581
                break;
582
            case 'c':
583
                term_printc(v);
584
                break;
585
            }
586
            i += wsize;
587
        }
588
        term_printf("\n");
589
        addr += l;
590
        len -= l;
591
    }
592
}
593

    
594
#if TARGET_LONG_BITS == 64
595
#define GET_TLONG(h, l) (((uint64_t)(h) << 32) | (l))
596
#else
597
#define GET_TLONG(h, l) (l)
598
#endif
599

    
600
static void do_memory_dump(int count, int format, int size, 
601
                           uint32_t addrh, uint32_t addrl)
602
{
603
    target_long addr = GET_TLONG(addrh, addrl);
604
    memory_dump(count, format, size, addr, 0);
605
}
606

    
607
static void do_physical_memory_dump(int count, int format, int size,
608
                                    uint32_t addrh, uint32_t addrl)
609

    
610
{
611
    target_long addr = GET_TLONG(addrh, addrl);
612
    memory_dump(count, format, size, addr, 1);
613
}
614

    
615
static void do_print(int count, int format, int size, unsigned int valh, unsigned int vall)
616
{
617
    target_long val = GET_TLONG(valh, vall);
618
#if TARGET_LONG_BITS == 32
619
    switch(format) {
620
    case 'o':
621
        term_printf("%#o", val);
622
        break;
623
    case 'x':
624
        term_printf("%#x", val);
625
        break;
626
    case 'u':
627
        term_printf("%u", val);
628
        break;
629
    default:
630
    case 'd':
631
        term_printf("%d", val);
632
        break;
633
    case 'c':
634
        term_printc(val);
635
        break;
636
    }
637
#else
638
    switch(format) {
639
    case 'o':
640
        term_printf("%#" PRIo64, val);
641
        break;
642
    case 'x':
643
        term_printf("%#" PRIx64, val);
644
        break;
645
    case 'u':
646
        term_printf("%" PRIu64, val);
647
        break;
648
    default:
649
    case 'd':
650
        term_printf("%" PRId64, val);
651
        break;
652
    case 'c':
653
        term_printc(val);
654
        break;
655
    }
656
#endif
657
    term_printf("\n");
658
}
659

    
660
static void do_memory_save(unsigned int valh, unsigned int vall, 
661
                           uint32_t size, const char *filename)
662
{
663
    FILE *f;
664
    target_long addr = GET_TLONG(valh, vall);
665
    uint32_t l;
666
    CPUState *env;
667
    uint8_t buf[1024];
668

    
669
    env = mon_get_cpu();
670
    if (!env)
671
        return;
672

    
673
    f = fopen(filename, "wb");
674
    if (!f) {
675
        term_printf("could not open '%s'\n", filename);
676
        return;
677
    }
678
    while (size != 0) {
679
        l = sizeof(buf);
680
        if (l > size)
681
            l = size;
682
        cpu_memory_rw_debug(env, addr, buf, l, 0);
683
        fwrite(buf, 1, l, f);
684
        addr += l;
685
        size -= l;
686
    }
687
    fclose(f);
688
}
689

    
690
static void do_sum(uint32_t start, uint32_t size)
691
{
692
    uint32_t addr;
693
    uint8_t buf[1];
694
    uint16_t sum;
695

    
696
    sum = 0;
697
    for(addr = start; addr < (start + size); addr++) {
698
        cpu_physical_memory_rw(addr, buf, 1, 0);
699
        /* BSD sum algorithm ('sum' Unix command) */
700
        sum = (sum >> 1) | (sum << 15);
701
        sum += buf[0];
702
    }
703
    term_printf("%05d\n", sum);
704
}
705

    
706
typedef struct {
707
    int keycode;
708
    const char *name;
709
} KeyDef;
710

    
711
static const KeyDef key_defs[] = {
712
    { 0x2a, "shift" },
713
    { 0x36, "shift_r" },
714
    
715
    { 0x38, "alt" },
716
    { 0xb8, "alt_r" },
717
    { 0x1d, "ctrl" },
718
    { 0x9d, "ctrl_r" },
719

    
720
    { 0xdd, "menu" },
721

    
722
    { 0x01, "esc" },
723

    
724
    { 0x02, "1" },
725
    { 0x03, "2" },
726
    { 0x04, "3" },
727
    { 0x05, "4" },
728
    { 0x06, "5" },
729
    { 0x07, "6" },
730
    { 0x08, "7" },
731
    { 0x09, "8" },
732
    { 0x0a, "9" },
733
    { 0x0b, "0" },
734
    { 0x0c, "minus" },
735
    { 0x0d, "equal" },
736
    { 0x0e, "backspace" },
737

    
738
    { 0x0f, "tab" },
739
    { 0x10, "q" },
740
    { 0x11, "w" },
741
    { 0x12, "e" },
742
    { 0x13, "r" },
743
    { 0x14, "t" },
744
    { 0x15, "y" },
745
    { 0x16, "u" },
746
    { 0x17, "i" },
747
    { 0x18, "o" },
748
    { 0x19, "p" },
749

    
750
    { 0x1c, "ret" },
751

    
752
    { 0x1e, "a" },
753
    { 0x1f, "s" },
754
    { 0x20, "d" },
755
    { 0x21, "f" },
756
    { 0x22, "g" },
757
    { 0x23, "h" },
758
    { 0x24, "j" },
759
    { 0x25, "k" },
760
    { 0x26, "l" },
761

    
762
    { 0x2c, "z" },
763
    { 0x2d, "x" },
764
    { 0x2e, "c" },
765
    { 0x2f, "v" },
766
    { 0x30, "b" },
767
    { 0x31, "n" },
768
    { 0x32, "m" },
769
    
770
    { 0x39, "spc" },
771
    { 0x3a, "caps_lock" },
772
    { 0x3b, "f1" },
773
    { 0x3c, "f2" },
774
    { 0x3d, "f3" },
775
    { 0x3e, "f4" },
776
    { 0x3f, "f5" },
777
    { 0x40, "f6" },
778
    { 0x41, "f7" },
779
    { 0x42, "f8" },
780
    { 0x43, "f9" },
781
    { 0x44, "f10" },
782
    { 0x45, "num_lock" },
783
    { 0x46, "scroll_lock" },
784

    
785
    { 0xb5, "kp_divide" },
786
    { 0x37, "kp_multiply" },
787
    { 0x4a, "kp_substract" },
788
    { 0x4e, "kp_add" },
789
    { 0x9c, "kp_enter" },
790
    { 0x53, "kp_decimal" },
791

    
792
    { 0x52, "kp_0" },
793
    { 0x4f, "kp_1" },
794
    { 0x50, "kp_2" },
795
    { 0x51, "kp_3" },
796
    { 0x4b, "kp_4" },
797
    { 0x4c, "kp_5" },
798
    { 0x4d, "kp_6" },
799
    { 0x47, "kp_7" },
800
    { 0x48, "kp_8" },
801
    { 0x49, "kp_9" },
802
    
803
    { 0x56, "<" },
804

    
805
    { 0x57, "f11" },
806
    { 0x58, "f12" },
807

    
808
    { 0xb7, "print" },
809

    
810
    { 0xc7, "home" },
811
    { 0xc9, "pgup" },
812
    { 0xd1, "pgdn" },
813
    { 0xcf, "end" },
814

    
815
    { 0xcb, "left" },
816
    { 0xc8, "up" },
817
    { 0xd0, "down" },
818
    { 0xcd, "right" },
819

    
820
    { 0xd2, "insert" },
821
    { 0xd3, "delete" },
822
    { 0, NULL },
823
};
824

    
825
static int get_keycode(const char *key)
826
{
827
    const KeyDef *p;
828
    char *endp;
829
    int ret;
830

    
831
    for(p = key_defs; p->name != NULL; p++) {
832
        if (!strcmp(key, p->name))
833
            return p->keycode;
834
    }
835
    if (strstart(key, "0x", NULL)) {
836
        ret = strtoul(key, &endp, 0);
837
        if (*endp == '\0' && ret >= 0x01 && ret <= 0xff)
838
            return ret;
839
    }
840
    return -1;
841
}
842

    
843
static void do_send_key(const char *string)
844
{
845
    char keybuf[16], *q;
846
    uint8_t keycodes[16];
847
    const char *p;
848
    int nb_keycodes, keycode, i;
849
    
850
    nb_keycodes = 0;
851
    p = string;
852
    while (*p != '\0') {
853
        q = keybuf;
854
        while (*p != '\0' && *p != '-') {
855
            if ((q - keybuf) < sizeof(keybuf) - 1) {
856
                *q++ = *p;
857
            }
858
            p++;
859
        }
860
        *q = '\0';
861
        keycode = get_keycode(keybuf);
862
        if (keycode < 0) {
863
            term_printf("unknown key: '%s'\n", keybuf);
864
            return;
865
        }
866
        keycodes[nb_keycodes++] = keycode;
867
        if (*p == '\0')
868
            break;
869
        p++;
870
    }
871
    /* key down events */
872
    for(i = 0; i < nb_keycodes; i++) {
873
        keycode = keycodes[i];
874
        if (keycode & 0x80)
875
            kbd_put_keycode(0xe0);
876
        kbd_put_keycode(keycode & 0x7f);
877
    }
878
    /* key up events */
879
    for(i = nb_keycodes - 1; i >= 0; i--) {
880
        keycode = keycodes[i];
881
        if (keycode & 0x80)
882
            kbd_put_keycode(0xe0);
883
        kbd_put_keycode(keycode | 0x80);
884
    }
885
}
886

    
887
static int mouse_button_state;
888

    
889
static void do_mouse_move(const char *dx_str, const char *dy_str, 
890
                          const char *dz_str)
891
{
892
    int dx, dy, dz;
893
    dx = strtol(dx_str, NULL, 0);
894
    dy = strtol(dy_str, NULL, 0);
895
    dz = 0;
896
    if (dz_str) 
897
        dz = strtol(dz_str, NULL, 0);
898
    kbd_mouse_event(dx, dy, dz, mouse_button_state);
899
}
900

    
901
static void do_mouse_button(int button_state)
902
{
903
    mouse_button_state = button_state;
904
    kbd_mouse_event(0, 0, 0, mouse_button_state);
905
}
906

    
907
static void do_ioport_read(int count, int format, int size, int addr, int has_index, int index)
908
{
909
    uint32_t val;
910
    int suffix;
911

    
912
    if (has_index) {
913
        cpu_outb(NULL, addr & 0xffff, index & 0xff);
914
        addr++;
915
    }
916
    addr &= 0xffff;
917

    
918
    switch(size) {
919
    default:
920
    case 1:
921
        val = cpu_inb(NULL, addr);
922
        suffix = 'b';
923
        break;
924
    case 2:
925
        val = cpu_inw(NULL, addr);
926
        suffix = 'w';
927
        break;
928
    case 4:
929
        val = cpu_inl(NULL, addr);
930
        suffix = 'l';
931
        break;
932
    }
933
    term_printf("port%c[0x%04x] = %#0*x\n",
934
                suffix, addr, size * 2, val);
935
}
936

    
937
static void do_system_reset(void)
938
{
939
    qemu_system_reset_request();
940
}
941

    
942
static void do_system_powerdown(void)
943
{
944
    qemu_system_powerdown_request();
945
}
946

    
947
#if defined(TARGET_I386)
948
static void print_pte(uint32_t addr, uint32_t pte, uint32_t mask)
949
{
950
    term_printf("%08x: %08x %c%c%c%c%c%c%c%c\n", 
951
                addr,
952
                pte & mask,
953
                pte & PG_GLOBAL_MASK ? 'G' : '-',
954
                pte & PG_PSE_MASK ? 'P' : '-',
955
                pte & PG_DIRTY_MASK ? 'D' : '-',
956
                pte & PG_ACCESSED_MASK ? 'A' : '-',
957
                pte & PG_PCD_MASK ? 'C' : '-',
958
                pte & PG_PWT_MASK ? 'T' : '-',
959
                pte & PG_USER_MASK ? 'U' : '-',
960
                pte & PG_RW_MASK ? 'W' : '-');
961
}
962

    
963
static void tlb_info(void)
964
{
965
    CPUState *env;
966
    int l1, l2;
967
    uint32_t pgd, pde, pte;
968

    
969
    env = mon_get_cpu();
970
    if (!env)
971
        return;
972

    
973
    if (!(env->cr[0] & CR0_PG_MASK)) {
974
        term_printf("PG disabled\n");
975
        return;
976
    }
977
    pgd = env->cr[3] & ~0xfff;
978
    for(l1 = 0; l1 < 1024; l1++) {
979
        cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4);
980
        pde = le32_to_cpu(pde);
981
        if (pde & PG_PRESENT_MASK) {
982
            if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
983
                print_pte((l1 << 22), pde, ~((1 << 20) - 1));
984
            } else {
985
                for(l2 = 0; l2 < 1024; l2++) {
986
                    cpu_physical_memory_read((pde & ~0xfff) + l2 * 4, 
987
                                             (uint8_t *)&pte, 4);
988
                    pte = le32_to_cpu(pte);
989
                    if (pte & PG_PRESENT_MASK) {
990
                        print_pte((l1 << 22) + (l2 << 12), 
991
                                  pte & ~PG_PSE_MASK, 
992
                                  ~0xfff);
993
                    }
994
                }
995
            }
996
        }
997
    }
998
}
999

    
1000
static void mem_print(uint32_t *pstart, int *plast_prot, 
1001
                      uint32_t end, int prot)
1002
{
1003
    int prot1;
1004
    prot1 = *plast_prot;
1005
    if (prot != prot1) {
1006
        if (*pstart != -1) {
1007
            term_printf("%08x-%08x %08x %c%c%c\n",
1008
                        *pstart, end, end - *pstart, 
1009
                        prot1 & PG_USER_MASK ? 'u' : '-',
1010
                        'r',
1011
                        prot1 & PG_RW_MASK ? 'w' : '-');
1012
        }
1013
        if (prot != 0)
1014
            *pstart = end;
1015
        else
1016
            *pstart = -1;
1017
        *plast_prot = prot;
1018
    }
1019
}
1020

    
1021
static void mem_info(void)
1022
{
1023
    CPUState *env;
1024
    int l1, l2, prot, last_prot;
1025
    uint32_t pgd, pde, pte, start, end;
1026

    
1027
    env = mon_get_cpu();
1028
    if (!env)
1029
        return;
1030

    
1031
    if (!(env->cr[0] & CR0_PG_MASK)) {
1032
        term_printf("PG disabled\n");
1033
        return;
1034
    }
1035
    pgd = env->cr[3] & ~0xfff;
1036
    last_prot = 0;
1037
    start = -1;
1038
    for(l1 = 0; l1 < 1024; l1++) {
1039
        cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4);
1040
        pde = le32_to_cpu(pde);
1041
        end = l1 << 22;
1042
        if (pde & PG_PRESENT_MASK) {
1043
            if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
1044
                prot = pde & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
1045
                mem_print(&start, &last_prot, end, prot);
1046
            } else {
1047
                for(l2 = 0; l2 < 1024; l2++) {
1048
                    cpu_physical_memory_read((pde & ~0xfff) + l2 * 4, 
1049
                                             (uint8_t *)&pte, 4);
1050
                    pte = le32_to_cpu(pte);
1051
                    end = (l1 << 22) + (l2 << 12);
1052
                    if (pte & PG_PRESENT_MASK) {
1053
                        prot = pte & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
1054
                    } else {
1055
                        prot = 0;
1056
                    }
1057
                    mem_print(&start, &last_prot, end, prot);
1058
                }
1059
            }
1060
        } else {
1061
            prot = 0;
1062
            mem_print(&start, &last_prot, end, prot);
1063
        }
1064
    }
1065
}
1066
#endif
1067

    
1068
static void do_info_kqemu(void)
1069
{
1070
#ifdef USE_KQEMU
1071
    CPUState *env;
1072
    int val;
1073
    val = 0;
1074
    env = mon_get_cpu();
1075
    if (!env) {
1076
        term_printf("No cpu initialized yet");
1077
        return;
1078
    }
1079
    val = env->kqemu_enabled;
1080
    term_printf("kqemu support: ");
1081
    switch(val) {
1082
    default:
1083
    case 0:
1084
        term_printf("disabled\n");
1085
        break;
1086
    case 1:
1087
        term_printf("enabled for user code\n");
1088
        break;
1089
    case 2:
1090
        term_printf("enabled for user and kernel code\n");
1091
        break;
1092
    }
1093
#else
1094
    term_printf("kqemu support: not compiled\n");
1095
#endif
1096
} 
1097

    
1098
#ifdef CONFIG_PROFILER
1099

    
1100
int64_t kqemu_time;
1101
int64_t qemu_time;
1102
int64_t kqemu_exec_count;
1103
int64_t dev_time;
1104
int64_t kqemu_ret_int_count;
1105
int64_t kqemu_ret_excp_count;
1106
int64_t kqemu_ret_intr_count;
1107

    
1108
static void do_info_profile(void)
1109
{
1110
    int64_t total;
1111
    total = qemu_time;
1112
    if (total == 0)
1113
        total = 1;
1114
    term_printf("async time  %" PRId64 " (%0.3f)\n",
1115
                dev_time, dev_time / (double)ticks_per_sec);
1116
    term_printf("qemu time   %" PRId64 " (%0.3f)\n",
1117
                qemu_time, qemu_time / (double)ticks_per_sec);
1118
    term_printf("kqemu time  %" PRId64 " (%0.3f %0.1f%%) count=%" PRId64 " int=%" PRId64 " excp=%" PRId64 " intr=%" PRId64 "\n",
1119
                kqemu_time, kqemu_time / (double)ticks_per_sec,
1120
                kqemu_time / (double)total * 100.0,
1121
                kqemu_exec_count,
1122
                kqemu_ret_int_count,
1123
                kqemu_ret_excp_count,
1124
                kqemu_ret_intr_count);
1125
    qemu_time = 0;
1126
    kqemu_time = 0;
1127
    kqemu_exec_count = 0;
1128
    dev_time = 0;
1129
    kqemu_ret_int_count = 0;
1130
    kqemu_ret_excp_count = 0;
1131
    kqemu_ret_intr_count = 0;
1132
#ifdef USE_KQEMU
1133
    kqemu_record_dump();
1134
#endif
1135
}
1136
#else
1137
static void do_info_profile(void)
1138
{
1139
    term_printf("Internal profiler not compiled\n");
1140
}
1141
#endif
1142

    
1143
/* Capture support */
1144
static LIST_HEAD (capture_list_head, CaptureState) capture_head;
1145

    
1146
static void do_info_capture (void)
1147
{
1148
    int i;
1149
    CaptureState *s;
1150

    
1151
    for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1152
        term_printf ("[%d]: ", i);
1153
        s->ops.info (s->opaque);
1154
    }
1155
}
1156

    
1157
static void do_stop_capture (int n)
1158
{
1159
    int i;
1160
    CaptureState *s;
1161

    
1162
    for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1163
        if (i == n) {
1164
            s->ops.destroy (s->opaque);
1165
            LIST_REMOVE (s, entries);
1166
            qemu_free (s);
1167
            return;
1168
        }
1169
    }
1170
}
1171

    
1172
#ifdef HAS_AUDIO
1173
int wav_start_capture (CaptureState *s, const char *path, int freq,
1174
                       int bits, int nchannels);
1175

    
1176
static void do_wav_capture (const char *path,
1177
                            int has_freq, int freq,
1178
                            int has_bits, int bits,
1179
                            int has_channels, int nchannels)
1180
{
1181
    CaptureState *s;
1182

    
1183
    s = qemu_mallocz (sizeof (*s));
1184
    if (!s) {
1185
        term_printf ("Not enough memory to add wave capture\n");
1186
        return;
1187
    }
1188

    
1189
    freq = has_freq ? freq : 44100;
1190
    bits = has_bits ? bits : 16;
1191
    nchannels = has_channels ? nchannels : 2;
1192

    
1193
    if (wav_start_capture (s, path, freq, bits, nchannels)) {
1194
        term_printf ("Faied to add wave capture\n");
1195
        qemu_free (s);
1196
    }
1197
    LIST_INSERT_HEAD (&capture_head, s, entries);
1198
}
1199
#endif
1200

    
1201
static term_cmd_t term_cmds[] = {
1202
    { "help|?", "s?", do_help, 
1203
      "[cmd]", "show the help" },
1204
    { "commit", "s", do_commit, 
1205
      "device|all", "commit changes to the disk images (if -snapshot is used) or backing files" },
1206
    { "info", "s?", do_info,
1207
      "subcommand", "show various information about the system state" },
1208
    { "q|quit", "", do_quit,
1209
      "", "quit the emulator" },
1210
    { "eject", "-fB", do_eject,
1211
      "[-f] device", "eject a removable medium (use -f to force it)" },
1212
    { "change", "BF", do_change,
1213
      "device filename", "change a removable medium" },
1214
    { "screendump", "F", do_screen_dump, 
1215
      "filename", "save screen into PPM image 'filename'" },
1216
    { "log", "s", do_log,
1217
      "item1[,...]", "activate logging of the specified items to '/tmp/qemu.log'" }, 
1218
    { "savevm", "s?", do_savevm,
1219
      "tag|id", "save a VM snapshot. If no tag or id are provided, a new snapshot is created" }, 
1220
    { "loadvm", "s", do_loadvm,
1221
      "tag|id", "restore a VM snapshot from its tag or id" }, 
1222
    { "delvm", "s", do_delvm,
1223
      "tag|id", "delete a VM snapshot from its tag or id" }, 
1224
    { "stop", "", do_stop, 
1225
      "", "stop emulation", },
1226
    { "c|cont", "", do_cont, 
1227
      "", "resume emulation", },
1228
#ifdef CONFIG_GDBSTUB
1229
    { "gdbserver", "s?", do_gdbserver, 
1230
      "[port]", "start gdbserver session (default port=1234)", },
1231
#endif
1232
    { "x", "/l", do_memory_dump, 
1233
      "/fmt addr", "virtual memory dump starting at 'addr'", },
1234
    { "xp", "/l", do_physical_memory_dump, 
1235
      "/fmt addr", "physical memory dump starting at 'addr'", },
1236
    { "p|print", "/l", do_print, 
1237
      "/fmt expr", "print expression value (use $reg for CPU register access)", },
1238
    { "i", "/ii.", do_ioport_read, 
1239
      "/fmt addr", "I/O port read" },
1240

    
1241
    { "sendkey", "s", do_send_key, 
1242
      "keys", "send keys to the VM (e.g. 'sendkey ctrl-alt-f1')" },
1243
    { "system_reset", "", do_system_reset, 
1244
      "", "reset the system" },
1245
    { "system_powerdown", "", do_system_powerdown, 
1246
      "", "send system power down event" },
1247
    { "sum", "ii", do_sum, 
1248
      "addr size", "compute the checksum of a memory region" },
1249
    { "usb_add", "s", do_usb_add,
1250
      "device", "add USB device (e.g. 'host:bus.addr' or 'host:vendor_id:product_id')" },
1251
    { "usb_del", "s", do_usb_del,
1252
      "device", "remove USB device 'bus.addr'" },
1253
    { "cpu", "i", do_cpu_set, 
1254
      "index", "set the default CPU" },
1255
    { "mouse_move", "sss?", do_mouse_move, 
1256
      "dx dy [dz]", "send mouse move events" },
1257
    { "mouse_button", "i", do_mouse_button, 
1258
      "state", "change mouse button state (1=L, 2=M, 4=R)" },
1259
    { "mouse_set", "i", do_mouse_set,
1260
      "index", "set which mouse device receives events" },
1261
#ifdef HAS_AUDIO
1262
    { "wavcapture", "si?i?i?", do_wav_capture,
1263
      "path [frequency bits channels]",
1264
      "capture audio to a wave file (default frequency=44100 bits=16 channels=2)" },
1265
#endif
1266
     { "stopcapture", "i", do_stop_capture,
1267
       "capture index", "stop capture" },
1268
    { "memsave", "lis", do_memory_save, 
1269
      "addr size file", "save to disk virtual memory dump starting at 'addr' of size 'size'", },
1270
    { NULL, NULL, }, 
1271
};
1272

    
1273
static term_cmd_t info_cmds[] = {
1274
    { "version", "", do_info_version,
1275
      "", "show the version of qemu" },
1276
    { "network", "", do_info_network,
1277
      "", "show the network state" },
1278
    { "block", "", do_info_block,
1279
      "", "show the block devices" },
1280
    { "registers", "", do_info_registers,
1281
      "", "show the cpu registers" },
1282
    { "cpus", "", do_info_cpus,
1283
      "", "show infos for each CPU" },
1284
    { "history", "", do_info_history,
1285
      "", "show the command line history", },
1286
    { "irq", "", irq_info,
1287
      "", "show the interrupts statistics (if available)", },
1288
    { "pic", "", pic_info,
1289
      "", "show i8259 (PIC) state", },
1290
    { "pci", "", pci_info,
1291
      "", "show PCI info", },
1292
#if defined(TARGET_I386)
1293
    { "tlb", "", tlb_info,
1294
      "", "show virtual to physical memory mappings", },
1295
    { "mem", "", mem_info,
1296
      "", "show the active virtual memory mappings", },
1297
#endif
1298
    { "jit", "", do_info_jit,
1299
      "", "show dynamic compiler info", },
1300
    { "kqemu", "", do_info_kqemu,
1301
      "", "show kqemu information", },
1302
    { "usb", "", usb_info,
1303
      "", "show guest USB devices", },
1304
    { "usbhost", "", usb_host_info,
1305
      "", "show host USB devices", },
1306
    { "profile", "", do_info_profile,
1307
      "", "show profiling information", },
1308
    { "capture", "", do_info_capture,
1309
      "", "show capture information" },
1310
    { "snapshots", "", do_info_snapshots,
1311
      "", "show the currently saved VM snapshots" },
1312
    { "pcmcia", "", pcmcia_info,
1313
      "", "show guest PCMCIA status" },
1314
    { "mice", "", do_info_mice,
1315
      "", "show which guest mouse is receiving events" },
1316
    { "vnc", "", do_info_vnc,
1317
      "", "show the vnc server status"},
1318
    { "name", "", do_info_name,
1319
      "", "show the current VM name" },
1320
#if defined(TARGET_PPC)
1321
    { "cpustats", "", do_info_cpu_stats,
1322
      "", "show CPU statistics", },
1323
#endif
1324
    { NULL, NULL, },
1325
};
1326

    
1327
/*******************************************************************/
1328

    
1329
static const char *pch;
1330
static jmp_buf expr_env;
1331

    
1332
#define MD_TLONG 0
1333
#define MD_I32   1
1334

    
1335
typedef struct MonitorDef {
1336
    const char *name;
1337
    int offset;
1338
    target_long (*get_value)(struct MonitorDef *md, int val);
1339
    int type;
1340
} MonitorDef;
1341

    
1342
#if defined(TARGET_I386)
1343
static target_long monitor_get_pc (struct MonitorDef *md, int val)
1344
{
1345
    CPUState *env = mon_get_cpu();
1346
    if (!env)
1347
        return 0;
1348
    return env->eip + env->segs[R_CS].base;
1349
}
1350
#endif
1351

    
1352
#if defined(TARGET_PPC)
1353
static target_long monitor_get_ccr (struct MonitorDef *md, int val)
1354
{
1355
    CPUState *env = mon_get_cpu();
1356
    unsigned int u;
1357
    int i;
1358

    
1359
    if (!env)
1360
        return 0;
1361

    
1362
    u = 0;
1363
    for (i = 0; i < 8; i++)
1364
        u |= env->crf[i] << (32 - (4 * i));
1365

    
1366
    return u;
1367
}
1368

    
1369
static target_long monitor_get_msr (struct MonitorDef *md, int val)
1370
{
1371
    CPUState *env = mon_get_cpu();
1372
    if (!env)
1373
        return 0;
1374
    return (env->msr[MSR_POW] << MSR_POW) |
1375
        (env->msr[MSR_ILE] << MSR_ILE) |
1376
        (env->msr[MSR_EE] << MSR_EE) |
1377
        (env->msr[MSR_PR] << MSR_PR) |
1378
        (env->msr[MSR_FP] << MSR_FP) |
1379
        (env->msr[MSR_ME] << MSR_ME) |
1380
        (env->msr[MSR_FE0] << MSR_FE0) |
1381
        (env->msr[MSR_SE] << MSR_SE) |
1382
        (env->msr[MSR_BE] << MSR_BE) |
1383
        (env->msr[MSR_FE1] << MSR_FE1) |
1384
        (env->msr[MSR_IP] << MSR_IP) |
1385
        (env->msr[MSR_IR] << MSR_IR) |
1386
        (env->msr[MSR_DR] << MSR_DR) |
1387
        (env->msr[MSR_RI] << MSR_RI) |
1388
        (env->msr[MSR_LE] << MSR_LE);
1389
}
1390

    
1391
static target_long monitor_get_xer (struct MonitorDef *md, int val)
1392
{
1393
    CPUState *env = mon_get_cpu();
1394
    if (!env)
1395
        return 0;
1396
    return (env->xer[XER_SO] << XER_SO) |
1397
        (env->xer[XER_OV] << XER_OV) |
1398
        (env->xer[XER_CA] << XER_CA) |
1399
        (env->xer[XER_BC] << XER_BC);
1400
}
1401

    
1402
static target_long monitor_get_decr (struct MonitorDef *md, int val)
1403
{
1404
    CPUState *env = mon_get_cpu();
1405
    if (!env)
1406
        return 0;
1407
    return cpu_ppc_load_decr(env);
1408
}
1409

    
1410
static target_long monitor_get_tbu (struct MonitorDef *md, int val)
1411
{
1412
    CPUState *env = mon_get_cpu();
1413
    if (!env)
1414
        return 0;
1415
    return cpu_ppc_load_tbu(env);
1416
}
1417

    
1418
static target_long monitor_get_tbl (struct MonitorDef *md, int val)
1419
{
1420
    CPUState *env = mon_get_cpu();
1421
    if (!env)
1422
        return 0;
1423
    return cpu_ppc_load_tbl(env);
1424
}
1425
#endif
1426

    
1427
#if defined(TARGET_SPARC)
1428
#ifndef TARGET_SPARC64
1429
static target_long monitor_get_psr (struct MonitorDef *md, int val)
1430
{
1431
    CPUState *env = mon_get_cpu();
1432
    if (!env)
1433
        return 0;
1434
    return GET_PSR(env);
1435
}
1436
#endif
1437

    
1438
static target_long monitor_get_reg(struct MonitorDef *md, int val)
1439
{
1440
    CPUState *env = mon_get_cpu();
1441
    if (!env)
1442
        return 0;
1443
    return env->regwptr[val];
1444
}
1445
#endif
1446

    
1447
static MonitorDef monitor_defs[] = {
1448
#ifdef TARGET_I386
1449

    
1450
#define SEG(name, seg) \
1451
    { name, offsetof(CPUState, segs[seg].selector), NULL, MD_I32 },\
1452
    { name ".base", offsetof(CPUState, segs[seg].base) },\
1453
    { name ".limit", offsetof(CPUState, segs[seg].limit), NULL, MD_I32 },
1454

    
1455
    { "eax", offsetof(CPUState, regs[0]) },
1456
    { "ecx", offsetof(CPUState, regs[1]) },
1457
    { "edx", offsetof(CPUState, regs[2]) },
1458
    { "ebx", offsetof(CPUState, regs[3]) },
1459
    { "esp|sp", offsetof(CPUState, regs[4]) },
1460
    { "ebp|fp", offsetof(CPUState, regs[5]) },
1461
    { "esi", offsetof(CPUState, regs[6]) },
1462
    { "edi", offsetof(CPUState, regs[7]) },
1463
#ifdef TARGET_X86_64
1464
    { "r8", offsetof(CPUState, regs[8]) },
1465
    { "r9", offsetof(CPUState, regs[9]) },
1466
    { "r10", offsetof(CPUState, regs[10]) },
1467
    { "r11", offsetof(CPUState, regs[11]) },
1468
    { "r12", offsetof(CPUState, regs[12]) },
1469
    { "r13", offsetof(CPUState, regs[13]) },
1470
    { "r14", offsetof(CPUState, regs[14]) },
1471
    { "r15", offsetof(CPUState, regs[15]) },
1472
#endif
1473
    { "eflags", offsetof(CPUState, eflags) },
1474
    { "eip", offsetof(CPUState, eip) },
1475
    SEG("cs", R_CS)
1476
    SEG("ds", R_DS)
1477
    SEG("es", R_ES)
1478
    SEG("ss", R_SS)
1479
    SEG("fs", R_FS)
1480
    SEG("gs", R_GS)
1481
    { "pc", 0, monitor_get_pc, },
1482
#elif defined(TARGET_PPC)
1483
    { "r0", offsetof(CPUState, gpr[0]) },
1484
    { "r1", offsetof(CPUState, gpr[1]) },
1485
    { "r2", offsetof(CPUState, gpr[2]) },
1486
    { "r3", offsetof(CPUState, gpr[3]) },
1487
    { "r4", offsetof(CPUState, gpr[4]) },
1488
    { "r5", offsetof(CPUState, gpr[5]) },
1489
    { "r6", offsetof(CPUState, gpr[6]) },
1490
    { "r7", offsetof(CPUState, gpr[7]) },
1491
    { "r8", offsetof(CPUState, gpr[8]) },
1492
    { "r9", offsetof(CPUState, gpr[9]) },
1493
    { "r10", offsetof(CPUState, gpr[10]) },
1494
    { "r11", offsetof(CPUState, gpr[11]) },
1495
    { "r12", offsetof(CPUState, gpr[12]) },
1496
    { "r13", offsetof(CPUState, gpr[13]) },
1497
    { "r14", offsetof(CPUState, gpr[14]) },
1498
    { "r15", offsetof(CPUState, gpr[15]) },
1499
    { "r16", offsetof(CPUState, gpr[16]) },
1500
    { "r17", offsetof(CPUState, gpr[17]) },
1501
    { "r18", offsetof(CPUState, gpr[18]) },
1502
    { "r19", offsetof(CPUState, gpr[19]) },
1503
    { "r20", offsetof(CPUState, gpr[20]) },
1504
    { "r21", offsetof(CPUState, gpr[21]) },
1505
    { "r22", offsetof(CPUState, gpr[22]) },
1506
    { "r23", offsetof(CPUState, gpr[23]) },
1507
    { "r24", offsetof(CPUState, gpr[24]) },
1508
    { "r25", offsetof(CPUState, gpr[25]) },
1509
    { "r26", offsetof(CPUState, gpr[26]) },
1510
    { "r27", offsetof(CPUState, gpr[27]) },
1511
    { "r28", offsetof(CPUState, gpr[28]) },
1512
    { "r29", offsetof(CPUState, gpr[29]) },
1513
    { "r30", offsetof(CPUState, gpr[30]) },
1514
    { "r31", offsetof(CPUState, gpr[31]) },
1515
    { "nip|pc", offsetof(CPUState, nip) },
1516
    { "lr", offsetof(CPUState, lr) },
1517
    { "ctr", offsetof(CPUState, ctr) },
1518
    { "decr", 0, &monitor_get_decr, },
1519
    { "ccr", 0, &monitor_get_ccr, },
1520
    { "msr", 0, &monitor_get_msr, },
1521
    { "xer", 0, &monitor_get_xer, },
1522
    { "tbu", 0, &monitor_get_tbu, },
1523
    { "tbl", 0, &monitor_get_tbl, },
1524
    { "sdr1", offsetof(CPUState, sdr1) },
1525
    { "sr0", offsetof(CPUState, sr[0]) },
1526
    { "sr1", offsetof(CPUState, sr[1]) },
1527
    { "sr2", offsetof(CPUState, sr[2]) },
1528
    { "sr3", offsetof(CPUState, sr[3]) },
1529
    { "sr4", offsetof(CPUState, sr[4]) },
1530
    { "sr5", offsetof(CPUState, sr[5]) },
1531
    { "sr6", offsetof(CPUState, sr[6]) },
1532
    { "sr7", offsetof(CPUState, sr[7]) },
1533
    { "sr8", offsetof(CPUState, sr[8]) },
1534
    { "sr9", offsetof(CPUState, sr[9]) },
1535
    { "sr10", offsetof(CPUState, sr[10]) },
1536
    { "sr11", offsetof(CPUState, sr[11]) },
1537
    { "sr12", offsetof(CPUState, sr[12]) },
1538
    { "sr13", offsetof(CPUState, sr[13]) },
1539
    { "sr14", offsetof(CPUState, sr[14]) },
1540
    { "sr15", offsetof(CPUState, sr[15]) },
1541
    /* Too lazy to put BATs and SPRs ... */
1542
#elif defined(TARGET_SPARC)
1543
    { "g0", offsetof(CPUState, gregs[0]) },
1544
    { "g1", offsetof(CPUState, gregs[1]) },
1545
    { "g2", offsetof(CPUState, gregs[2]) },
1546
    { "g3", offsetof(CPUState, gregs[3]) },
1547
    { "g4", offsetof(CPUState, gregs[4]) },
1548
    { "g5", offsetof(CPUState, gregs[5]) },
1549
    { "g6", offsetof(CPUState, gregs[6]) },
1550
    { "g7", offsetof(CPUState, gregs[7]) },
1551
    { "o0", 0, monitor_get_reg },
1552
    { "o1", 1, monitor_get_reg },
1553
    { "o2", 2, monitor_get_reg },
1554
    { "o3", 3, monitor_get_reg },
1555
    { "o4", 4, monitor_get_reg },
1556
    { "o5", 5, monitor_get_reg },
1557
    { "o6", 6, monitor_get_reg },
1558
    { "o7", 7, monitor_get_reg },
1559
    { "l0", 8, monitor_get_reg },
1560
    { "l1", 9, monitor_get_reg },
1561
    { "l2", 10, monitor_get_reg },
1562
    { "l3", 11, monitor_get_reg },
1563
    { "l4", 12, monitor_get_reg },
1564
    { "l5", 13, monitor_get_reg },
1565
    { "l6", 14, monitor_get_reg },
1566
    { "l7", 15, monitor_get_reg },
1567
    { "i0", 16, monitor_get_reg },
1568
    { "i1", 17, monitor_get_reg },
1569
    { "i2", 18, monitor_get_reg },
1570
    { "i3", 19, monitor_get_reg },
1571
    { "i4", 20, monitor_get_reg },
1572
    { "i5", 21, monitor_get_reg },
1573
    { "i6", 22, monitor_get_reg },
1574
    { "i7", 23, monitor_get_reg },
1575
    { "pc", offsetof(CPUState, pc) },
1576
    { "npc", offsetof(CPUState, npc) },
1577
    { "y", offsetof(CPUState, y) },
1578
#ifndef TARGET_SPARC64
1579
    { "psr", 0, &monitor_get_psr, },
1580
    { "wim", offsetof(CPUState, wim) },
1581
#endif
1582
    { "tbr", offsetof(CPUState, tbr) },
1583
    { "fsr", offsetof(CPUState, fsr) },
1584
    { "f0", offsetof(CPUState, fpr[0]) },
1585
    { "f1", offsetof(CPUState, fpr[1]) },
1586
    { "f2", offsetof(CPUState, fpr[2]) },
1587
    { "f3", offsetof(CPUState, fpr[3]) },
1588
    { "f4", offsetof(CPUState, fpr[4]) },
1589
    { "f5", offsetof(CPUState, fpr[5]) },
1590
    { "f6", offsetof(CPUState, fpr[6]) },
1591
    { "f7", offsetof(CPUState, fpr[7]) },
1592
    { "f8", offsetof(CPUState, fpr[8]) },
1593
    { "f9", offsetof(CPUState, fpr[9]) },
1594
    { "f10", offsetof(CPUState, fpr[10]) },
1595
    { "f11", offsetof(CPUState, fpr[11]) },
1596
    { "f12", offsetof(CPUState, fpr[12]) },
1597
    { "f13", offsetof(CPUState, fpr[13]) },
1598
    { "f14", offsetof(CPUState, fpr[14]) },
1599
    { "f15", offsetof(CPUState, fpr[15]) },
1600
    { "f16", offsetof(CPUState, fpr[16]) },
1601
    { "f17", offsetof(CPUState, fpr[17]) },
1602
    { "f18", offsetof(CPUState, fpr[18]) },
1603
    { "f19", offsetof(CPUState, fpr[19]) },
1604
    { "f20", offsetof(CPUState, fpr[20]) },
1605
    { "f21", offsetof(CPUState, fpr[21]) },
1606
    { "f22", offsetof(CPUState, fpr[22]) },
1607
    { "f23", offsetof(CPUState, fpr[23]) },
1608
    { "f24", offsetof(CPUState, fpr[24]) },
1609
    { "f25", offsetof(CPUState, fpr[25]) },
1610
    { "f26", offsetof(CPUState, fpr[26]) },
1611
    { "f27", offsetof(CPUState, fpr[27]) },
1612
    { "f28", offsetof(CPUState, fpr[28]) },
1613
    { "f29", offsetof(CPUState, fpr[29]) },
1614
    { "f30", offsetof(CPUState, fpr[30]) },
1615
    { "f31", offsetof(CPUState, fpr[31]) },
1616
#ifdef TARGET_SPARC64
1617
    { "f32", offsetof(CPUState, fpr[32]) },
1618
    { "f34", offsetof(CPUState, fpr[34]) },
1619
    { "f36", offsetof(CPUState, fpr[36]) },
1620
    { "f38", offsetof(CPUState, fpr[38]) },
1621
    { "f40", offsetof(CPUState, fpr[40]) },
1622
    { "f42", offsetof(CPUState, fpr[42]) },
1623
    { "f44", offsetof(CPUState, fpr[44]) },
1624
    { "f46", offsetof(CPUState, fpr[46]) },
1625
    { "f48", offsetof(CPUState, fpr[48]) },
1626
    { "f50", offsetof(CPUState, fpr[50]) },
1627
    { "f52", offsetof(CPUState, fpr[52]) },
1628
    { "f54", offsetof(CPUState, fpr[54]) },
1629
    { "f56", offsetof(CPUState, fpr[56]) },
1630
    { "f58", offsetof(CPUState, fpr[58]) },
1631
    { "f60", offsetof(CPUState, fpr[60]) },
1632
    { "f62", offsetof(CPUState, fpr[62]) },
1633
    { "asi", offsetof(CPUState, asi) },
1634
    { "pstate", offsetof(CPUState, pstate) },
1635
    { "cansave", offsetof(CPUState, cansave) },
1636
    { "canrestore", offsetof(CPUState, canrestore) },
1637
    { "otherwin", offsetof(CPUState, otherwin) },
1638
    { "wstate", offsetof(CPUState, wstate) },
1639
    { "cleanwin", offsetof(CPUState, cleanwin) },
1640
    { "fprs", offsetof(CPUState, fprs) },
1641
#endif
1642
#endif
1643
    { NULL },
1644
};
1645

    
1646
static void expr_error(const char *fmt) 
1647
{
1648
    term_printf(fmt);
1649
    term_printf("\n");
1650
    longjmp(expr_env, 1);
1651
}
1652

    
1653
/* return 0 if OK, -1 if not found, -2 if no CPU defined */
1654
static int get_monitor_def(target_long *pval, const char *name)
1655
{
1656
    MonitorDef *md;
1657
    void *ptr;
1658

    
1659
    for(md = monitor_defs; md->name != NULL; md++) {
1660
        if (compare_cmd(name, md->name)) {
1661
            if (md->get_value) {
1662
                *pval = md->get_value(md, md->offset);
1663
            } else {
1664
                CPUState *env = mon_get_cpu();
1665
                if (!env)
1666
                    return -2;
1667
                ptr = (uint8_t *)env + md->offset;
1668
                switch(md->type) {
1669
                case MD_I32:
1670
                    *pval = *(int32_t *)ptr;
1671
                    break;
1672
                case MD_TLONG:
1673
                    *pval = *(target_long *)ptr;
1674
                    break;
1675
                default:
1676
                    *pval = 0;
1677
                    break;
1678
                }
1679
            }
1680
            return 0;
1681
        }
1682
    }
1683
    return -1;
1684
}
1685

    
1686
static void next(void)
1687
{
1688
    if (pch != '\0') {
1689
        pch++;
1690
        while (isspace(*pch))
1691
            pch++;
1692
    }
1693
}
1694

    
1695
static target_long expr_sum(void);
1696

    
1697
static target_long expr_unary(void)
1698
{
1699
    target_long n;
1700
    char *p;
1701
    int ret;
1702

    
1703
    switch(*pch) {
1704
    case '+':
1705
        next();
1706
        n = expr_unary();
1707
        break;
1708
    case '-':
1709
        next();
1710
        n = -expr_unary();
1711
        break;
1712
    case '~':
1713
        next();
1714
        n = ~expr_unary();
1715
        break;
1716
    case '(':
1717
        next();
1718
        n = expr_sum();
1719
        if (*pch != ')') {
1720
            expr_error("')' expected");
1721
        }
1722
        next();
1723
        break;
1724
    case '\'':
1725
        pch++;
1726
        if (*pch == '\0')
1727
            expr_error("character constant expected");
1728
        n = *pch;
1729
        pch++;
1730
        if (*pch != '\'')
1731
            expr_error("missing terminating \' character");
1732
        next();
1733
        break;
1734
    case '$':
1735
        {
1736
            char buf[128], *q;
1737
            
1738
            pch++;
1739
            q = buf;
1740
            while ((*pch >= 'a' && *pch <= 'z') ||
1741
                   (*pch >= 'A' && *pch <= 'Z') ||
1742
                   (*pch >= '0' && *pch <= '9') ||
1743
                   *pch == '_' || *pch == '.') {
1744
                if ((q - buf) < sizeof(buf) - 1)
1745
                    *q++ = *pch;
1746
                pch++;
1747
            }
1748
            while (isspace(*pch))
1749
                pch++;
1750
            *q = 0;
1751
            ret = get_monitor_def(&n, buf);
1752
            if (ret == -1)
1753
                expr_error("unknown register");
1754
            else if (ret == -2) 
1755
                expr_error("no cpu defined");
1756
        }
1757
        break;
1758
    case '\0':
1759
        expr_error("unexpected end of expression");
1760
        n = 0;
1761
        break;
1762
    default:
1763
#if TARGET_LONG_BITS == 64
1764
        n = strtoull(pch, &p, 0);
1765
#else
1766
        n = strtoul(pch, &p, 0);
1767
#endif
1768
        if (pch == p) {
1769
            expr_error("invalid char in expression");
1770
        }
1771
        pch = p;
1772
        while (isspace(*pch))
1773
            pch++;
1774
        break;
1775
    }
1776
    return n;
1777
}
1778

    
1779

    
1780
static target_long expr_prod(void)
1781
{
1782
    target_long val, val2;
1783
    int op;
1784
    
1785
    val = expr_unary();
1786
    for(;;) {
1787
        op = *pch;
1788
        if (op != '*' && op != '/' && op != '%')
1789
            break;
1790
        next();
1791
        val2 = expr_unary();
1792
        switch(op) {
1793
        default:
1794
        case '*':
1795
            val *= val2;
1796
            break;
1797
        case '/':
1798
        case '%':
1799
            if (val2 == 0) 
1800
                expr_error("division by zero");
1801
            if (op == '/')
1802
                val /= val2;
1803
            else
1804
                val %= val2;
1805
            break;
1806
        }
1807
    }
1808
    return val;
1809
}
1810

    
1811
static target_long expr_logic(void)
1812
{
1813
    target_long val, val2;
1814
    int op;
1815

    
1816
    val = expr_prod();
1817
    for(;;) {
1818
        op = *pch;
1819
        if (op != '&' && op != '|' && op != '^')
1820
            break;
1821
        next();
1822
        val2 = expr_prod();
1823
        switch(op) {
1824
        default:
1825
        case '&':
1826
            val &= val2;
1827
            break;
1828
        case '|':
1829
            val |= val2;
1830
            break;
1831
        case '^':
1832
            val ^= val2;
1833
            break;
1834
        }
1835
    }
1836
    return val;
1837
}
1838

    
1839
static target_long expr_sum(void)
1840
{
1841
    target_long val, val2;
1842
    int op;
1843

    
1844
    val = expr_logic();
1845
    for(;;) {
1846
        op = *pch;
1847
        if (op != '+' && op != '-')
1848
            break;
1849
        next();
1850
        val2 = expr_logic();
1851
        if (op == '+')
1852
            val += val2;
1853
        else
1854
            val -= val2;
1855
    }
1856
    return val;
1857
}
1858

    
1859
static int get_expr(target_long *pval, const char **pp)
1860
{
1861
    pch = *pp;
1862
    if (setjmp(expr_env)) {
1863
        *pp = pch;
1864
        return -1;
1865
    }
1866
    while (isspace(*pch))
1867
        pch++;
1868
    *pval = expr_sum();
1869
    *pp = pch;
1870
    return 0;
1871
}
1872

    
1873
static int get_str(char *buf, int buf_size, const char **pp)
1874
{
1875
    const char *p;
1876
    char *q;
1877
    int c;
1878

    
1879
    q = buf;
1880
    p = *pp;
1881
    while (isspace(*p))
1882
        p++;
1883
    if (*p == '\0') {
1884
    fail:
1885
        *q = '\0';
1886
        *pp = p;
1887
        return -1;
1888
    }
1889
    if (*p == '\"') {
1890
        p++;
1891
        while (*p != '\0' && *p != '\"') {
1892
            if (*p == '\\') {
1893
                p++;
1894
                c = *p++;
1895
                switch(c) {
1896
                case 'n':
1897
                    c = '\n';
1898
                    break;
1899
                case 'r':
1900
                    c = '\r';
1901
                    break;
1902
                case '\\':
1903
                case '\'':
1904
                case '\"':
1905
                    break;
1906
                default:
1907
                    qemu_printf("unsupported escape code: '\\%c'\n", c);
1908
                    goto fail;
1909
                }
1910
                if ((q - buf) < buf_size - 1) {
1911
                    *q++ = c;
1912
                }
1913
            } else {
1914
                if ((q - buf) < buf_size - 1) {
1915
                    *q++ = *p;
1916
                }
1917
                p++;
1918
            }
1919
        }
1920
        if (*p != '\"') {
1921
            qemu_printf("unterminated string\n");
1922
            goto fail;
1923
        }
1924
        p++;
1925
    } else {
1926
        while (*p != '\0' && !isspace(*p)) {
1927
            if ((q - buf) < buf_size - 1) {
1928
                *q++ = *p;
1929
            }
1930
            p++;
1931
        }
1932
    }
1933
    *q = '\0';
1934
    *pp = p;
1935
    return 0;
1936
}
1937

    
1938
static int default_fmt_format = 'x';
1939
static int default_fmt_size = 4;
1940

    
1941
#define MAX_ARGS 16
1942

    
1943
static void monitor_handle_command(const char *cmdline)
1944
{
1945
    const char *p, *pstart, *typestr;
1946
    char *q;
1947
    int c, nb_args, len, i, has_arg;
1948
    term_cmd_t *cmd;
1949
    char cmdname[256];
1950
    char buf[1024];
1951
    void *str_allocated[MAX_ARGS];
1952
    void *args[MAX_ARGS];
1953

    
1954
#ifdef DEBUG
1955
    term_printf("command='%s'\n", cmdline);
1956
#endif
1957
    
1958
    /* extract the command name */
1959
    p = cmdline;
1960
    q = cmdname;
1961
    while (isspace(*p))
1962
        p++;
1963
    if (*p == '\0')
1964
        return;
1965
    pstart = p;
1966
    while (*p != '\0' && *p != '/' && !isspace(*p))
1967
        p++;
1968
    len = p - pstart;
1969
    if (len > sizeof(cmdname) - 1)
1970
        len = sizeof(cmdname) - 1;
1971
    memcpy(cmdname, pstart, len);
1972
    cmdname[len] = '\0';
1973
    
1974
    /* find the command */
1975
    for(cmd = term_cmds; cmd->name != NULL; cmd++) {
1976
        if (compare_cmd(cmdname, cmd->name)) 
1977
            goto found;
1978
    }
1979
    term_printf("unknown command: '%s'\n", cmdname);
1980
    return;
1981
 found:
1982

    
1983
    for(i = 0; i < MAX_ARGS; i++)
1984
        str_allocated[i] = NULL;
1985
    
1986
    /* parse the parameters */
1987
    typestr = cmd->args_type;
1988
    nb_args = 0;
1989
    for(;;) {
1990
        c = *typestr;
1991
        if (c == '\0')
1992
            break;
1993
        typestr++;
1994
        switch(c) {
1995
        case 'F':
1996
        case 'B':
1997
        case 's':
1998
            {
1999
                int ret;
2000
                char *str;
2001
                
2002
                while (isspace(*p)) 
2003
                    p++;
2004
                if (*typestr == '?') {
2005
                    typestr++;
2006
                    if (*p == '\0') {
2007
                        /* no optional string: NULL argument */
2008
                        str = NULL;
2009
                        goto add_str;
2010
                    }
2011
                }
2012
                ret = get_str(buf, sizeof(buf), &p);
2013
                if (ret < 0) {
2014
                    switch(c) {
2015
                    case 'F':
2016
                        term_printf("%s: filename expected\n", cmdname);
2017
                        break;
2018
                    case 'B':
2019
                        term_printf("%s: block device name expected\n", cmdname);
2020
                        break;
2021
                    default:
2022
                        term_printf("%s: string expected\n", cmdname);
2023
                        break;
2024
                    }
2025
                    goto fail;
2026
                }
2027
                str = qemu_malloc(strlen(buf) + 1);
2028
                strcpy(str, buf);
2029
                str_allocated[nb_args] = str;
2030
            add_str:
2031
                if (nb_args >= MAX_ARGS) {
2032
                error_args:
2033
                    term_printf("%s: too many arguments\n", cmdname);
2034
                    goto fail;
2035
                }
2036
                args[nb_args++] = str;
2037
            }
2038
            break;
2039
        case '/':
2040
            {
2041
                int count, format, size;
2042
                
2043
                while (isspace(*p))
2044
                    p++;
2045
                if (*p == '/') {
2046
                    /* format found */
2047
                    p++;
2048
                    count = 1;
2049
                    if (isdigit(*p)) {
2050
                        count = 0;
2051
                        while (isdigit(*p)) {
2052
                            count = count * 10 + (*p - '0');
2053
                            p++;
2054
                        }
2055
                    }
2056
                    size = -1;
2057
                    format = -1;
2058
                    for(;;) {
2059
                        switch(*p) {
2060
                        case 'o':
2061
                        case 'd':
2062
                        case 'u':
2063
                        case 'x':
2064
                        case 'i':
2065
                        case 'c':
2066
                            format = *p++;
2067
                            break;
2068
                        case 'b':
2069
                            size = 1;
2070
                            p++;
2071
                            break;
2072
                        case 'h':
2073
                            size = 2;
2074
                            p++;
2075
                            break;
2076
                        case 'w':
2077
                            size = 4;
2078
                            p++;
2079
                            break;
2080
                        case 'g':
2081
                        case 'L':
2082
                            size = 8;
2083
                            p++;
2084
                            break;
2085
                        default:
2086
                            goto next;
2087
                        }
2088
                    }
2089
                next:
2090
                    if (*p != '\0' && !isspace(*p)) {
2091
                        term_printf("invalid char in format: '%c'\n", *p);
2092
                        goto fail;
2093
                    }
2094
                    if (format < 0)
2095
                        format = default_fmt_format;
2096
                    if (format != 'i') {
2097
                        /* for 'i', not specifying a size gives -1 as size */
2098
                        if (size < 0)
2099
                            size = default_fmt_size;
2100
                    }
2101
                    default_fmt_size = size;
2102
                    default_fmt_format = format;
2103
                } else {
2104
                    count = 1;
2105
                    format = default_fmt_format;
2106
                    if (format != 'i') {
2107
                        size = default_fmt_size;
2108
                    } else {
2109
                        size = -1;
2110
                    }
2111
                }
2112
                if (nb_args + 3 > MAX_ARGS)
2113
                    goto error_args;
2114
                args[nb_args++] = (void*)(long)count;
2115
                args[nb_args++] = (void*)(long)format;
2116
                args[nb_args++] = (void*)(long)size;
2117
            }
2118
            break;
2119
        case 'i':
2120
        case 'l':
2121
            {
2122
                target_long val;
2123
                while (isspace(*p)) 
2124
                    p++;
2125
                if (*typestr == '?' || *typestr == '.') {
2126
                    if (*typestr == '?') {
2127
                        if (*p == '\0')
2128
                            has_arg = 0;
2129
                        else
2130
                            has_arg = 1;
2131
                    } else {
2132
                        if (*p == '.') {
2133
                            p++;
2134
                            while (isspace(*p)) 
2135
                                p++;
2136
                            has_arg = 1;
2137
                        } else {
2138
                            has_arg = 0;
2139
                        }
2140
                    }
2141
                    typestr++;
2142
                    if (nb_args >= MAX_ARGS)
2143
                        goto error_args;
2144
                    args[nb_args++] = (void *)(long)has_arg;
2145
                    if (!has_arg) {
2146
                        if (nb_args >= MAX_ARGS)
2147
                            goto error_args;
2148
                        val = -1;
2149
                        goto add_num;
2150
                    }
2151
                }
2152
                if (get_expr(&val, &p))
2153
                    goto fail;
2154
            add_num:
2155
                if (c == 'i') {
2156
                    if (nb_args >= MAX_ARGS)
2157
                        goto error_args;
2158
                    args[nb_args++] = (void *)(long)val;
2159
                } else {
2160
                    if ((nb_args + 1) >= MAX_ARGS)
2161
                        goto error_args;
2162
#if TARGET_LONG_BITS == 64
2163
                    args[nb_args++] = (void *)(long)((val >> 32) & 0xffffffff);
2164
#else
2165
                    args[nb_args++] = (void *)0;
2166
#endif
2167
                    args[nb_args++] = (void *)(long)(val & 0xffffffff);
2168
                }
2169
            }
2170
            break;
2171
        case '-':
2172
            {
2173
                int has_option;
2174
                /* option */
2175
                
2176
                c = *typestr++;
2177
                if (c == '\0')
2178
                    goto bad_type;
2179
                while (isspace(*p)) 
2180
                    p++;
2181
                has_option = 0;
2182
                if (*p == '-') {
2183
                    p++;
2184
                    if (*p != c) {
2185
                        term_printf("%s: unsupported option -%c\n", 
2186
                                    cmdname, *p);
2187
                        goto fail;
2188
                    }
2189
                    p++;
2190
                    has_option = 1;
2191
                }
2192
                if (nb_args >= MAX_ARGS)
2193
                    goto error_args;
2194
                args[nb_args++] = (void *)(long)has_option;
2195
            }
2196
            break;
2197
        default:
2198
        bad_type:
2199
            term_printf("%s: unknown type '%c'\n", cmdname, c);
2200
            goto fail;
2201
        }
2202
    }
2203
    /* check that all arguments were parsed */
2204
    while (isspace(*p))
2205
        p++;
2206
    if (*p != '\0') {
2207
        term_printf("%s: extraneous characters at the end of line\n", 
2208
                    cmdname);
2209
        goto fail;
2210
    }
2211

    
2212
    switch(nb_args) {
2213
    case 0:
2214
        cmd->handler();
2215
        break;
2216
    case 1:
2217
        cmd->handler(args[0]);
2218
        break;
2219
    case 2:
2220
        cmd->handler(args[0], args[1]);
2221
        break;
2222
    case 3:
2223
        cmd->handler(args[0], args[1], args[2]);
2224
        break;
2225
    case 4:
2226
        cmd->handler(args[0], args[1], args[2], args[3]);
2227
        break;
2228
    case 5:
2229
        cmd->handler(args[0], args[1], args[2], args[3], args[4]);
2230
        break;
2231
    case 6:
2232
        cmd->handler(args[0], args[1], args[2], args[3], args[4], args[5]);
2233
        break;
2234
    case 7:
2235
        cmd->handler(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
2236
        break;
2237
    default:
2238
        term_printf("unsupported number of arguments: %d\n", nb_args);
2239
        goto fail;
2240
    }
2241
 fail:
2242
    for(i = 0; i < MAX_ARGS; i++)
2243
        qemu_free(str_allocated[i]);
2244
    return;
2245
}
2246

    
2247
static void cmd_completion(const char *name, const char *list)
2248
{
2249
    const char *p, *pstart;
2250
    char cmd[128];
2251
    int len;
2252

    
2253
    p = list;
2254
    for(;;) {
2255
        pstart = p;
2256
        p = strchr(p, '|');
2257
        if (!p)
2258
            p = pstart + strlen(pstart);
2259
        len = p - pstart;
2260
        if (len > sizeof(cmd) - 2)
2261
            len = sizeof(cmd) - 2;
2262
        memcpy(cmd, pstart, len);
2263
        cmd[len] = '\0';
2264
        if (name[0] == '\0' || !strncmp(name, cmd, strlen(name))) {
2265
            add_completion(cmd);
2266
        }
2267
        if (*p == '\0')
2268
            break;
2269
        p++;
2270
    }
2271
}
2272

    
2273
static void file_completion(const char *input)
2274
{
2275
    DIR *ffs;
2276
    struct dirent *d;
2277
    char path[1024];
2278
    char file[1024], file_prefix[1024];
2279
    int input_path_len;
2280
    const char *p;
2281

    
2282
    p = strrchr(input, '/'); 
2283
    if (!p) {
2284
        input_path_len = 0;
2285
        pstrcpy(file_prefix, sizeof(file_prefix), input);
2286
        strcpy(path, ".");
2287
    } else {
2288
        input_path_len = p - input + 1;
2289
        memcpy(path, input, input_path_len);
2290
        if (input_path_len > sizeof(path) - 1)
2291
            input_path_len = sizeof(path) - 1;
2292
        path[input_path_len] = '\0';
2293
        pstrcpy(file_prefix, sizeof(file_prefix), p + 1);
2294
    }
2295
#ifdef DEBUG_COMPLETION
2296
    term_printf("input='%s' path='%s' prefix='%s'\n", input, path, file_prefix);
2297
#endif
2298
    ffs = opendir(path);
2299
    if (!ffs)
2300
        return;
2301
    for(;;) {
2302
        struct stat sb;
2303
        d = readdir(ffs);
2304
        if (!d)
2305
            break;
2306
        if (strstart(d->d_name, file_prefix, NULL)) {
2307
            memcpy(file, input, input_path_len);
2308
            strcpy(file + input_path_len, d->d_name);
2309
            /* stat the file to find out if it's a directory.
2310
             * In that case add a slash to speed up typing long paths
2311
             */
2312
            stat(file, &sb);
2313
            if(S_ISDIR(sb.st_mode))
2314
                strcat(file, "/");
2315
            add_completion(file);
2316
        }
2317
    }
2318
    closedir(ffs);
2319
}
2320

    
2321
static void block_completion_it(void *opaque, const char *name)
2322
{
2323
    const char *input = opaque;
2324

    
2325
    if (input[0] == '\0' ||
2326
        !strncmp(name, (char *)input, strlen(input))) {
2327
        add_completion(name);
2328
    }
2329
}
2330

    
2331
/* NOTE: this parser is an approximate form of the real command parser */
2332
static void parse_cmdline(const char *cmdline,
2333
                         int *pnb_args, char **args)
2334
{
2335
    const char *p;
2336
    int nb_args, ret;
2337
    char buf[1024];
2338

    
2339
    p = cmdline;
2340
    nb_args = 0;
2341
    for(;;) {
2342
        while (isspace(*p))
2343
            p++;
2344
        if (*p == '\0')
2345
            break;
2346
        if (nb_args >= MAX_ARGS)
2347
            break;
2348
        ret = get_str(buf, sizeof(buf), &p);
2349
        args[nb_args] = qemu_strdup(buf);
2350
        nb_args++;
2351
        if (ret < 0)
2352
            break;
2353
    }
2354
    *pnb_args = nb_args;
2355
}
2356

    
2357
void readline_find_completion(const char *cmdline)
2358
{
2359
    const char *cmdname;
2360
    char *args[MAX_ARGS];
2361
    int nb_args, i, len;
2362
    const char *ptype, *str;
2363
    term_cmd_t *cmd;
2364
    const KeyDef *key;
2365

    
2366
    parse_cmdline(cmdline, &nb_args, args);
2367
#ifdef DEBUG_COMPLETION
2368
    for(i = 0; i < nb_args; i++) {
2369
        term_printf("arg%d = '%s'\n", i, (char *)args[i]);
2370
    }
2371
#endif
2372

    
2373
    /* if the line ends with a space, it means we want to complete the
2374
       next arg */
2375
    len = strlen(cmdline);
2376
    if (len > 0 && isspace(cmdline[len - 1])) {
2377
        if (nb_args >= MAX_ARGS)
2378
            return;
2379
        args[nb_args++] = qemu_strdup("");
2380
    }
2381
    if (nb_args <= 1) {
2382
        /* command completion */
2383
        if (nb_args == 0)
2384
            cmdname = "";
2385
        else
2386
            cmdname = args[0];
2387
        completion_index = strlen(cmdname);
2388
        for(cmd = term_cmds; cmd->name != NULL; cmd++) {
2389
            cmd_completion(cmdname, cmd->name);
2390
        }
2391
    } else {
2392
        /* find the command */
2393
        for(cmd = term_cmds; cmd->name != NULL; cmd++) {
2394
            if (compare_cmd(args[0], cmd->name))
2395
                goto found;
2396
        }
2397
        return;
2398
    found:
2399
        ptype = cmd->args_type;
2400
        for(i = 0; i < nb_args - 2; i++) {
2401
            if (*ptype != '\0') {
2402
                ptype++;
2403
                while (*ptype == '?')
2404
                    ptype++;
2405
            }
2406
        }
2407
        str = args[nb_args - 1];
2408
        switch(*ptype) {
2409
        case 'F':
2410
            /* file completion */
2411
            completion_index = strlen(str);
2412
            file_completion(str);
2413
            break;
2414
        case 'B':
2415
            /* block device name completion */
2416
            completion_index = strlen(str);
2417
            bdrv_iterate(block_completion_it, (void *)str);
2418
            break;
2419
        case 's':
2420
            /* XXX: more generic ? */
2421
            if (!strcmp(cmd->name, "info")) {
2422
                completion_index = strlen(str);
2423
                for(cmd = info_cmds; cmd->name != NULL; cmd++) {
2424
                    cmd_completion(str, cmd->name);
2425
                }
2426
            } else if (!strcmp(cmd->name, "sendkey")) {
2427
                completion_index = strlen(str);
2428
                for(key = key_defs; key->name != NULL; key++) {
2429
                    cmd_completion(str, key->name);
2430
                }
2431
            }
2432
            break;
2433
        default:
2434
            break;
2435
        }
2436
    }
2437
    for(i = 0; i < nb_args; i++)
2438
        qemu_free(args[i]);
2439
}
2440

    
2441
static int term_can_read(void *opaque)
2442
{
2443
    return 128;
2444
}
2445

    
2446
static void term_read(void *opaque, const uint8_t *buf, int size)
2447
{
2448
    int i;
2449
    for(i = 0; i < size; i++)
2450
        readline_handle_byte(buf[i]);
2451
}
2452

    
2453
static void monitor_start_input(void);
2454

    
2455
static void monitor_handle_command1(void *opaque, const char *cmdline)
2456
{
2457
    monitor_handle_command(cmdline);
2458
    monitor_start_input();
2459
}
2460

    
2461
static void monitor_start_input(void)
2462
{
2463
    readline_start("(qemu) ", 0, monitor_handle_command1, NULL);
2464
}
2465

    
2466
static void term_event(void *opaque, int event)
2467
{
2468
    if (event != CHR_EVENT_RESET)
2469
        return;
2470

    
2471
    if (!hide_banner)
2472
            term_printf("QEMU %s monitor - type 'help' for more information\n",
2473
                        QEMU_VERSION);
2474
    monitor_start_input();
2475
}
2476

    
2477
static int is_first_init = 1;
2478

    
2479
void monitor_init(CharDriverState *hd, int show_banner)
2480
{
2481
    int i;
2482

    
2483
    if (is_first_init) {
2484
        for (i = 0; i < MAX_MON; i++) {
2485
            monitor_hd[i] = NULL;
2486
        }
2487
        is_first_init = 0;
2488
    }
2489
    for (i = 0; i < MAX_MON; i++) {
2490
        if (monitor_hd[i] == NULL) {
2491
            monitor_hd[i] = hd;
2492
            break;
2493
        }
2494
    }
2495

    
2496
    hide_banner = !show_banner;
2497

    
2498
    qemu_chr_add_handlers(hd, term_can_read, term_read, term_event, NULL);
2499
}
2500

    
2501
/* XXX: use threads ? */
2502
/* modal monitor readline */
2503
static int monitor_readline_started;
2504
static char *monitor_readline_buf;
2505
static int monitor_readline_buf_size;
2506

    
2507
static void monitor_readline_cb(void *opaque, const char *input)
2508
{
2509
    pstrcpy(monitor_readline_buf, monitor_readline_buf_size, input);
2510
    monitor_readline_started = 0;
2511
}
2512

    
2513
void monitor_readline(const char *prompt, int is_password,
2514
                      char *buf, int buf_size)
2515
{
2516
    int i;
2517

    
2518
    if (is_password) {
2519
        for (i = 0; i < MAX_MON; i++)
2520
            if (monitor_hd[i] && monitor_hd[i]->focus == 0)
2521
                qemu_chr_send_event(monitor_hd[i], CHR_EVENT_FOCUS);
2522
    }
2523
    readline_start(prompt, is_password, monitor_readline_cb, NULL);
2524
    monitor_readline_buf = buf;
2525
    monitor_readline_buf_size = buf_size;
2526
    monitor_readline_started = 1;
2527
    while (monitor_readline_started) {
2528
        main_loop_wait(10);
2529
    }
2530
}