Statistics
| Branch: | Revision:

root / monitor.c @ b8c18e4c

History | View | Annotate | Download (86.4 kB)

1 9dc39cba bellard
/*
2 9dc39cba bellard
 * QEMU monitor
3 5fafdf24 ths
 *
4 9dc39cba bellard
 * Copyright (c) 2003-2004 Fabrice Bellard
5 5fafdf24 ths
 *
6 9dc39cba bellard
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 9dc39cba bellard
 * of this software and associated documentation files (the "Software"), to deal
8 9dc39cba bellard
 * in the Software without restriction, including without limitation the rights
9 9dc39cba bellard
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 9dc39cba bellard
 * copies of the Software, and to permit persons to whom the Software is
11 9dc39cba bellard
 * furnished to do so, subject to the following conditions:
12 9dc39cba bellard
 *
13 9dc39cba bellard
 * The above copyright notice and this permission notice shall be included in
14 9dc39cba bellard
 * all copies or substantial portions of the Software.
15 9dc39cba bellard
 *
16 9dc39cba bellard
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 9dc39cba bellard
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 9dc39cba bellard
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 9dc39cba bellard
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 9dc39cba bellard
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 9dc39cba bellard
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 9dc39cba bellard
 * THE SOFTWARE.
23 9dc39cba bellard
 */
24 511d2b14 blueswir1
#include <dirent.h>
25 87ecb68b pbrook
#include "hw/hw.h"
26 87ecb68b pbrook
#include "hw/usb.h"
27 87ecb68b pbrook
#include "hw/pcmcia.h"
28 87ecb68b pbrook
#include "hw/pc.h"
29 87ecb68b pbrook
#include "hw/pci.h"
30 87ecb68b pbrook
#include "gdbstub.h"
31 87ecb68b pbrook
#include "net.h"
32 87ecb68b pbrook
#include "qemu-char.h"
33 87ecb68b pbrook
#include "sysemu.h"
34 376253ec aliguori
#include "monitor.h"
35 376253ec aliguori
#include "readline.h"
36 87ecb68b pbrook
#include "console.h"
37 87ecb68b pbrook
#include "block.h"
38 87ecb68b pbrook
#include "audio/audio.h"
39 9307c4c1 bellard
#include "disas.h"
40 df751fa8 aliguori
#include "balloon.h"
41 c8256f9d balrog
#include "qemu-timer.h"
42 5bb7910a aliguori
#include "migration.h"
43 7ba1e619 aliguori
#include "kvm.h"
44 76655d6d aliguori
#include "acl.h"
45 6a5bd307 ths
46 9dc39cba bellard
//#define DEBUG
47 81d0912d bellard
//#define DEBUG_COMPLETION
48 9dc39cba bellard
49 9307c4c1 bellard
/*
50 9307c4c1 bellard
 * Supported types:
51 5fafdf24 ths
 *
52 9307c4c1 bellard
 * 'F'          filename
53 81d0912d bellard
 * 'B'          block device name
54 9307c4c1 bellard
 * 's'          string (accept optional quote)
55 92a31b1f bellard
 * 'i'          32 bit integer
56 92a31b1f bellard
 * 'l'          target long (32 or 64 bit)
57 9307c4c1 bellard
 * '/'          optional gdb-like print format (like "/10x")
58 9307c4c1 bellard
 *
59 9307c4c1 bellard
 * '?'          optional type (for 'F', 's' and 'i')
60 9307c4c1 bellard
 *
61 9307c4c1 bellard
 */
62 9307c4c1 bellard
63 376253ec aliguori
typedef struct mon_cmd_t {
64 9dc39cba bellard
    const char *name;
65 9307c4c1 bellard
    const char *args_type;
66 a5f1b965 blueswir1
    void *handler;
67 9dc39cba bellard
    const char *params;
68 9dc39cba bellard
    const char *help;
69 376253ec aliguori
} mon_cmd_t;
70 9dc39cba bellard
71 87127161 aliguori
struct Monitor {
72 87127161 aliguori
    CharDriverState *chr;
73 731b0364 aliguori
    int flags;
74 731b0364 aliguori
    int suspend_cnt;
75 731b0364 aliguori
    uint8_t outbuf[1024];
76 731b0364 aliguori
    int outbuf_index;
77 731b0364 aliguori
    ReadLineState *rs;
78 731b0364 aliguori
    CPUState *mon_cpu;
79 731b0364 aliguori
    BlockDriverCompletionFunc *password_completion_cb;
80 731b0364 aliguori
    void *password_opaque;
81 87127161 aliguori
    LIST_ENTRY(Monitor) entry;
82 87127161 aliguori
};
83 87127161 aliguori
84 87127161 aliguori
static LIST_HEAD(mon_list, Monitor) mon_list;
85 7e2515e8 bellard
86 376253ec aliguori
static const mon_cmd_t mon_cmds[];
87 376253ec aliguori
static const mon_cmd_t info_cmds[];
88 9dc39cba bellard
89 87127161 aliguori
Monitor *cur_mon = NULL;
90 376253ec aliguori
91 731b0364 aliguori
static void monitor_command_cb(Monitor *mon, const char *cmdline,
92 731b0364 aliguori
                               void *opaque);
93 83ab7950 aliguori
94 731b0364 aliguori
static void monitor_read_command(Monitor *mon, int show_prompt)
95 731b0364 aliguori
{
96 731b0364 aliguori
    readline_start(mon->rs, "(qemu) ", 0, monitor_command_cb, NULL);
97 731b0364 aliguori
    if (show_prompt)
98 731b0364 aliguori
        readline_show_prompt(mon->rs);
99 731b0364 aliguori
}
100 6a00d601 bellard
101 cde76ee1 aliguori
static int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
102 cde76ee1 aliguori
                                 void *opaque)
103 bb5fc20f aliguori
{
104 cde76ee1 aliguori
    if (mon->rs) {
105 cde76ee1 aliguori
        readline_start(mon->rs, "Password: ", 1, readline_func, opaque);
106 cde76ee1 aliguori
        /* prompt is printed on return from the command handler */
107 cde76ee1 aliguori
        return 0;
108 cde76ee1 aliguori
    } else {
109 cde76ee1 aliguori
        monitor_printf(mon, "terminal does not support password prompting\n");
110 cde76ee1 aliguori
        return -ENOTTY;
111 cde76ee1 aliguori
    }
112 bb5fc20f aliguori
}
113 bb5fc20f aliguori
114 376253ec aliguori
void monitor_flush(Monitor *mon)
115 7e2515e8 bellard
{
116 731b0364 aliguori
    if (mon && mon->outbuf_index != 0 && mon->chr->focus == 0) {
117 731b0364 aliguori
        qemu_chr_write(mon->chr, mon->outbuf, mon->outbuf_index);
118 731b0364 aliguori
        mon->outbuf_index = 0;
119 7e2515e8 bellard
    }
120 7e2515e8 bellard
}
121 7e2515e8 bellard
122 7e2515e8 bellard
/* flush at every end of line or if the buffer is full */
123 376253ec aliguori
static void monitor_puts(Monitor *mon, const char *str)
124 7e2515e8 bellard
{
125 60fe76f3 ths
    char c;
126 731b0364 aliguori
127 731b0364 aliguori
    if (!mon)
128 731b0364 aliguori
        return;
129 731b0364 aliguori
130 7e2515e8 bellard
    for(;;) {
131 7e2515e8 bellard
        c = *str++;
132 7e2515e8 bellard
        if (c == '\0')
133 7e2515e8 bellard
            break;
134 7ba1260a bellard
        if (c == '\n')
135 731b0364 aliguori
            mon->outbuf[mon->outbuf_index++] = '\r';
136 731b0364 aliguori
        mon->outbuf[mon->outbuf_index++] = c;
137 731b0364 aliguori
        if (mon->outbuf_index >= (sizeof(mon->outbuf) - 1)
138 731b0364 aliguori
            || c == '\n')
139 376253ec aliguori
            monitor_flush(mon);
140 7e2515e8 bellard
    }
141 7e2515e8 bellard
}
142 7e2515e8 bellard
143 376253ec aliguori
void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
144 9dc39cba bellard
{
145 81d0912d bellard
    char buf[4096];
146 81d0912d bellard
    vsnprintf(buf, sizeof(buf), fmt, ap);
147 376253ec aliguori
    monitor_puts(mon, buf);
148 9dc39cba bellard
}
149 9dc39cba bellard
150 376253ec aliguori
void monitor_printf(Monitor *mon, const char *fmt, ...)
151 9dc39cba bellard
{
152 7e2515e8 bellard
    va_list ap;
153 7e2515e8 bellard
    va_start(ap, fmt);
154 376253ec aliguori
    monitor_vprintf(mon, fmt, ap);
155 7e2515e8 bellard
    va_end(ap);
156 9dc39cba bellard
}
157 9dc39cba bellard
158 376253ec aliguori
void monitor_print_filename(Monitor *mon, const char *filename)
159 fef30743 ths
{
160 fef30743 ths
    int i;
161 fef30743 ths
162 fef30743 ths
    for (i = 0; filename[i]; i++) {
163 28a76be8 aliguori
        switch (filename[i]) {
164 28a76be8 aliguori
        case ' ':
165 28a76be8 aliguori
        case '"':
166 28a76be8 aliguori
        case '\\':
167 28a76be8 aliguori
            monitor_printf(mon, "\\%c", filename[i]);
168 28a76be8 aliguori
            break;
169 28a76be8 aliguori
        case '\t':
170 28a76be8 aliguori
            monitor_printf(mon, "\\t");
171 28a76be8 aliguori
            break;
172 28a76be8 aliguori
        case '\r':
173 28a76be8 aliguori
            monitor_printf(mon, "\\r");
174 28a76be8 aliguori
            break;
175 28a76be8 aliguori
        case '\n':
176 28a76be8 aliguori
            monitor_printf(mon, "\\n");
177 28a76be8 aliguori
            break;
178 28a76be8 aliguori
        default:
179 28a76be8 aliguori
            monitor_printf(mon, "%c", filename[i]);
180 28a76be8 aliguori
            break;
181 28a76be8 aliguori
        }
182 fef30743 ths
    }
183 fef30743 ths
}
184 fef30743 ths
185 7fe48483 bellard
static int monitor_fprintf(FILE *stream, const char *fmt, ...)
186 7fe48483 bellard
{
187 7fe48483 bellard
    va_list ap;
188 7fe48483 bellard
    va_start(ap, fmt);
189 376253ec aliguori
    monitor_vprintf((Monitor *)stream, fmt, ap);
190 7fe48483 bellard
    va_end(ap);
191 7fe48483 bellard
    return 0;
192 7fe48483 bellard
}
193 7fe48483 bellard
194 9dc39cba bellard
static int compare_cmd(const char *name, const char *list)
195 9dc39cba bellard
{
196 9dc39cba bellard
    const char *p, *pstart;
197 9dc39cba bellard
    int len;
198 9dc39cba bellard
    len = strlen(name);
199 9dc39cba bellard
    p = list;
200 9dc39cba bellard
    for(;;) {
201 9dc39cba bellard
        pstart = p;
202 9dc39cba bellard
        p = strchr(p, '|');
203 9dc39cba bellard
        if (!p)
204 9dc39cba bellard
            p = pstart + strlen(pstart);
205 9dc39cba bellard
        if ((p - pstart) == len && !memcmp(pstart, name, len))
206 9dc39cba bellard
            return 1;
207 9dc39cba bellard
        if (*p == '\0')
208 9dc39cba bellard
            break;
209 9dc39cba bellard
        p++;
210 9dc39cba bellard
    }
211 9dc39cba bellard
    return 0;
212 9dc39cba bellard
}
213 9dc39cba bellard
214 376253ec aliguori
static void help_cmd_dump(Monitor *mon, const mon_cmd_t *cmds,
215 376253ec aliguori
                          const char *prefix, const char *name)
216 9dc39cba bellard
{
217 376253ec aliguori
    const mon_cmd_t *cmd;
218 9dc39cba bellard
219 9dc39cba bellard
    for(cmd = cmds; cmd->name != NULL; cmd++) {
220 9dc39cba bellard
        if (!name || !strcmp(name, cmd->name))
221 376253ec aliguori
            monitor_printf(mon, "%s%s %s -- %s\n", prefix, cmd->name,
222 376253ec aliguori
                           cmd->params, cmd->help);
223 9dc39cba bellard
    }
224 9dc39cba bellard
}
225 9dc39cba bellard
226 376253ec aliguori
static void help_cmd(Monitor *mon, const char *name)
227 9dc39cba bellard
{
228 9dc39cba bellard
    if (name && !strcmp(name, "info")) {
229 376253ec aliguori
        help_cmd_dump(mon, info_cmds, "info ", NULL);
230 9dc39cba bellard
    } else {
231 376253ec aliguori
        help_cmd_dump(mon, mon_cmds, "", name);
232 f193c797 bellard
        if (name && !strcmp(name, "log")) {
233 8662d656 blueswir1
            const CPULogItem *item;
234 376253ec aliguori
            monitor_printf(mon, "Log items (comma separated):\n");
235 376253ec aliguori
            monitor_printf(mon, "%-10s %s\n", "none", "remove all logs");
236 f193c797 bellard
            for(item = cpu_log_items; item->mask != 0; item++) {
237 376253ec aliguori
                monitor_printf(mon, "%-10s %s\n", item->name, item->help);
238 f193c797 bellard
            }
239 f193c797 bellard
        }
240 9dc39cba bellard
    }
241 9dc39cba bellard
}
242 9dc39cba bellard
243 376253ec aliguori
static void do_commit(Monitor *mon, const char *device)
244 9dc39cba bellard
{
245 7954c734 bellard
    int i, all_devices;
246 2dc7b602 balrog
247 7954c734 bellard
    all_devices = !strcmp(device, "all");
248 e4bcb14c ths
    for (i = 0; i < nb_drives; i++) {
249 5fafdf24 ths
            if (all_devices ||
250 e4bcb14c ths
                !strcmp(bdrv_get_device_name(drives_table[i].bdrv), device))
251 e4bcb14c ths
                bdrv_commit(drives_table[i].bdrv);
252 9dc39cba bellard
    }
253 9dc39cba bellard
}
254 9dc39cba bellard
255 376253ec aliguori
static void do_info(Monitor *mon, const char *item)
256 9dc39cba bellard
{
257 376253ec aliguori
    const mon_cmd_t *cmd;
258 376253ec aliguori
    void (*handler)(Monitor *);
259 9dc39cba bellard
260 9307c4c1 bellard
    if (!item)
261 9dc39cba bellard
        goto help;
262 9dc39cba bellard
    for(cmd = info_cmds; cmd->name != NULL; cmd++) {
263 5fafdf24 ths
        if (compare_cmd(item, cmd->name))
264 9dc39cba bellard
            goto found;
265 9dc39cba bellard
    }
266 9dc39cba bellard
 help:
267 376253ec aliguori
    help_cmd(mon, "info");
268 9dc39cba bellard
    return;
269 9dc39cba bellard
 found:
270 a5f1b965 blueswir1
    handler = cmd->handler;
271 376253ec aliguori
    handler(mon);
272 9dc39cba bellard
}
273 9dc39cba bellard
274 376253ec aliguori
static void do_info_version(Monitor *mon)
275 9bc9d1c7 bellard
{
276 376253ec aliguori
    monitor_printf(mon, "%s\n", QEMU_VERSION);
277 9bc9d1c7 bellard
}
278 9bc9d1c7 bellard
279 376253ec aliguori
static void do_info_name(Monitor *mon)
280 c35734b2 ths
{
281 c35734b2 ths
    if (qemu_name)
282 376253ec aliguori
        monitor_printf(mon, "%s\n", qemu_name);
283 c35734b2 ths
}
284 c35734b2 ths
285 bf4f74c0 aurel32
#if defined(TARGET_I386)
286 376253ec aliguori
static void do_info_hpet(Monitor *mon)
287 16b29ae1 aliguori
{
288 376253ec aliguori
    monitor_printf(mon, "HPET is %s by QEMU\n",
289 376253ec aliguori
                   (no_hpet) ? "disabled" : "enabled");
290 16b29ae1 aliguori
}
291 bf4f74c0 aurel32
#endif
292 16b29ae1 aliguori
293 376253ec aliguori
static void do_info_uuid(Monitor *mon)
294 a36e69dd ths
{
295 376253ec aliguori
    monitor_printf(mon, UUID_FMT "\n", qemu_uuid[0], qemu_uuid[1],
296 376253ec aliguori
                   qemu_uuid[2], qemu_uuid[3], qemu_uuid[4], qemu_uuid[5],
297 376253ec aliguori
                   qemu_uuid[6], qemu_uuid[7], qemu_uuid[8], qemu_uuid[9],
298 376253ec aliguori
                   qemu_uuid[10], qemu_uuid[11], qemu_uuid[12], qemu_uuid[13],
299 376253ec aliguori
                   qemu_uuid[14], qemu_uuid[15]);
300 a36e69dd ths
}
301 a36e69dd ths
302 6a00d601 bellard
/* get the current CPU defined by the user */
303 9596ebb7 pbrook
static int mon_set_cpu(int cpu_index)
304 6a00d601 bellard
{
305 6a00d601 bellard
    CPUState *env;
306 6a00d601 bellard
307 6a00d601 bellard
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
308 6a00d601 bellard
        if (env->cpu_index == cpu_index) {
309 731b0364 aliguori
            cur_mon->mon_cpu = env;
310 6a00d601 bellard
            return 0;
311 6a00d601 bellard
        }
312 6a00d601 bellard
    }
313 6a00d601 bellard
    return -1;
314 6a00d601 bellard
}
315 6a00d601 bellard
316 9596ebb7 pbrook
static CPUState *mon_get_cpu(void)
317 6a00d601 bellard
{
318 731b0364 aliguori
    if (!cur_mon->mon_cpu) {
319 6a00d601 bellard
        mon_set_cpu(0);
320 6a00d601 bellard
    }
321 d154615d aliguori
    cpu_synchronize_state(cur_mon->mon_cpu, 0);
322 731b0364 aliguori
    return cur_mon->mon_cpu;
323 6a00d601 bellard
}
324 6a00d601 bellard
325 376253ec aliguori
static void do_info_registers(Monitor *mon)
326 9307c4c1 bellard
{
327 6a00d601 bellard
    CPUState *env;
328 6a00d601 bellard
    env = mon_get_cpu();
329 6a00d601 bellard
    if (!env)
330 6a00d601 bellard
        return;
331 9307c4c1 bellard
#ifdef TARGET_I386
332 376253ec aliguori
    cpu_dump_state(env, (FILE *)mon, monitor_fprintf,
333 d24b15a8 bellard
                   X86_DUMP_FPU);
334 9307c4c1 bellard
#else
335 376253ec aliguori
    cpu_dump_state(env, (FILE *)mon, monitor_fprintf,
336 7fe48483 bellard
                   0);
337 9307c4c1 bellard
#endif
338 9307c4c1 bellard
}
339 9307c4c1 bellard
340 376253ec aliguori
static void do_info_cpus(Monitor *mon)
341 6a00d601 bellard
{
342 6a00d601 bellard
    CPUState *env;
343 6a00d601 bellard
344 6a00d601 bellard
    /* just to set the default cpu if not already done */
345 6a00d601 bellard
    mon_get_cpu();
346 6a00d601 bellard
347 6a00d601 bellard
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
348 d154615d aliguori
        cpu_synchronize_state(env, 0);
349 376253ec aliguori
        monitor_printf(mon, "%c CPU #%d:",
350 731b0364 aliguori
                       (env == mon->mon_cpu) ? '*' : ' ',
351 376253ec aliguori
                       env->cpu_index);
352 6a00d601 bellard
#if defined(TARGET_I386)
353 376253ec aliguori
        monitor_printf(mon, " pc=0x" TARGET_FMT_lx,
354 376253ec aliguori
                       env->eip + env->segs[R_CS].base);
355 e80e1cc4 bellard
#elif defined(TARGET_PPC)
356 376253ec aliguori
        monitor_printf(mon, " nip=0x" TARGET_FMT_lx, env->nip);
357 ba3c64fb bellard
#elif defined(TARGET_SPARC)
358 376253ec aliguori
        monitor_printf(mon, " pc=0x" TARGET_FMT_lx " npc=0x" TARGET_FMT_lx,
359 376253ec aliguori
                       env->pc, env->npc);
360 ead9360e ths
#elif defined(TARGET_MIPS)
361 376253ec aliguori
        monitor_printf(mon, " PC=0x" TARGET_FMT_lx, env->active_tc.PC);
362 ce5232c5 bellard
#endif
363 ead9360e ths
        if (env->halted)
364 376253ec aliguori
            monitor_printf(mon, " (halted)");
365 376253ec aliguori
        monitor_printf(mon, "\n");
366 6a00d601 bellard
    }
367 6a00d601 bellard
}
368 6a00d601 bellard
369 376253ec aliguori
static void do_cpu_set(Monitor *mon, int index)
370 6a00d601 bellard
{
371 6a00d601 bellard
    if (mon_set_cpu(index) < 0)
372 376253ec aliguori
        monitor_printf(mon, "Invalid CPU index\n");
373 6a00d601 bellard
}
374 6a00d601 bellard
375 376253ec aliguori
static void do_info_jit(Monitor *mon)
376 e3db7226 bellard
{
377 376253ec aliguori
    dump_exec_info((FILE *)mon, monitor_fprintf);
378 e3db7226 bellard
}
379 e3db7226 bellard
380 376253ec aliguori
static void do_info_history(Monitor *mon)
381 aa455485 bellard
{
382 aa455485 bellard
    int i;
383 7e2515e8 bellard
    const char *str;
384 3b46e624 ths
385 cde76ee1 aliguori
    if (!mon->rs)
386 cde76ee1 aliguori
        return;
387 7e2515e8 bellard
    i = 0;
388 7e2515e8 bellard
    for(;;) {
389 731b0364 aliguori
        str = readline_get_history(mon->rs, i);
390 7e2515e8 bellard
        if (!str)
391 7e2515e8 bellard
            break;
392 376253ec aliguori
        monitor_printf(mon, "%d: '%s'\n", i, str);
393 8e3a9fd2 bellard
        i++;
394 aa455485 bellard
    }
395 aa455485 bellard
}
396 aa455485 bellard
397 76a66253 j_mayer
#if defined(TARGET_PPC)
398 76a66253 j_mayer
/* XXX: not implemented in other targets */
399 376253ec aliguori
static void do_info_cpu_stats(Monitor *mon)
400 76a66253 j_mayer
{
401 76a66253 j_mayer
    CPUState *env;
402 76a66253 j_mayer
403 76a66253 j_mayer
    env = mon_get_cpu();
404 376253ec aliguori
    cpu_dump_statistics(env, (FILE *)mon, &monitor_fprintf, 0);
405 76a66253 j_mayer
}
406 76a66253 j_mayer
#endif
407 76a66253 j_mayer
408 376253ec aliguori
static void do_quit(Monitor *mon)
409 9dc39cba bellard
{
410 9dc39cba bellard
    exit(0);
411 9dc39cba bellard
}
412 9dc39cba bellard
413 376253ec aliguori
static int eject_device(Monitor *mon, BlockDriverState *bs, int force)
414 9dc39cba bellard
{
415 9dc39cba bellard
    if (bdrv_is_inserted(bs)) {
416 9dc39cba bellard
        if (!force) {
417 9dc39cba bellard
            if (!bdrv_is_removable(bs)) {
418 376253ec aliguori
                monitor_printf(mon, "device is not removable\n");
419 9dc39cba bellard
                return -1;
420 9dc39cba bellard
            }
421 9dc39cba bellard
            if (bdrv_is_locked(bs)) {
422 376253ec aliguori
                monitor_printf(mon, "device is locked\n");
423 9dc39cba bellard
                return -1;
424 9dc39cba bellard
            }
425 9dc39cba bellard
        }
426 9dc39cba bellard
        bdrv_close(bs);
427 9dc39cba bellard
    }
428 9dc39cba bellard
    return 0;
429 9dc39cba bellard
}
430 9dc39cba bellard
431 376253ec aliguori
static void do_eject(Monitor *mon, int force, const char *filename)
432 9dc39cba bellard
{
433 9dc39cba bellard
    BlockDriverState *bs;
434 9dc39cba bellard
435 9307c4c1 bellard
    bs = bdrv_find(filename);
436 9dc39cba bellard
    if (!bs) {
437 376253ec aliguori
        monitor_printf(mon, "device not found\n");
438 9dc39cba bellard
        return;
439 9dc39cba bellard
    }
440 376253ec aliguori
    eject_device(mon, bs, force);
441 9dc39cba bellard
}
442 9dc39cba bellard
443 376253ec aliguori
static void do_change_block(Monitor *mon, const char *device,
444 376253ec aliguori
                            const char *filename, const char *fmt)
445 9dc39cba bellard
{
446 9dc39cba bellard
    BlockDriverState *bs;
447 2ecea9b8 aurel32
    BlockDriver *drv = NULL;
448 9dc39cba bellard
449 9307c4c1 bellard
    bs = bdrv_find(device);
450 9dc39cba bellard
    if (!bs) {
451 376253ec aliguori
        monitor_printf(mon, "device not found\n");
452 9dc39cba bellard
        return;
453 9dc39cba bellard
    }
454 2ecea9b8 aurel32
    if (fmt) {
455 2ecea9b8 aurel32
        drv = bdrv_find_format(fmt);
456 2ecea9b8 aurel32
        if (!drv) {
457 376253ec aliguori
            monitor_printf(mon, "invalid format %s\n", fmt);
458 2ecea9b8 aurel32
            return;
459 2ecea9b8 aurel32
        }
460 2ecea9b8 aurel32
    }
461 376253ec aliguori
    if (eject_device(mon, bs, 0) < 0)
462 9dc39cba bellard
        return;
463 2ecea9b8 aurel32
    bdrv_open2(bs, filename, 0, drv);
464 376253ec aliguori
    monitor_read_bdrv_key_start(mon, bs, NULL, NULL);
465 bb5fc20f aliguori
}
466 bb5fc20f aliguori
467 376253ec aliguori
static void change_vnc_password_cb(Monitor *mon, const char *password,
468 376253ec aliguori
                                   void *opaque)
469 bb5fc20f aliguori
{
470 bb5fc20f aliguori
    if (vnc_display_password(NULL, password) < 0)
471 376253ec aliguori
        monitor_printf(mon, "could not set VNC server password\n");
472 bb5fc20f aliguori
473 731b0364 aliguori
    monitor_read_command(mon, 1);
474 9dc39cba bellard
}
475 9dc39cba bellard
476 376253ec aliguori
static void do_change_vnc(Monitor *mon, const char *target, const char *arg)
477 e25a5822 ths
{
478 70848515 ths
    if (strcmp(target, "passwd") == 0 ||
479 28a76be8 aliguori
        strcmp(target, "password") == 0) {
480 28a76be8 aliguori
        if (arg) {
481 bb5fc20f aliguori
            char password[9];
482 28a76be8 aliguori
            strncpy(password, arg, sizeof(password));
483 28a76be8 aliguori
            password[sizeof(password) - 1] = '\0';
484 376253ec aliguori
            change_vnc_password_cb(mon, password, NULL);
485 bb5fc20f aliguori
        } else {
486 376253ec aliguori
            monitor_read_password(mon, change_vnc_password_cb, NULL);
487 bb5fc20f aliguori
        }
488 70848515 ths
    } else {
489 28a76be8 aliguori
        if (vnc_display_open(NULL, target) < 0)
490 376253ec aliguori
            monitor_printf(mon, "could not start VNC server on %s\n", target);
491 70848515 ths
    }
492 e25a5822 ths
}
493 e25a5822 ths
494 376253ec aliguori
static void do_change(Monitor *mon, const char *device, const char *target,
495 376253ec aliguori
                      const char *arg)
496 e25a5822 ths
{
497 e25a5822 ths
    if (strcmp(device, "vnc") == 0) {
498 28a76be8 aliguori
        do_change_vnc(mon, target, arg);
499 e25a5822 ths
    } else {
500 28a76be8 aliguori
        do_change_block(mon, device, target, arg);
501 e25a5822 ths
    }
502 e25a5822 ths
}
503 e25a5822 ths
504 376253ec aliguori
static void do_screen_dump(Monitor *mon, const char *filename)
505 59a983b9 bellard
{
506 95219897 pbrook
    vga_hw_screen_dump(filename);
507 59a983b9 bellard
}
508 59a983b9 bellard
509 376253ec aliguori
static void do_logfile(Monitor *mon, const char *filename)
510 e735b91c pbrook
{
511 e735b91c pbrook
    cpu_set_log_filename(filename);
512 e735b91c pbrook
}
513 e735b91c pbrook
514 376253ec aliguori
static void do_log(Monitor *mon, const char *items)
515 f193c797 bellard
{
516 f193c797 bellard
    int mask;
517 3b46e624 ths
518 9307c4c1 bellard
    if (!strcmp(items, "none")) {
519 f193c797 bellard
        mask = 0;
520 f193c797 bellard
    } else {
521 9307c4c1 bellard
        mask = cpu_str_to_log_mask(items);
522 f193c797 bellard
        if (!mask) {
523 376253ec aliguori
            help_cmd(mon, "log");
524 f193c797 bellard
            return;
525 f193c797 bellard
        }
526 f193c797 bellard
    }
527 f193c797 bellard
    cpu_set_log(mask);
528 f193c797 bellard
}
529 f193c797 bellard
530 376253ec aliguori
static void do_stop(Monitor *mon)
531 8a7ddc38 bellard
{
532 8a7ddc38 bellard
    vm_stop(EXCP_INTERRUPT);
533 8a7ddc38 bellard
}
534 8a7ddc38 bellard
535 bb5fc20f aliguori
static void encrypted_bdrv_it(void *opaque, BlockDriverState *bs);
536 c0f4ce77 aliguori
537 376253ec aliguori
struct bdrv_iterate_context {
538 376253ec aliguori
    Monitor *mon;
539 376253ec aliguori
    int err;
540 376253ec aliguori
};
541 376253ec aliguori
542 376253ec aliguori
static void do_cont(Monitor *mon)
543 8a7ddc38 bellard
{
544 376253ec aliguori
    struct bdrv_iterate_context context = { mon, 0 };
545 c0f4ce77 aliguori
546 376253ec aliguori
    bdrv_iterate(encrypted_bdrv_it, &context);
547 c0f4ce77 aliguori
    /* only resume the vm if all keys are set and valid */
548 376253ec aliguori
    if (!context.err)
549 c0f4ce77 aliguori
        vm_start();
550 8a7ddc38 bellard
}
551 8a7ddc38 bellard
552 bb5fc20f aliguori
static void bdrv_key_cb(void *opaque, int err)
553 bb5fc20f aliguori
{
554 376253ec aliguori
    Monitor *mon = opaque;
555 376253ec aliguori
556 bb5fc20f aliguori
    /* another key was set successfully, retry to continue */
557 bb5fc20f aliguori
    if (!err)
558 376253ec aliguori
        do_cont(mon);
559 bb5fc20f aliguori
}
560 bb5fc20f aliguori
561 bb5fc20f aliguori
static void encrypted_bdrv_it(void *opaque, BlockDriverState *bs)
562 bb5fc20f aliguori
{
563 376253ec aliguori
    struct bdrv_iterate_context *context = opaque;
564 bb5fc20f aliguori
565 376253ec aliguori
    if (!context->err && bdrv_key_required(bs)) {
566 376253ec aliguori
        context->err = -EBUSY;
567 376253ec aliguori
        monitor_read_bdrv_key_start(context->mon, bs, bdrv_key_cb,
568 376253ec aliguori
                                    context->mon);
569 bb5fc20f aliguori
    }
570 bb5fc20f aliguori
}
571 bb5fc20f aliguori
572 67b915a5 bellard
#ifdef CONFIG_GDBSTUB
573 376253ec aliguori
static void do_gdbserver(Monitor *mon, const char *port)
574 8a7ddc38 bellard
{
575 cfc3475a pbrook
    if (!port)
576 9307c4c1 bellard
        port = DEFAULT_GDBSTUB_PORT;
577 cfc3475a pbrook
    if (gdbserver_start(port) < 0) {
578 376253ec aliguori
        monitor_printf(mon, "Could not open gdbserver socket on port '%s'\n",
579 376253ec aliguori
                       port);
580 8a7ddc38 bellard
    } else {
581 376253ec aliguori
        monitor_printf(mon, "Waiting gdb connection on port '%s'\n", port);
582 8a7ddc38 bellard
    }
583 8a7ddc38 bellard
}
584 67b915a5 bellard
#endif
585 8a7ddc38 bellard
586 376253ec aliguori
static void monitor_printc(Monitor *mon, int c)
587 9307c4c1 bellard
{
588 376253ec aliguori
    monitor_printf(mon, "'");
589 9307c4c1 bellard
    switch(c) {
590 9307c4c1 bellard
    case '\'':
591 376253ec aliguori
        monitor_printf(mon, "\\'");
592 9307c4c1 bellard
        break;
593 9307c4c1 bellard
    case '\\':
594 376253ec aliguori
        monitor_printf(mon, "\\\\");
595 9307c4c1 bellard
        break;
596 9307c4c1 bellard
    case '\n':
597 376253ec aliguori
        monitor_printf(mon, "\\n");
598 9307c4c1 bellard
        break;
599 9307c4c1 bellard
    case '\r':
600 376253ec aliguori
        monitor_printf(mon, "\\r");
601 9307c4c1 bellard
        break;
602 9307c4c1 bellard
    default:
603 9307c4c1 bellard
        if (c >= 32 && c <= 126) {
604 376253ec aliguori
            monitor_printf(mon, "%c", c);
605 9307c4c1 bellard
        } else {
606 376253ec aliguori
            monitor_printf(mon, "\\x%02x", c);
607 9307c4c1 bellard
        }
608 9307c4c1 bellard
        break;
609 9307c4c1 bellard
    }
610 376253ec aliguori
    monitor_printf(mon, "'");
611 9307c4c1 bellard
}
612 9307c4c1 bellard
613 376253ec aliguori
static void memory_dump(Monitor *mon, int count, int format, int wsize,
614 7743e588 blueswir1
                        target_phys_addr_t addr, int is_physical)
615 9307c4c1 bellard
{
616 6a00d601 bellard
    CPUState *env;
617 9307c4c1 bellard
    int nb_per_line, l, line_size, i, max_digits, len;
618 9307c4c1 bellard
    uint8_t buf[16];
619 9307c4c1 bellard
    uint64_t v;
620 9307c4c1 bellard
621 9307c4c1 bellard
    if (format == 'i') {
622 9307c4c1 bellard
        int flags;
623 9307c4c1 bellard
        flags = 0;
624 6a00d601 bellard
        env = mon_get_cpu();
625 6a00d601 bellard
        if (!env && !is_physical)
626 6a00d601 bellard
            return;
627 9307c4c1 bellard
#ifdef TARGET_I386
628 4c27ba27 bellard
        if (wsize == 2) {
629 9307c4c1 bellard
            flags = 1;
630 4c27ba27 bellard
        } else if (wsize == 4) {
631 4c27ba27 bellard
            flags = 0;
632 4c27ba27 bellard
        } else {
633 6a15fd12 bellard
            /* as default we use the current CS size */
634 4c27ba27 bellard
            flags = 0;
635 6a15fd12 bellard
            if (env) {
636 6a15fd12 bellard
#ifdef TARGET_X86_64
637 5fafdf24 ths
                if ((env->efer & MSR_EFER_LMA) &&
638 6a15fd12 bellard
                    (env->segs[R_CS].flags & DESC_L_MASK))
639 6a15fd12 bellard
                    flags = 2;
640 6a15fd12 bellard
                else
641 6a15fd12 bellard
#endif
642 6a15fd12 bellard
                if (!(env->segs[R_CS].flags & DESC_B_MASK))
643 6a15fd12 bellard
                    flags = 1;
644 6a15fd12 bellard
            }
645 4c27ba27 bellard
        }
646 4c27ba27 bellard
#endif
647 376253ec aliguori
        monitor_disas(mon, env, addr, count, is_physical, flags);
648 9307c4c1 bellard
        return;
649 9307c4c1 bellard
    }
650 9307c4c1 bellard
651 9307c4c1 bellard
    len = wsize * count;
652 9307c4c1 bellard
    if (wsize == 1)
653 9307c4c1 bellard
        line_size = 8;
654 9307c4c1 bellard
    else
655 9307c4c1 bellard
        line_size = 16;
656 9307c4c1 bellard
    nb_per_line = line_size / wsize;
657 9307c4c1 bellard
    max_digits = 0;
658 9307c4c1 bellard
659 9307c4c1 bellard
    switch(format) {
660 9307c4c1 bellard
    case 'o':
661 9307c4c1 bellard
        max_digits = (wsize * 8 + 2) / 3;
662 9307c4c1 bellard
        break;
663 9307c4c1 bellard
    default:
664 9307c4c1 bellard
    case 'x':
665 9307c4c1 bellard
        max_digits = (wsize * 8) / 4;
666 9307c4c1 bellard
        break;
667 9307c4c1 bellard
    case 'u':
668 9307c4c1 bellard
    case 'd':
669 9307c4c1 bellard
        max_digits = (wsize * 8 * 10 + 32) / 33;
670 9307c4c1 bellard
        break;
671 9307c4c1 bellard
    case 'c':
672 9307c4c1 bellard
        wsize = 1;
673 9307c4c1 bellard
        break;
674 9307c4c1 bellard
    }
675 9307c4c1 bellard
676 9307c4c1 bellard
    while (len > 0) {
677 7743e588 blueswir1
        if (is_physical)
678 376253ec aliguori
            monitor_printf(mon, TARGET_FMT_plx ":", addr);
679 7743e588 blueswir1
        else
680 376253ec aliguori
            monitor_printf(mon, TARGET_FMT_lx ":", (target_ulong)addr);
681 9307c4c1 bellard
        l = len;
682 9307c4c1 bellard
        if (l > line_size)
683 9307c4c1 bellard
            l = line_size;
684 9307c4c1 bellard
        if (is_physical) {
685 9307c4c1 bellard
            cpu_physical_memory_rw(addr, buf, l, 0);
686 9307c4c1 bellard
        } else {
687 6a00d601 bellard
            env = mon_get_cpu();
688 6a00d601 bellard
            if (!env)
689 6a00d601 bellard
                break;
690 c8f79b67 aliguori
            if (cpu_memory_rw_debug(env, addr, buf, l, 0) < 0) {
691 376253ec aliguori
                monitor_printf(mon, " Cannot access memory\n");
692 c8f79b67 aliguori
                break;
693 c8f79b67 aliguori
            }
694 9307c4c1 bellard
        }
695 5fafdf24 ths
        i = 0;
696 9307c4c1 bellard
        while (i < l) {
697 9307c4c1 bellard
            switch(wsize) {
698 9307c4c1 bellard
            default:
699 9307c4c1 bellard
            case 1:
700 9307c4c1 bellard
                v = ldub_raw(buf + i);
701 9307c4c1 bellard
                break;
702 9307c4c1 bellard
            case 2:
703 9307c4c1 bellard
                v = lduw_raw(buf + i);
704 9307c4c1 bellard
                break;
705 9307c4c1 bellard
            case 4:
706 92a31b1f bellard
                v = (uint32_t)ldl_raw(buf + i);
707 9307c4c1 bellard
                break;
708 9307c4c1 bellard
            case 8:
709 9307c4c1 bellard
                v = ldq_raw(buf + i);
710 9307c4c1 bellard
                break;
711 9307c4c1 bellard
            }
712 376253ec aliguori
            monitor_printf(mon, " ");
713 9307c4c1 bellard
            switch(format) {
714 9307c4c1 bellard
            case 'o':
715 376253ec aliguori
                monitor_printf(mon, "%#*" PRIo64, max_digits, v);
716 9307c4c1 bellard
                break;
717 9307c4c1 bellard
            case 'x':
718 376253ec aliguori
                monitor_printf(mon, "0x%0*" PRIx64, max_digits, v);
719 9307c4c1 bellard
                break;
720 9307c4c1 bellard
            case 'u':
721 376253ec aliguori
                monitor_printf(mon, "%*" PRIu64, max_digits, v);
722 9307c4c1 bellard
                break;
723 9307c4c1 bellard
            case 'd':
724 376253ec aliguori
                monitor_printf(mon, "%*" PRId64, max_digits, v);
725 9307c4c1 bellard
                break;
726 9307c4c1 bellard
            case 'c':
727 376253ec aliguori
                monitor_printc(mon, v);
728 9307c4c1 bellard
                break;
729 9307c4c1 bellard
            }
730 9307c4c1 bellard
            i += wsize;
731 9307c4c1 bellard
        }
732 376253ec aliguori
        monitor_printf(mon, "\n");
733 9307c4c1 bellard
        addr += l;
734 9307c4c1 bellard
        len -= l;
735 9307c4c1 bellard
    }
736 9307c4c1 bellard
}
737 9307c4c1 bellard
738 92a31b1f bellard
#if TARGET_LONG_BITS == 64
739 92a31b1f bellard
#define GET_TLONG(h, l) (((uint64_t)(h) << 32) | (l))
740 92a31b1f bellard
#else
741 92a31b1f bellard
#define GET_TLONG(h, l) (l)
742 92a31b1f bellard
#endif
743 92a31b1f bellard
744 376253ec aliguori
static void do_memory_dump(Monitor *mon, int count, int format, int size,
745 92a31b1f bellard
                           uint32_t addrh, uint32_t addrl)
746 9307c4c1 bellard
{
747 92a31b1f bellard
    target_long addr = GET_TLONG(addrh, addrl);
748 376253ec aliguori
    memory_dump(mon, count, format, size, addr, 0);
749 9307c4c1 bellard
}
750 9307c4c1 bellard
751 7743e588 blueswir1
#if TARGET_PHYS_ADDR_BITS > 32
752 7743e588 blueswir1
#define GET_TPHYSADDR(h, l) (((uint64_t)(h) << 32) | (l))
753 7743e588 blueswir1
#else
754 7743e588 blueswir1
#define GET_TPHYSADDR(h, l) (l)
755 7743e588 blueswir1
#endif
756 7743e588 blueswir1
757 376253ec aliguori
static void do_physical_memory_dump(Monitor *mon, int count, int format,
758 376253ec aliguori
                                    int size, uint32_t addrh, uint32_t addrl)
759 92a31b1f bellard
760 9307c4c1 bellard
{
761 7743e588 blueswir1
    target_phys_addr_t addr = GET_TPHYSADDR(addrh, addrl);
762 376253ec aliguori
    memory_dump(mon, count, format, size, addr, 1);
763 9307c4c1 bellard
}
764 9307c4c1 bellard
765 376253ec aliguori
static void do_print(Monitor *mon, int count, int format, int size,
766 376253ec aliguori
                     unsigned int valh, unsigned int vall)
767 9307c4c1 bellard
{
768 7743e588 blueswir1
    target_phys_addr_t val = GET_TPHYSADDR(valh, vall);
769 7743e588 blueswir1
#if TARGET_PHYS_ADDR_BITS == 32
770 9307c4c1 bellard
    switch(format) {
771 9307c4c1 bellard
    case 'o':
772 376253ec aliguori
        monitor_printf(mon, "%#o", val);
773 9307c4c1 bellard
        break;
774 9307c4c1 bellard
    case 'x':
775 376253ec aliguori
        monitor_printf(mon, "%#x", val);
776 9307c4c1 bellard
        break;
777 9307c4c1 bellard
    case 'u':
778 376253ec aliguori
        monitor_printf(mon, "%u", val);
779 9307c4c1 bellard
        break;
780 9307c4c1 bellard
    default:
781 9307c4c1 bellard
    case 'd':
782 376253ec aliguori
        monitor_printf(mon, "%d", val);
783 9307c4c1 bellard
        break;
784 9307c4c1 bellard
    case 'c':
785 376253ec aliguori
        monitor_printc(mon, val);
786 9307c4c1 bellard
        break;
787 9307c4c1 bellard
    }
788 92a31b1f bellard
#else
789 92a31b1f bellard
    switch(format) {
790 92a31b1f bellard
    case 'o':
791 376253ec aliguori
        monitor_printf(mon, "%#" PRIo64, val);
792 92a31b1f bellard
        break;
793 92a31b1f bellard
    case 'x':
794 376253ec aliguori
        monitor_printf(mon, "%#" PRIx64, val);
795 92a31b1f bellard
        break;
796 92a31b1f bellard
    case 'u':
797 376253ec aliguori
        monitor_printf(mon, "%" PRIu64, val);
798 92a31b1f bellard
        break;
799 92a31b1f bellard
    default:
800 92a31b1f bellard
    case 'd':
801 376253ec aliguori
        monitor_printf(mon, "%" PRId64, val);
802 92a31b1f bellard
        break;
803 92a31b1f bellard
    case 'c':
804 376253ec aliguori
        monitor_printc(mon, val);
805 92a31b1f bellard
        break;
806 92a31b1f bellard
    }
807 92a31b1f bellard
#endif
808 376253ec aliguori
    monitor_printf(mon, "\n");
809 9307c4c1 bellard
}
810 9307c4c1 bellard
811 376253ec aliguori
static void do_memory_save(Monitor *mon, unsigned int valh, unsigned int vall,
812 b371dc59 bellard
                           uint32_t size, const char *filename)
813 b371dc59 bellard
{
814 b371dc59 bellard
    FILE *f;
815 b371dc59 bellard
    target_long addr = GET_TLONG(valh, vall);
816 b371dc59 bellard
    uint32_t l;
817 b371dc59 bellard
    CPUState *env;
818 b371dc59 bellard
    uint8_t buf[1024];
819 b371dc59 bellard
820 b371dc59 bellard
    env = mon_get_cpu();
821 b371dc59 bellard
    if (!env)
822 b371dc59 bellard
        return;
823 b371dc59 bellard
824 b371dc59 bellard
    f = fopen(filename, "wb");
825 b371dc59 bellard
    if (!f) {
826 376253ec aliguori
        monitor_printf(mon, "could not open '%s'\n", filename);
827 b371dc59 bellard
        return;
828 b371dc59 bellard
    }
829 b371dc59 bellard
    while (size != 0) {
830 b371dc59 bellard
        l = sizeof(buf);
831 b371dc59 bellard
        if (l > size)
832 b371dc59 bellard
            l = size;
833 b371dc59 bellard
        cpu_memory_rw_debug(env, addr, buf, l, 0);
834 b371dc59 bellard
        fwrite(buf, 1, l, f);
835 b371dc59 bellard
        addr += l;
836 b371dc59 bellard
        size -= l;
837 b371dc59 bellard
    }
838 b371dc59 bellard
    fclose(f);
839 b371dc59 bellard
}
840 b371dc59 bellard
841 376253ec aliguori
static void do_physical_memory_save(Monitor *mon, unsigned int valh,
842 376253ec aliguori
                                    unsigned int vall, uint32_t size,
843 376253ec aliguori
                                    const char *filename)
844 a8bdf7a6 aurel32
{
845 a8bdf7a6 aurel32
    FILE *f;
846 a8bdf7a6 aurel32
    uint32_t l;
847 a8bdf7a6 aurel32
    uint8_t buf[1024];
848 339dea27 aurel32
    target_phys_addr_t addr = GET_TPHYSADDR(valh, vall); 
849 a8bdf7a6 aurel32
850 a8bdf7a6 aurel32
    f = fopen(filename, "wb");
851 a8bdf7a6 aurel32
    if (!f) {
852 376253ec aliguori
        monitor_printf(mon, "could not open '%s'\n", filename);
853 a8bdf7a6 aurel32
        return;
854 a8bdf7a6 aurel32
    }
855 a8bdf7a6 aurel32
    while (size != 0) {
856 a8bdf7a6 aurel32
        l = sizeof(buf);
857 a8bdf7a6 aurel32
        if (l > size)
858 a8bdf7a6 aurel32
            l = size;
859 a8bdf7a6 aurel32
        cpu_physical_memory_rw(addr, buf, l, 0);
860 a8bdf7a6 aurel32
        fwrite(buf, 1, l, f);
861 a8bdf7a6 aurel32
        fflush(f);
862 a8bdf7a6 aurel32
        addr += l;
863 a8bdf7a6 aurel32
        size -= l;
864 a8bdf7a6 aurel32
    }
865 a8bdf7a6 aurel32
    fclose(f);
866 a8bdf7a6 aurel32
}
867 a8bdf7a6 aurel32
868 376253ec aliguori
static void do_sum(Monitor *mon, uint32_t start, uint32_t size)
869 e4cf1adc bellard
{
870 e4cf1adc bellard
    uint32_t addr;
871 e4cf1adc bellard
    uint8_t buf[1];
872 e4cf1adc bellard
    uint16_t sum;
873 e4cf1adc bellard
874 e4cf1adc bellard
    sum = 0;
875 e4cf1adc bellard
    for(addr = start; addr < (start + size); addr++) {
876 e4cf1adc bellard
        cpu_physical_memory_rw(addr, buf, 1, 0);
877 e4cf1adc bellard
        /* BSD sum algorithm ('sum' Unix command) */
878 e4cf1adc bellard
        sum = (sum >> 1) | (sum << 15);
879 e4cf1adc bellard
        sum += buf[0];
880 e4cf1adc bellard
    }
881 376253ec aliguori
    monitor_printf(mon, "%05d\n", sum);
882 e4cf1adc bellard
}
883 e4cf1adc bellard
884 a3a91a35 bellard
typedef struct {
885 a3a91a35 bellard
    int keycode;
886 a3a91a35 bellard
    const char *name;
887 a3a91a35 bellard
} KeyDef;
888 a3a91a35 bellard
889 a3a91a35 bellard
static const KeyDef key_defs[] = {
890 a3a91a35 bellard
    { 0x2a, "shift" },
891 a3a91a35 bellard
    { 0x36, "shift_r" },
892 3b46e624 ths
893 a3a91a35 bellard
    { 0x38, "alt" },
894 a3a91a35 bellard
    { 0xb8, "alt_r" },
895 2ba27c7f ths
    { 0x64, "altgr" },
896 2ba27c7f ths
    { 0xe4, "altgr_r" },
897 a3a91a35 bellard
    { 0x1d, "ctrl" },
898 a3a91a35 bellard
    { 0x9d, "ctrl_r" },
899 a3a91a35 bellard
900 a3a91a35 bellard
    { 0xdd, "menu" },
901 a3a91a35 bellard
902 a3a91a35 bellard
    { 0x01, "esc" },
903 a3a91a35 bellard
904 a3a91a35 bellard
    { 0x02, "1" },
905 a3a91a35 bellard
    { 0x03, "2" },
906 a3a91a35 bellard
    { 0x04, "3" },
907 a3a91a35 bellard
    { 0x05, "4" },
908 a3a91a35 bellard
    { 0x06, "5" },
909 a3a91a35 bellard
    { 0x07, "6" },
910 a3a91a35 bellard
    { 0x08, "7" },
911 a3a91a35 bellard
    { 0x09, "8" },
912 a3a91a35 bellard
    { 0x0a, "9" },
913 a3a91a35 bellard
    { 0x0b, "0" },
914 64866c3d bellard
    { 0x0c, "minus" },
915 64866c3d bellard
    { 0x0d, "equal" },
916 a3a91a35 bellard
    { 0x0e, "backspace" },
917 a3a91a35 bellard
918 a3a91a35 bellard
    { 0x0f, "tab" },
919 a3a91a35 bellard
    { 0x10, "q" },
920 a3a91a35 bellard
    { 0x11, "w" },
921 a3a91a35 bellard
    { 0x12, "e" },
922 a3a91a35 bellard
    { 0x13, "r" },
923 a3a91a35 bellard
    { 0x14, "t" },
924 a3a91a35 bellard
    { 0x15, "y" },
925 a3a91a35 bellard
    { 0x16, "u" },
926 a3a91a35 bellard
    { 0x17, "i" },
927 a3a91a35 bellard
    { 0x18, "o" },
928 a3a91a35 bellard
    { 0x19, "p" },
929 a3a91a35 bellard
930 a3a91a35 bellard
    { 0x1c, "ret" },
931 a3a91a35 bellard
932 a3a91a35 bellard
    { 0x1e, "a" },
933 a3a91a35 bellard
    { 0x1f, "s" },
934 a3a91a35 bellard
    { 0x20, "d" },
935 a3a91a35 bellard
    { 0x21, "f" },
936 a3a91a35 bellard
    { 0x22, "g" },
937 a3a91a35 bellard
    { 0x23, "h" },
938 a3a91a35 bellard
    { 0x24, "j" },
939 a3a91a35 bellard
    { 0x25, "k" },
940 a3a91a35 bellard
    { 0x26, "l" },
941 a3a91a35 bellard
942 a3a91a35 bellard
    { 0x2c, "z" },
943 a3a91a35 bellard
    { 0x2d, "x" },
944 a3a91a35 bellard
    { 0x2e, "c" },
945 a3a91a35 bellard
    { 0x2f, "v" },
946 a3a91a35 bellard
    { 0x30, "b" },
947 a3a91a35 bellard
    { 0x31, "n" },
948 a3a91a35 bellard
    { 0x32, "m" },
949 9155fc45 aurel32
    { 0x33, "comma" },
950 9155fc45 aurel32
    { 0x34, "dot" },
951 9155fc45 aurel32
    { 0x35, "slash" },
952 3b46e624 ths
953 4d3b6f6e balrog
    { 0x37, "asterisk" },
954 4d3b6f6e balrog
955 a3a91a35 bellard
    { 0x39, "spc" },
956 00ffa62a bellard
    { 0x3a, "caps_lock" },
957 a3a91a35 bellard
    { 0x3b, "f1" },
958 a3a91a35 bellard
    { 0x3c, "f2" },
959 a3a91a35 bellard
    { 0x3d, "f3" },
960 a3a91a35 bellard
    { 0x3e, "f4" },
961 a3a91a35 bellard
    { 0x3f, "f5" },
962 a3a91a35 bellard
    { 0x40, "f6" },
963 a3a91a35 bellard
    { 0x41, "f7" },
964 a3a91a35 bellard
    { 0x42, "f8" },
965 a3a91a35 bellard
    { 0x43, "f9" },
966 a3a91a35 bellard
    { 0x44, "f10" },
967 00ffa62a bellard
    { 0x45, "num_lock" },
968 a3a91a35 bellard
    { 0x46, "scroll_lock" },
969 a3a91a35 bellard
970 64866c3d bellard
    { 0xb5, "kp_divide" },
971 64866c3d bellard
    { 0x37, "kp_multiply" },
972 0cfec834 ths
    { 0x4a, "kp_subtract" },
973 64866c3d bellard
    { 0x4e, "kp_add" },
974 64866c3d bellard
    { 0x9c, "kp_enter" },
975 64866c3d bellard
    { 0x53, "kp_decimal" },
976 f2289cb6 balrog
    { 0x54, "sysrq" },
977 64866c3d bellard
978 64866c3d bellard
    { 0x52, "kp_0" },
979 64866c3d bellard
    { 0x4f, "kp_1" },
980 64866c3d bellard
    { 0x50, "kp_2" },
981 64866c3d bellard
    { 0x51, "kp_3" },
982 64866c3d bellard
    { 0x4b, "kp_4" },
983 64866c3d bellard
    { 0x4c, "kp_5" },
984 64866c3d bellard
    { 0x4d, "kp_6" },
985 64866c3d bellard
    { 0x47, "kp_7" },
986 64866c3d bellard
    { 0x48, "kp_8" },
987 64866c3d bellard
    { 0x49, "kp_9" },
988 3b46e624 ths
989 a3a91a35 bellard
    { 0x56, "<" },
990 a3a91a35 bellard
991 a3a91a35 bellard
    { 0x57, "f11" },
992 a3a91a35 bellard
    { 0x58, "f12" },
993 a3a91a35 bellard
994 a3a91a35 bellard
    { 0xb7, "print" },
995 a3a91a35 bellard
996 a3a91a35 bellard
    { 0xc7, "home" },
997 a3a91a35 bellard
    { 0xc9, "pgup" },
998 a3a91a35 bellard
    { 0xd1, "pgdn" },
999 a3a91a35 bellard
    { 0xcf, "end" },
1000 a3a91a35 bellard
1001 a3a91a35 bellard
    { 0xcb, "left" },
1002 a3a91a35 bellard
    { 0xc8, "up" },
1003 a3a91a35 bellard
    { 0xd0, "down" },
1004 a3a91a35 bellard
    { 0xcd, "right" },
1005 a3a91a35 bellard
1006 a3a91a35 bellard
    { 0xd2, "insert" },
1007 a3a91a35 bellard
    { 0xd3, "delete" },
1008 c0b5b109 blueswir1
#if defined(TARGET_SPARC) && !defined(TARGET_SPARC64)
1009 c0b5b109 blueswir1
    { 0xf0, "stop" },
1010 c0b5b109 blueswir1
    { 0xf1, "again" },
1011 c0b5b109 blueswir1
    { 0xf2, "props" },
1012 c0b5b109 blueswir1
    { 0xf3, "undo" },
1013 c0b5b109 blueswir1
    { 0xf4, "front" },
1014 c0b5b109 blueswir1
    { 0xf5, "copy" },
1015 c0b5b109 blueswir1
    { 0xf6, "open" },
1016 c0b5b109 blueswir1
    { 0xf7, "paste" },
1017 c0b5b109 blueswir1
    { 0xf8, "find" },
1018 c0b5b109 blueswir1
    { 0xf9, "cut" },
1019 c0b5b109 blueswir1
    { 0xfa, "lf" },
1020 c0b5b109 blueswir1
    { 0xfb, "help" },
1021 c0b5b109 blueswir1
    { 0xfc, "meta_l" },
1022 c0b5b109 blueswir1
    { 0xfd, "meta_r" },
1023 c0b5b109 blueswir1
    { 0xfe, "compose" },
1024 c0b5b109 blueswir1
#endif
1025 a3a91a35 bellard
    { 0, NULL },
1026 a3a91a35 bellard
};
1027 a3a91a35 bellard
1028 a3a91a35 bellard
static int get_keycode(const char *key)
1029 a3a91a35 bellard
{
1030 a3a91a35 bellard
    const KeyDef *p;
1031 64866c3d bellard
    char *endp;
1032 64866c3d bellard
    int ret;
1033 a3a91a35 bellard
1034 a3a91a35 bellard
    for(p = key_defs; p->name != NULL; p++) {
1035 a3a91a35 bellard
        if (!strcmp(key, p->name))
1036 a3a91a35 bellard
            return p->keycode;
1037 a3a91a35 bellard
    }
1038 64866c3d bellard
    if (strstart(key, "0x", NULL)) {
1039 64866c3d bellard
        ret = strtoul(key, &endp, 0);
1040 64866c3d bellard
        if (*endp == '\0' && ret >= 0x01 && ret <= 0xff)
1041 64866c3d bellard
            return ret;
1042 64866c3d bellard
    }
1043 a3a91a35 bellard
    return -1;
1044 a3a91a35 bellard
}
1045 a3a91a35 bellard
1046 c8256f9d balrog
#define MAX_KEYCODES 16
1047 c8256f9d balrog
static uint8_t keycodes[MAX_KEYCODES];
1048 c8256f9d balrog
static int nb_pending_keycodes;
1049 c8256f9d balrog
static QEMUTimer *key_timer;
1050 c8256f9d balrog
1051 c8256f9d balrog
static void release_keys(void *opaque)
1052 c8256f9d balrog
{
1053 c8256f9d balrog
    int keycode;
1054 c8256f9d balrog
1055 c8256f9d balrog
    while (nb_pending_keycodes > 0) {
1056 c8256f9d balrog
        nb_pending_keycodes--;
1057 c8256f9d balrog
        keycode = keycodes[nb_pending_keycodes];
1058 c8256f9d balrog
        if (keycode & 0x80)
1059 c8256f9d balrog
            kbd_put_keycode(0xe0);
1060 c8256f9d balrog
        kbd_put_keycode(keycode | 0x80);
1061 c8256f9d balrog
    }
1062 c8256f9d balrog
}
1063 c8256f9d balrog
1064 376253ec aliguori
static void do_sendkey(Monitor *mon, const char *string, int has_hold_time,
1065 376253ec aliguori
                       int hold_time)
1066 a3a91a35 bellard
{
1067 3401c0d9 balrog
    char keyname_buf[16];
1068 3401c0d9 balrog
    char *separator;
1069 3401c0d9 balrog
    int keyname_len, keycode, i;
1070 3401c0d9 balrog
1071 c8256f9d balrog
    if (nb_pending_keycodes > 0) {
1072 c8256f9d balrog
        qemu_del_timer(key_timer);
1073 c8256f9d balrog
        release_keys(NULL);
1074 c8256f9d balrog
    }
1075 c8256f9d balrog
    if (!has_hold_time)
1076 c8256f9d balrog
        hold_time = 100;
1077 c8256f9d balrog
    i = 0;
1078 3401c0d9 balrog
    while (1) {
1079 3401c0d9 balrog
        separator = strchr(string, '-');
1080 3401c0d9 balrog
        keyname_len = separator ? separator - string : strlen(string);
1081 3401c0d9 balrog
        if (keyname_len > 0) {
1082 3401c0d9 balrog
            pstrcpy(keyname_buf, sizeof(keyname_buf), string);
1083 3401c0d9 balrog
            if (keyname_len > sizeof(keyname_buf) - 1) {
1084 376253ec aliguori
                monitor_printf(mon, "invalid key: '%s...'\n", keyname_buf);
1085 3401c0d9 balrog
                return;
1086 a3a91a35 bellard
            }
1087 c8256f9d balrog
            if (i == MAX_KEYCODES) {
1088 376253ec aliguori
                monitor_printf(mon, "too many keys\n");
1089 3401c0d9 balrog
                return;
1090 3401c0d9 balrog
            }
1091 3401c0d9 balrog
            keyname_buf[keyname_len] = 0;
1092 3401c0d9 balrog
            keycode = get_keycode(keyname_buf);
1093 3401c0d9 balrog
            if (keycode < 0) {
1094 376253ec aliguori
                monitor_printf(mon, "unknown key: '%s'\n", keyname_buf);
1095 3401c0d9 balrog
                return;
1096 3401c0d9 balrog
            }
1097 c8256f9d balrog
            keycodes[i++] = keycode;
1098 a3a91a35 bellard
        }
1099 3401c0d9 balrog
        if (!separator)
1100 a3a91a35 bellard
            break;
1101 3401c0d9 balrog
        string = separator + 1;
1102 a3a91a35 bellard
    }
1103 c8256f9d balrog
    nb_pending_keycodes = i;
1104 a3a91a35 bellard
    /* key down events */
1105 c8256f9d balrog
    for (i = 0; i < nb_pending_keycodes; i++) {
1106 a3a91a35 bellard
        keycode = keycodes[i];
1107 a3a91a35 bellard
        if (keycode & 0x80)
1108 a3a91a35 bellard
            kbd_put_keycode(0xe0);
1109 a3a91a35 bellard
        kbd_put_keycode(keycode & 0x7f);
1110 a3a91a35 bellard
    }
1111 c8256f9d balrog
    /* delayed key up events */
1112 f227f17d balrog
    qemu_mod_timer(key_timer, qemu_get_clock(vm_clock) +
1113 f227f17d balrog
                    muldiv64(ticks_per_sec, hold_time, 1000));
1114 a3a91a35 bellard
}
1115 a3a91a35 bellard
1116 13224a87 bellard
static int mouse_button_state;
1117 13224a87 bellard
1118 376253ec aliguori
static void do_mouse_move(Monitor *mon, const char *dx_str, const char *dy_str,
1119 13224a87 bellard
                          const char *dz_str)
1120 13224a87 bellard
{
1121 13224a87 bellard
    int dx, dy, dz;
1122 13224a87 bellard
    dx = strtol(dx_str, NULL, 0);
1123 13224a87 bellard
    dy = strtol(dy_str, NULL, 0);
1124 13224a87 bellard
    dz = 0;
1125 5fafdf24 ths
    if (dz_str)
1126 13224a87 bellard
        dz = strtol(dz_str, NULL, 0);
1127 13224a87 bellard
    kbd_mouse_event(dx, dy, dz, mouse_button_state);
1128 13224a87 bellard
}
1129 13224a87 bellard
1130 376253ec aliguori
static void do_mouse_button(Monitor *mon, int button_state)
1131 13224a87 bellard
{
1132 13224a87 bellard
    mouse_button_state = button_state;
1133 13224a87 bellard
    kbd_mouse_event(0, 0, 0, mouse_button_state);
1134 13224a87 bellard
}
1135 13224a87 bellard
1136 376253ec aliguori
static void do_ioport_read(Monitor *mon, int count, int format, int size,
1137 376253ec aliguori
                           int addr, int has_index, int index)
1138 3440557b bellard
{
1139 3440557b bellard
    uint32_t val;
1140 3440557b bellard
    int suffix;
1141 3440557b bellard
1142 3440557b bellard
    if (has_index) {
1143 3440557b bellard
        cpu_outb(NULL, addr & 0xffff, index & 0xff);
1144 3440557b bellard
        addr++;
1145 3440557b bellard
    }
1146 3440557b bellard
    addr &= 0xffff;
1147 3440557b bellard
1148 3440557b bellard
    switch(size) {
1149 3440557b bellard
    default:
1150 3440557b bellard
    case 1:
1151 3440557b bellard
        val = cpu_inb(NULL, addr);
1152 3440557b bellard
        suffix = 'b';
1153 3440557b bellard
        break;
1154 3440557b bellard
    case 2:
1155 3440557b bellard
        val = cpu_inw(NULL, addr);
1156 3440557b bellard
        suffix = 'w';
1157 3440557b bellard
        break;
1158 3440557b bellard
    case 4:
1159 3440557b bellard
        val = cpu_inl(NULL, addr);
1160 3440557b bellard
        suffix = 'l';
1161 3440557b bellard
        break;
1162 3440557b bellard
    }
1163 376253ec aliguori
    monitor_printf(mon, "port%c[0x%04x] = %#0*x\n",
1164 376253ec aliguori
                   suffix, addr, size * 2, val);
1165 3440557b bellard
}
1166 a3a91a35 bellard
1167 3b4366de blueswir1
/* boot_set handler */
1168 3b4366de blueswir1
static QEMUBootSetHandler *qemu_boot_set_handler = NULL;
1169 3b4366de blueswir1
static void *boot_opaque;
1170 3b4366de blueswir1
1171 3b4366de blueswir1
void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque)
1172 3b4366de blueswir1
{
1173 3b4366de blueswir1
    qemu_boot_set_handler = func;
1174 3b4366de blueswir1
    boot_opaque = opaque;
1175 3b4366de blueswir1
}
1176 3b4366de blueswir1
1177 376253ec aliguori
static void do_boot_set(Monitor *mon, const char *bootdevice)
1178 0ecdffbb aurel32
{
1179 0ecdffbb aurel32
    int res;
1180 0ecdffbb aurel32
1181 0ecdffbb aurel32
    if (qemu_boot_set_handler)  {
1182 3b4366de blueswir1
        res = qemu_boot_set_handler(boot_opaque, bootdevice);
1183 0ecdffbb aurel32
        if (res == 0)
1184 376253ec aliguori
            monitor_printf(mon, "boot device list now set to %s\n",
1185 376253ec aliguori
                           bootdevice);
1186 0ecdffbb aurel32
        else
1187 376253ec aliguori
            monitor_printf(mon, "setting boot device list failed with "
1188 376253ec aliguori
                           "error %i\n", res);
1189 0ecdffbb aurel32
    } else {
1190 376253ec aliguori
        monitor_printf(mon, "no function defined to set boot device list for "
1191 376253ec aliguori
                       "this architecture\n");
1192 0ecdffbb aurel32
    }
1193 0ecdffbb aurel32
}
1194 0ecdffbb aurel32
1195 376253ec aliguori
static void do_system_reset(Monitor *mon)
1196 e4f9082b bellard
{
1197 e4f9082b bellard
    qemu_system_reset_request();
1198 e4f9082b bellard
}
1199 e4f9082b bellard
1200 376253ec aliguori
static void do_system_powerdown(Monitor *mon)
1201 3475187d bellard
{
1202 3475187d bellard
    qemu_system_powerdown_request();
1203 3475187d bellard
}
1204 3475187d bellard
1205 b86bda5b bellard
#if defined(TARGET_I386)
1206 376253ec aliguori
static void print_pte(Monitor *mon, uint32_t addr, uint32_t pte, uint32_t mask)
1207 b86bda5b bellard
{
1208 376253ec aliguori
    monitor_printf(mon, "%08x: %08x %c%c%c%c%c%c%c%c\n",
1209 376253ec aliguori
                   addr,
1210 376253ec aliguori
                   pte & mask,
1211 376253ec aliguori
                   pte & PG_GLOBAL_MASK ? 'G' : '-',
1212 376253ec aliguori
                   pte & PG_PSE_MASK ? 'P' : '-',
1213 376253ec aliguori
                   pte & PG_DIRTY_MASK ? 'D' : '-',
1214 376253ec aliguori
                   pte & PG_ACCESSED_MASK ? 'A' : '-',
1215 376253ec aliguori
                   pte & PG_PCD_MASK ? 'C' : '-',
1216 376253ec aliguori
                   pte & PG_PWT_MASK ? 'T' : '-',
1217 376253ec aliguori
                   pte & PG_USER_MASK ? 'U' : '-',
1218 376253ec aliguori
                   pte & PG_RW_MASK ? 'W' : '-');
1219 b86bda5b bellard
}
1220 b86bda5b bellard
1221 376253ec aliguori
static void tlb_info(Monitor *mon)
1222 b86bda5b bellard
{
1223 6a00d601 bellard
    CPUState *env;
1224 b86bda5b bellard
    int l1, l2;
1225 b86bda5b bellard
    uint32_t pgd, pde, pte;
1226 b86bda5b bellard
1227 6a00d601 bellard
    env = mon_get_cpu();
1228 6a00d601 bellard
    if (!env)
1229 6a00d601 bellard
        return;
1230 6a00d601 bellard
1231 b86bda5b bellard
    if (!(env->cr[0] & CR0_PG_MASK)) {
1232 376253ec aliguori
        monitor_printf(mon, "PG disabled\n");
1233 b86bda5b bellard
        return;
1234 b86bda5b bellard
    }
1235 b86bda5b bellard
    pgd = env->cr[3] & ~0xfff;
1236 b86bda5b bellard
    for(l1 = 0; l1 < 1024; l1++) {
1237 b86bda5b bellard
        cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4);
1238 b86bda5b bellard
        pde = le32_to_cpu(pde);
1239 b86bda5b bellard
        if (pde & PG_PRESENT_MASK) {
1240 b86bda5b bellard
            if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
1241 376253ec aliguori
                print_pte(mon, (l1 << 22), pde, ~((1 << 20) - 1));
1242 b86bda5b bellard
            } else {
1243 b86bda5b bellard
                for(l2 = 0; l2 < 1024; l2++) {
1244 5fafdf24 ths
                    cpu_physical_memory_read((pde & ~0xfff) + l2 * 4,
1245 b86bda5b bellard
                                             (uint8_t *)&pte, 4);
1246 b86bda5b bellard
                    pte = le32_to_cpu(pte);
1247 b86bda5b bellard
                    if (pte & PG_PRESENT_MASK) {
1248 376253ec aliguori
                        print_pte(mon, (l1 << 22) + (l2 << 12),
1249 5fafdf24 ths
                                  pte & ~PG_PSE_MASK,
1250 b86bda5b bellard
                                  ~0xfff);
1251 b86bda5b bellard
                    }
1252 b86bda5b bellard
                }
1253 b86bda5b bellard
            }
1254 b86bda5b bellard
        }
1255 b86bda5b bellard
    }
1256 b86bda5b bellard
}
1257 b86bda5b bellard
1258 376253ec aliguori
static void mem_print(Monitor *mon, uint32_t *pstart, int *plast_prot,
1259 b86bda5b bellard
                      uint32_t end, int prot)
1260 b86bda5b bellard
{
1261 9746b15b bellard
    int prot1;
1262 9746b15b bellard
    prot1 = *plast_prot;
1263 9746b15b bellard
    if (prot != prot1) {
1264 b86bda5b bellard
        if (*pstart != -1) {
1265 376253ec aliguori
            monitor_printf(mon, "%08x-%08x %08x %c%c%c\n",
1266 376253ec aliguori
                           *pstart, end, end - *pstart,
1267 376253ec aliguori
                           prot1 & PG_USER_MASK ? 'u' : '-',
1268 376253ec aliguori
                           'r',
1269 376253ec aliguori
                           prot1 & PG_RW_MASK ? 'w' : '-');
1270 b86bda5b bellard
        }
1271 b86bda5b bellard
        if (prot != 0)
1272 b86bda5b bellard
            *pstart = end;
1273 b86bda5b bellard
        else
1274 b86bda5b bellard
            *pstart = -1;
1275 b86bda5b bellard
        *plast_prot = prot;
1276 b86bda5b bellard
    }
1277 b86bda5b bellard
}
1278 b86bda5b bellard
1279 376253ec aliguori
static void mem_info(Monitor *mon)
1280 b86bda5b bellard
{
1281 6a00d601 bellard
    CPUState *env;
1282 b86bda5b bellard
    int l1, l2, prot, last_prot;
1283 b86bda5b bellard
    uint32_t pgd, pde, pte, start, end;
1284 b86bda5b bellard
1285 6a00d601 bellard
    env = mon_get_cpu();
1286 6a00d601 bellard
    if (!env)
1287 6a00d601 bellard
        return;
1288 6a00d601 bellard
1289 b86bda5b bellard
    if (!(env->cr[0] & CR0_PG_MASK)) {
1290 376253ec aliguori
        monitor_printf(mon, "PG disabled\n");
1291 b86bda5b bellard
        return;
1292 b86bda5b bellard
    }
1293 b86bda5b bellard
    pgd = env->cr[3] & ~0xfff;
1294 b86bda5b bellard
    last_prot = 0;
1295 b86bda5b bellard
    start = -1;
1296 b86bda5b bellard
    for(l1 = 0; l1 < 1024; l1++) {
1297 b86bda5b bellard
        cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4);
1298 b86bda5b bellard
        pde = le32_to_cpu(pde);
1299 b86bda5b bellard
        end = l1 << 22;
1300 b86bda5b bellard
        if (pde & PG_PRESENT_MASK) {
1301 b86bda5b bellard
            if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
1302 b86bda5b bellard
                prot = pde & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
1303 376253ec aliguori
                mem_print(mon, &start, &last_prot, end, prot);
1304 b86bda5b bellard
            } else {
1305 b86bda5b bellard
                for(l2 = 0; l2 < 1024; l2++) {
1306 5fafdf24 ths
                    cpu_physical_memory_read((pde & ~0xfff) + l2 * 4,
1307 b86bda5b bellard
                                             (uint8_t *)&pte, 4);
1308 b86bda5b bellard
                    pte = le32_to_cpu(pte);
1309 b86bda5b bellard
                    end = (l1 << 22) + (l2 << 12);
1310 b86bda5b bellard
                    if (pte & PG_PRESENT_MASK) {
1311 b86bda5b bellard
                        prot = pte & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
1312 b86bda5b bellard
                    } else {
1313 b86bda5b bellard
                        prot = 0;
1314 b86bda5b bellard
                    }
1315 376253ec aliguori
                    mem_print(mon, &start, &last_prot, end, prot);
1316 b86bda5b bellard
                }
1317 b86bda5b bellard
            }
1318 b86bda5b bellard
        } else {
1319 b86bda5b bellard
            prot = 0;
1320 376253ec aliguori
            mem_print(mon, &start, &last_prot, end, prot);
1321 b86bda5b bellard
        }
1322 b86bda5b bellard
    }
1323 b86bda5b bellard
}
1324 b86bda5b bellard
#endif
1325 b86bda5b bellard
1326 7c664e2f aurel32
#if defined(TARGET_SH4)
1327 7c664e2f aurel32
1328 376253ec aliguori
static void print_tlb(Monitor *mon, int idx, tlb_t *tlb)
1329 7c664e2f aurel32
{
1330 376253ec aliguori
    monitor_printf(mon, " tlb%i:\t"
1331 376253ec aliguori
                   "asid=%hhu vpn=%x\tppn=%x\tsz=%hhu size=%u\t"
1332 376253ec aliguori
                   "v=%hhu shared=%hhu cached=%hhu prot=%hhu "
1333 376253ec aliguori
                   "dirty=%hhu writethrough=%hhu\n",
1334 376253ec aliguori
                   idx,
1335 376253ec aliguori
                   tlb->asid, tlb->vpn, tlb->ppn, tlb->sz, tlb->size,
1336 376253ec aliguori
                   tlb->v, tlb->sh, tlb->c, tlb->pr,
1337 376253ec aliguori
                   tlb->d, tlb->wt);
1338 7c664e2f aurel32
}
1339 7c664e2f aurel32
1340 376253ec aliguori
static void tlb_info(Monitor *mon)
1341 7c664e2f aurel32
{
1342 7c664e2f aurel32
    CPUState *env = mon_get_cpu();
1343 7c664e2f aurel32
    int i;
1344 7c664e2f aurel32
1345 376253ec aliguori
    monitor_printf (mon, "ITLB:\n");
1346 7c664e2f aurel32
    for (i = 0 ; i < ITLB_SIZE ; i++)
1347 376253ec aliguori
        print_tlb (mon, i, &env->itlb[i]);
1348 376253ec aliguori
    monitor_printf (mon, "UTLB:\n");
1349 7c664e2f aurel32
    for (i = 0 ; i < UTLB_SIZE ; i++)
1350 376253ec aliguori
        print_tlb (mon, i, &env->utlb[i]);
1351 7c664e2f aurel32
}
1352 7c664e2f aurel32
1353 7c664e2f aurel32
#endif
1354 7c664e2f aurel32
1355 376253ec aliguori
static void do_info_kqemu(Monitor *mon)
1356 0f4c6415 bellard
{
1357 0f4c6415 bellard
#ifdef USE_KQEMU
1358 6a00d601 bellard
    CPUState *env;
1359 0f4c6415 bellard
    int val;
1360 0f4c6415 bellard
    val = 0;
1361 6a00d601 bellard
    env = mon_get_cpu();
1362 6a00d601 bellard
    if (!env) {
1363 376253ec aliguori
        monitor_printf(mon, "No cpu initialized yet");
1364 6a00d601 bellard
        return;
1365 6a00d601 bellard
    }
1366 6a00d601 bellard
    val = env->kqemu_enabled;
1367 376253ec aliguori
    monitor_printf(mon, "kqemu support: ");
1368 5f1ce948 bellard
    switch(val) {
1369 5f1ce948 bellard
    default:
1370 5f1ce948 bellard
    case 0:
1371 376253ec aliguori
        monitor_printf(mon, "disabled\n");
1372 5f1ce948 bellard
        break;
1373 5f1ce948 bellard
    case 1:
1374 376253ec aliguori
        monitor_printf(mon, "enabled for user code\n");
1375 5f1ce948 bellard
        break;
1376 5f1ce948 bellard
    case 2:
1377 376253ec aliguori
        monitor_printf(mon, "enabled for user and kernel code\n");
1378 5f1ce948 bellard
        break;
1379 5f1ce948 bellard
    }
1380 0f4c6415 bellard
#else
1381 376253ec aliguori
    monitor_printf(mon, "kqemu support: not compiled\n");
1382 0f4c6415 bellard
#endif
1383 5fafdf24 ths
}
1384 0f4c6415 bellard
1385 376253ec aliguori
static void do_info_kvm(Monitor *mon)
1386 7ba1e619 aliguori
{
1387 7ba1e619 aliguori
#ifdef CONFIG_KVM
1388 376253ec aliguori
    monitor_printf(mon, "kvm support: ");
1389 7ba1e619 aliguori
    if (kvm_enabled())
1390 376253ec aliguori
        monitor_printf(mon, "enabled\n");
1391 7ba1e619 aliguori
    else
1392 376253ec aliguori
        monitor_printf(mon, "disabled\n");
1393 7ba1e619 aliguori
#else
1394 376253ec aliguori
    monitor_printf(mon, "kvm support: not compiled\n");
1395 7ba1e619 aliguori
#endif
1396 7ba1e619 aliguori
}
1397 7ba1e619 aliguori
1398 5f1ce948 bellard
#ifdef CONFIG_PROFILER
1399 5f1ce948 bellard
1400 5f1ce948 bellard
int64_t kqemu_time;
1401 5f1ce948 bellard
int64_t qemu_time;
1402 5f1ce948 bellard
int64_t kqemu_exec_count;
1403 5f1ce948 bellard
int64_t dev_time;
1404 5f1ce948 bellard
int64_t kqemu_ret_int_count;
1405 5f1ce948 bellard
int64_t kqemu_ret_excp_count;
1406 5f1ce948 bellard
int64_t kqemu_ret_intr_count;
1407 5f1ce948 bellard
1408 376253ec aliguori
static void do_info_profile(Monitor *mon)
1409 5f1ce948 bellard
{
1410 5f1ce948 bellard
    int64_t total;
1411 5f1ce948 bellard
    total = qemu_time;
1412 5f1ce948 bellard
    if (total == 0)
1413 5f1ce948 bellard
        total = 1;
1414 376253ec aliguori
    monitor_printf(mon, "async time  %" PRId64 " (%0.3f)\n",
1415 376253ec aliguori
                   dev_time, dev_time / (double)ticks_per_sec);
1416 376253ec aliguori
    monitor_printf(mon, "qemu time   %" PRId64 " (%0.3f)\n",
1417 376253ec aliguori
                   qemu_time, qemu_time / (double)ticks_per_sec);
1418 376253ec aliguori
    monitor_printf(mon, "kqemu time  %" PRId64 " (%0.3f %0.1f%%) count=%"
1419 376253ec aliguori
                        PRId64 " int=%" PRId64 " excp=%" PRId64 " intr=%"
1420 376253ec aliguori
                        PRId64 "\n",
1421 376253ec aliguori
                   kqemu_time, kqemu_time / (double)ticks_per_sec,
1422 376253ec aliguori
                   kqemu_time / (double)total * 100.0,
1423 376253ec aliguori
                   kqemu_exec_count,
1424 376253ec aliguori
                   kqemu_ret_int_count,
1425 376253ec aliguori
                   kqemu_ret_excp_count,
1426 376253ec aliguori
                   kqemu_ret_intr_count);
1427 5f1ce948 bellard
    qemu_time = 0;
1428 5f1ce948 bellard
    kqemu_time = 0;
1429 5f1ce948 bellard
    kqemu_exec_count = 0;
1430 5f1ce948 bellard
    dev_time = 0;
1431 5f1ce948 bellard
    kqemu_ret_int_count = 0;
1432 5f1ce948 bellard
    kqemu_ret_excp_count = 0;
1433 5f1ce948 bellard
    kqemu_ret_intr_count = 0;
1434 5f1ce948 bellard
#ifdef USE_KQEMU
1435 5f1ce948 bellard
    kqemu_record_dump();
1436 5f1ce948 bellard
#endif
1437 5f1ce948 bellard
}
1438 5f1ce948 bellard
#else
1439 376253ec aliguori
static void do_info_profile(Monitor *mon)
1440 5f1ce948 bellard
{
1441 376253ec aliguori
    monitor_printf(mon, "Internal profiler not compiled\n");
1442 5f1ce948 bellard
}
1443 5f1ce948 bellard
#endif
1444 5f1ce948 bellard
1445 ec36b695 bellard
/* Capture support */
1446 ec36b695 bellard
static LIST_HEAD (capture_list_head, CaptureState) capture_head;
1447 ec36b695 bellard
1448 376253ec aliguori
static void do_info_capture(Monitor *mon)
1449 ec36b695 bellard
{
1450 ec36b695 bellard
    int i;
1451 ec36b695 bellard
    CaptureState *s;
1452 ec36b695 bellard
1453 ec36b695 bellard
    for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1454 376253ec aliguori
        monitor_printf(mon, "[%d]: ", i);
1455 ec36b695 bellard
        s->ops.info (s->opaque);
1456 ec36b695 bellard
    }
1457 ec36b695 bellard
}
1458 ec36b695 bellard
1459 376253ec aliguori
static void do_stop_capture(Monitor *mon, int n)
1460 ec36b695 bellard
{
1461 ec36b695 bellard
    int i;
1462 ec36b695 bellard
    CaptureState *s;
1463 ec36b695 bellard
1464 ec36b695 bellard
    for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
1465 ec36b695 bellard
        if (i == n) {
1466 ec36b695 bellard
            s->ops.destroy (s->opaque);
1467 ec36b695 bellard
            LIST_REMOVE (s, entries);
1468 ec36b695 bellard
            qemu_free (s);
1469 ec36b695 bellard
            return;
1470 ec36b695 bellard
        }
1471 ec36b695 bellard
    }
1472 ec36b695 bellard
}
1473 ec36b695 bellard
1474 ec36b695 bellard
#ifdef HAS_AUDIO
1475 376253ec aliguori
static void do_wav_capture(Monitor *mon, const char *path,
1476 376253ec aliguori
                           int has_freq, int freq,
1477 376253ec aliguori
                           int has_bits, int bits,
1478 376253ec aliguori
                           int has_channels, int nchannels)
1479 ec36b695 bellard
{
1480 ec36b695 bellard
    CaptureState *s;
1481 ec36b695 bellard
1482 ec36b695 bellard
    s = qemu_mallocz (sizeof (*s));
1483 ec36b695 bellard
1484 ec36b695 bellard
    freq = has_freq ? freq : 44100;
1485 ec36b695 bellard
    bits = has_bits ? bits : 16;
1486 ec36b695 bellard
    nchannels = has_channels ? nchannels : 2;
1487 ec36b695 bellard
1488 ec36b695 bellard
    if (wav_start_capture (s, path, freq, bits, nchannels)) {
1489 376253ec aliguori
        monitor_printf(mon, "Faied to add wave capture\n");
1490 ec36b695 bellard
        qemu_free (s);
1491 ec36b695 bellard
    }
1492 ec36b695 bellard
    LIST_INSERT_HEAD (&capture_head, s, entries);
1493 ec36b695 bellard
}
1494 ec36b695 bellard
#endif
1495 ec36b695 bellard
1496 dc1c0b74 aurel32
#if defined(TARGET_I386)
1497 376253ec aliguori
static void do_inject_nmi(Monitor *mon, int cpu_index)
1498 dc1c0b74 aurel32
{
1499 dc1c0b74 aurel32
    CPUState *env;
1500 dc1c0b74 aurel32
1501 dc1c0b74 aurel32
    for (env = first_cpu; env != NULL; env = env->next_cpu)
1502 dc1c0b74 aurel32
        if (env->cpu_index == cpu_index) {
1503 dc1c0b74 aurel32
            cpu_interrupt(env, CPU_INTERRUPT_NMI);
1504 dc1c0b74 aurel32
            break;
1505 dc1c0b74 aurel32
        }
1506 dc1c0b74 aurel32
}
1507 dc1c0b74 aurel32
#endif
1508 dc1c0b74 aurel32
1509 376253ec aliguori
static void do_info_status(Monitor *mon)
1510 6f9c5ee7 aurel32
{
1511 6f9c5ee7 aurel32
    if (vm_running)
1512 376253ec aliguori
       monitor_printf(mon, "VM status: running\n");
1513 6f9c5ee7 aurel32
    else
1514 376253ec aliguori
       monitor_printf(mon, "VM status: paused\n");
1515 6f9c5ee7 aurel32
}
1516 6f9c5ee7 aurel32
1517 6f9c5ee7 aurel32
1518 376253ec aliguori
static void do_balloon(Monitor *mon, int value)
1519 df751fa8 aliguori
{
1520 df751fa8 aliguori
    ram_addr_t target = value;
1521 df751fa8 aliguori
    qemu_balloon(target << 20);
1522 df751fa8 aliguori
}
1523 df751fa8 aliguori
1524 376253ec aliguori
static void do_info_balloon(Monitor *mon)
1525 df751fa8 aliguori
{
1526 df751fa8 aliguori
    ram_addr_t actual;
1527 df751fa8 aliguori
1528 df751fa8 aliguori
    actual = qemu_balloon_status();
1529 bd322087 aliguori
    if (kvm_enabled() && !kvm_has_sync_mmu())
1530 376253ec aliguori
        monitor_printf(mon, "Using KVM without synchronous MMU, "
1531 376253ec aliguori
                       "ballooning disabled\n");
1532 bd322087 aliguori
    else if (actual == 0)
1533 376253ec aliguori
        monitor_printf(mon, "Ballooning not activated in VM\n");
1534 df751fa8 aliguori
    else
1535 376253ec aliguori
        monitor_printf(mon, "balloon: actual=%d\n", (int)(actual >> 20));
1536 df751fa8 aliguori
}
1537 df751fa8 aliguori
1538 76655d6d aliguori
static void do_acl(Monitor *mon,
1539 76655d6d aliguori
                   const char *command,
1540 28a76be8 aliguori
                   const char *aclname,
1541 28a76be8 aliguori
                   const char *match,
1542 28a76be8 aliguori
                   int has_index,
1543 28a76be8 aliguori
                   int index)
1544 76655d6d aliguori
{
1545 76655d6d aliguori
    qemu_acl *acl;
1546 76655d6d aliguori
1547 76655d6d aliguori
    acl = qemu_acl_find(aclname);
1548 76655d6d aliguori
    if (!acl) {
1549 28a76be8 aliguori
        monitor_printf(mon, "acl: unknown list '%s'\n", aclname);
1550 28a76be8 aliguori
        return;
1551 76655d6d aliguori
    }
1552 76655d6d aliguori
1553 76655d6d aliguori
    if (strcmp(command, "show") == 0) {
1554 28a76be8 aliguori
        int i = 0;
1555 28a76be8 aliguori
        qemu_acl_entry *entry;
1556 28a76be8 aliguori
        monitor_printf(mon, "policy: %s\n",
1557 76655d6d aliguori
                       acl->defaultDeny ? "deny" : "allow");
1558 28a76be8 aliguori
        TAILQ_FOREACH(entry, &acl->entries, next) {
1559 28a76be8 aliguori
            i++;
1560 28a76be8 aliguori
            monitor_printf(mon, "%d: %s %s\n", i,
1561 76655d6d aliguori
                           entry->deny ? "deny" : "allow",
1562 76655d6d aliguori
                           entry->match);
1563 28a76be8 aliguori
        }
1564 76655d6d aliguori
    } else if (strcmp(command, "reset") == 0) {
1565 28a76be8 aliguori
        qemu_acl_reset(acl);
1566 28a76be8 aliguori
        monitor_printf(mon, "acl: removed all rules\n");
1567 76655d6d aliguori
    } else if (strcmp(command, "policy") == 0) {
1568 28a76be8 aliguori
        if (!match) {
1569 28a76be8 aliguori
            monitor_printf(mon, "acl: missing policy parameter\n");
1570 28a76be8 aliguori
            return;
1571 28a76be8 aliguori
        }
1572 28a76be8 aliguori
1573 28a76be8 aliguori
        if (strcmp(match, "allow") == 0) {
1574 28a76be8 aliguori
            acl->defaultDeny = 0;
1575 28a76be8 aliguori
            monitor_printf(mon, "acl: policy set to 'allow'\n");
1576 28a76be8 aliguori
        } else if (strcmp(match, "deny") == 0) {
1577 28a76be8 aliguori
            acl->defaultDeny = 1;
1578 28a76be8 aliguori
            monitor_printf(mon, "acl: policy set to 'deny'\n");
1579 28a76be8 aliguori
        } else {
1580 28a76be8 aliguori
            monitor_printf(mon, "acl: unknown policy '%s', expected 'deny' or 'allow'\n", match);
1581 28a76be8 aliguori
        }
1582 76655d6d aliguori
    } else if ((strcmp(command, "allow") == 0) ||
1583 28a76be8 aliguori
               (strcmp(command, "deny") == 0)) {
1584 28a76be8 aliguori
        int deny = strcmp(command, "deny") == 0 ? 1 : 0;
1585 28a76be8 aliguori
        int ret;
1586 28a76be8 aliguori
1587 28a76be8 aliguori
        if (!match) {
1588 28a76be8 aliguori
            monitor_printf(mon, "acl: missing match parameter\n");
1589 28a76be8 aliguori
            return;
1590 28a76be8 aliguori
        }
1591 28a76be8 aliguori
1592 28a76be8 aliguori
        if (has_index)
1593 28a76be8 aliguori
            ret = qemu_acl_insert(acl, deny, match, index);
1594 28a76be8 aliguori
        else
1595 28a76be8 aliguori
            ret = qemu_acl_append(acl, deny, match);
1596 28a76be8 aliguori
        if (ret < 0)
1597 28a76be8 aliguori
            monitor_printf(mon, "acl: unable to add acl entry\n");
1598 28a76be8 aliguori
        else
1599 28a76be8 aliguori
            monitor_printf(mon, "acl: added rule at position %d\n", ret);
1600 76655d6d aliguori
    } else if (strcmp(command, "remove") == 0) {
1601 28a76be8 aliguori
        int ret;
1602 28a76be8 aliguori
1603 28a76be8 aliguori
        if (!match) {
1604 28a76be8 aliguori
            monitor_printf(mon, "acl: missing match parameter\n");
1605 28a76be8 aliguori
            return;
1606 28a76be8 aliguori
        }
1607 28a76be8 aliguori
1608 28a76be8 aliguori
        ret = qemu_acl_remove(acl, match);
1609 28a76be8 aliguori
        if (ret < 0)
1610 28a76be8 aliguori
            monitor_printf(mon, "acl: no matching acl entry\n");
1611 28a76be8 aliguori
        else
1612 28a76be8 aliguori
            monitor_printf(mon, "acl: removed rule at position %d\n", ret);
1613 76655d6d aliguori
    } else {
1614 28a76be8 aliguori
        monitor_printf(mon, "acl: unknown command '%s'\n", command);
1615 76655d6d aliguori
    }
1616 76655d6d aliguori
}
1617 76655d6d aliguori
1618 d2c639d6 blueswir1
/* Please update qemu-doc.texi when adding or changing commands */
1619 376253ec aliguori
static const mon_cmd_t mon_cmds[] = {
1620 376253ec aliguori
    { "help|?", "s?", help_cmd,
1621 9dc39cba bellard
      "[cmd]", "show the help" },
1622 5fafdf24 ths
    { "commit", "s", do_commit,
1623 7954c734 bellard
      "device|all", "commit changes to the disk images (if -snapshot is used) or backing files" },
1624 9307c4c1 bellard
    { "info", "s?", do_info,
1625 9dc39cba bellard
      "subcommand", "show various information about the system state" },
1626 9307c4c1 bellard
    { "q|quit", "", do_quit,
1627 9dc39cba bellard
      "", "quit the emulator" },
1628 81d0912d bellard
    { "eject", "-fB", do_eject,
1629 e598752a ths
      "[-f] device", "eject a removable medium (use -f to force it)" },
1630 2ecea9b8 aurel32
    { "change", "BFs?", do_change,
1631 2ecea9b8 aurel32
      "device filename [format]", "change a removable medium, optional format" },
1632 5fafdf24 ths
    { "screendump", "F", do_screen_dump,
1633 59a983b9 bellard
      "filename", "save screen into PPM image 'filename'" },
1634 788228c0 balrog
    { "logfile", "F", do_logfile,
1635 e735b91c pbrook
      "filename", "output logs to 'filename'" },
1636 9307c4c1 bellard
    { "log", "s", do_log,
1637 5fafdf24 ths
      "item1[,...]", "activate logging of the specified items to '/tmp/qemu.log'" },
1638 faea38e7 bellard
    { "savevm", "s?", do_savevm,
1639 5fafdf24 ths
      "tag|id", "save a VM snapshot. If no tag or id are provided, a new snapshot is created" },
1640 faea38e7 bellard
    { "loadvm", "s", do_loadvm,
1641 5fafdf24 ths
      "tag|id", "restore a VM snapshot from its tag or id" },
1642 faea38e7 bellard
    { "delvm", "s", do_delvm,
1643 5fafdf24 ths
      "tag|id", "delete a VM snapshot from its tag or id" },
1644 5fafdf24 ths
    { "stop", "", do_stop,
1645 9307c4c1 bellard
      "", "stop emulation", },
1646 5fafdf24 ths
    { "c|cont", "", do_cont,
1647 9307c4c1 bellard
      "", "resume emulation", },
1648 67b915a5 bellard
#ifdef CONFIG_GDBSTUB
1649 5fafdf24 ths
    { "gdbserver", "s?", do_gdbserver,
1650 9307c4c1 bellard
      "[port]", "start gdbserver session (default port=1234)", },
1651 67b915a5 bellard
#endif
1652 5fafdf24 ths
    { "x", "/l", do_memory_dump,
1653 9307c4c1 bellard
      "/fmt addr", "virtual memory dump starting at 'addr'", },
1654 5fafdf24 ths
    { "xp", "/l", do_physical_memory_dump,
1655 9307c4c1 bellard
      "/fmt addr", "physical memory dump starting at 'addr'", },
1656 5fafdf24 ths
    { "p|print", "/l", do_print,
1657 9307c4c1 bellard
      "/fmt expr", "print expression value (use $reg for CPU register access)", },
1658 5fafdf24 ths
    { "i", "/ii.", do_ioport_read,
1659 3440557b bellard
      "/fmt addr", "I/O port read" },
1660 3440557b bellard
1661 c8256f9d balrog
    { "sendkey", "si?", do_sendkey,
1662 c8256f9d balrog
      "keys [hold_ms]", "send keys to the VM (e.g. 'sendkey ctrl-alt-f1', default hold time=100 ms)" },
1663 5fafdf24 ths
    { "system_reset", "", do_system_reset,
1664 e4f9082b bellard
      "", "reset the system" },
1665 5fafdf24 ths
    { "system_powerdown", "", do_system_powerdown,
1666 3475187d bellard
      "", "send system power down event" },
1667 5fafdf24 ths
    { "sum", "ii", do_sum,
1668 e4cf1adc bellard
      "addr size", "compute the checksum of a memory region" },
1669 a594cfbf bellard
    { "usb_add", "s", do_usb_add,
1670 a594cfbf bellard
      "device", "add USB device (e.g. 'host:bus.addr' or 'host:vendor_id:product_id')" },
1671 a594cfbf bellard
    { "usb_del", "s", do_usb_del,
1672 a594cfbf bellard
      "device", "remove USB device 'bus.addr'" },
1673 5fafdf24 ths
    { "cpu", "i", do_cpu_set,
1674 6a00d601 bellard
      "index", "set the default CPU" },
1675 5fafdf24 ths
    { "mouse_move", "sss?", do_mouse_move,
1676 13224a87 bellard
      "dx dy [dz]", "send mouse move events" },
1677 5fafdf24 ths
    { "mouse_button", "i", do_mouse_button,
1678 13224a87 bellard
      "state", "change mouse button state (1=L, 2=M, 4=R)" },
1679 455204eb ths
    { "mouse_set", "i", do_mouse_set,
1680 455204eb ths
      "index", "set which mouse device receives events" },
1681 ec36b695 bellard
#ifdef HAS_AUDIO
1682 ec36b695 bellard
    { "wavcapture", "si?i?i?", do_wav_capture,
1683 ec36b695 bellard
      "path [frequency bits channels]",
1684 ec36b695 bellard
      "capture audio to a wave file (default frequency=44100 bits=16 channels=2)" },
1685 ec36b695 bellard
#endif
1686 d2c639d6 blueswir1
    { "stopcapture", "i", do_stop_capture,
1687 d2c639d6 blueswir1
      "capture index", "stop capture" },
1688 5fafdf24 ths
    { "memsave", "lis", do_memory_save,
1689 b371dc59 bellard
      "addr size file", "save to disk virtual memory dump starting at 'addr' of size 'size'", },
1690 a8bdf7a6 aurel32
    { "pmemsave", "lis", do_physical_memory_save,
1691 a8bdf7a6 aurel32
      "addr size file", "save to disk physical memory dump starting at 'addr' of size 'size'", },
1692 0ecdffbb aurel32
    { "boot_set", "s", do_boot_set,
1693 0ecdffbb aurel32
      "bootdevice", "define new values for the boot device list" },
1694 dc1c0b74 aurel32
#if defined(TARGET_I386)
1695 dc1c0b74 aurel32
    { "nmi", "i", do_inject_nmi,
1696 dc1c0b74 aurel32
      "cpu", "inject an NMI on the given CPU", },
1697 dc1c0b74 aurel32
#endif
1698 5bb7910a aliguori
    { "migrate", "-ds", do_migrate,
1699 5bb7910a aliguori
      "[-d] uri", "migrate to URI (using -d to not wait for completion)" },
1700 5bb7910a aliguori
    { "migrate_cancel", "", do_migrate_cancel,
1701 5bb7910a aliguori
      "", "cancel the current VM migration" },
1702 5bb7910a aliguori
    { "migrate_set_speed", "s", do_migrate_set_speed,
1703 5bb7910a aliguori
      "value", "set maximum speed (in bytes) for migrations" },
1704 6f338c34 aliguori
#if defined(TARGET_I386)
1705 6f338c34 aliguori
    { "drive_add", "ss", drive_hot_add, "pci_addr=[[<domain>:]<bus>:]<slot>\n"
1706 6f338c34 aliguori
                                         "[file=file][,if=type][,bus=n]\n"
1707 6f338c34 aliguori
                                        "[,unit=m][,media=d][index=i]\n"
1708 6f338c34 aliguori
                                        "[,cyls=c,heads=h,secs=s[,trans=t]]\n"
1709 6f338c34 aliguori
                                        "[snapshot=on|off][,cache=on|off]",
1710 6f338c34 aliguori
                                        "add drive to PCI storage controller" },
1711 6f338c34 aliguori
    { "pci_add", "sss", pci_device_hot_add, "pci_addr=auto|[[<domain>:]<bus>:]<slot> nic|storage [[vlan=n][,macaddr=addr][,model=type]] [file=file][,if=type][,bus=nr]...", "hot-add PCI device" },
1712 6f338c34 aliguori
    { "pci_del", "s", pci_device_hot_remove, "pci_addr=[[<domain>:]<bus>:]<slot>", "hot remove PCI device" },
1713 6f338c34 aliguori
    { "host_net_add", "ss", net_host_device_add,
1714 6f338c34 aliguori
      "[tap,user,socket,vde] options", "add host VLAN client" },
1715 6f338c34 aliguori
    { "host_net_remove", "is", net_host_device_remove,
1716 6f338c34 aliguori
      "vlan_id name", "remove host VLAN client" },
1717 6f338c34 aliguori
#endif
1718 df751fa8 aliguori
    { "balloon", "i", do_balloon,
1719 df751fa8 aliguori
      "target", "request VM to change it's memory allocation (in MB)" },
1720 f029bd94 aliguori
    { "set_link", "ss", do_set_link,
1721 f029bd94 aliguori
      "name [up|down]", "change the link status of a network adapter" },
1722 76655d6d aliguori
    { "acl", "sss?i?", do_acl, "<command> <aclname> [<match>] [<index>]\n",
1723 76655d6d aliguori
                               "acl show vnc.username\n"
1724 76655d6d aliguori
                               "acl policy vnc.username deny\n"
1725 76655d6d aliguori
                               "acl allow vnc.username fred\n"
1726 76655d6d aliguori
                               "acl deny vnc.username bob\n"
1727 76655d6d aliguori
                               "acl reset vnc.username\n" },
1728 5fafdf24 ths
    { NULL, NULL, },
1729 9dc39cba bellard
};
1730 9dc39cba bellard
1731 d2c639d6 blueswir1
/* Please update qemu-doc.texi when adding or changing commands */
1732 376253ec aliguori
static const mon_cmd_t info_cmds[] = {
1733 9bc9d1c7 bellard
    { "version", "", do_info_version,
1734 d2c639d6 blueswir1
      "", "show the version of QEMU" },
1735 9307c4c1 bellard
    { "network", "", do_info_network,
1736 9dc39cba bellard
      "", "show the network state" },
1737 5ccfae10 aliguori
    { "chardev", "", qemu_chr_info,
1738 5ccfae10 aliguori
      "", "show the character devices" },
1739 376253ec aliguori
    { "block", "", bdrv_info,
1740 9dc39cba bellard
      "", "show the block devices" },
1741 376253ec aliguori
    { "blockstats", "", bdrv_info_stats,
1742 a36e69dd ths
      "", "show block device statistics" },
1743 9307c4c1 bellard
    { "registers", "", do_info_registers,
1744 9307c4c1 bellard
      "", "show the cpu registers" },
1745 6a00d601 bellard
    { "cpus", "", do_info_cpus,
1746 6a00d601 bellard
      "", "show infos for each CPU" },
1747 aa455485 bellard
    { "history", "", do_info_history,
1748 aa455485 bellard
      "", "show the command line history", },
1749 4a0fb71e bellard
    { "irq", "", irq_info,
1750 4a0fb71e bellard
      "", "show the interrupts statistics (if available)", },
1751 4c27ba27 bellard
    { "pic", "", pic_info,
1752 4c27ba27 bellard
      "", "show i8259 (PIC) state", },
1753 86e0c048 bellard
    { "pci", "", pci_info,
1754 86e0c048 bellard
      "", "show PCI info", },
1755 7c664e2f aurel32
#if defined(TARGET_I386) || defined(TARGET_SH4)
1756 b86bda5b bellard
    { "tlb", "", tlb_info,
1757 b86bda5b bellard
      "", "show virtual to physical memory mappings", },
1758 7c664e2f aurel32
#endif
1759 7c664e2f aurel32
#if defined(TARGET_I386)
1760 b86bda5b bellard
    { "mem", "", mem_info,
1761 b86bda5b bellard
      "", "show the active virtual memory mappings", },
1762 16b29ae1 aliguori
    { "hpet", "", do_info_hpet,
1763 16b29ae1 aliguori
      "", "show state of HPET", },
1764 b86bda5b bellard
#endif
1765 e3db7226 bellard
    { "jit", "", do_info_jit,
1766 e3db7226 bellard
      "", "show dynamic compiler info", },
1767 0f4c6415 bellard
    { "kqemu", "", do_info_kqemu,
1768 d2c639d6 blueswir1
      "", "show KQEMU information", },
1769 7ba1e619 aliguori
    { "kvm", "", do_info_kvm,
1770 d2c639d6 blueswir1
      "", "show KVM information", },
1771 a594cfbf bellard
    { "usb", "", usb_info,
1772 a594cfbf bellard
      "", "show guest USB devices", },
1773 a594cfbf bellard
    { "usbhost", "", usb_host_info,
1774 a594cfbf bellard
      "", "show host USB devices", },
1775 5f1ce948 bellard
    { "profile", "", do_info_profile,
1776 5f1ce948 bellard
      "", "show profiling information", },
1777 ec36b695 bellard
    { "capture", "", do_info_capture,
1778 17100159 bellard
      "", "show capture information" },
1779 faea38e7 bellard
    { "snapshots", "", do_info_snapshots,
1780 17100159 bellard
      "", "show the currently saved VM snapshots" },
1781 6f9c5ee7 aurel32
    { "status", "", do_info_status,
1782 6f9c5ee7 aurel32
      "", "show the current VM status (running|paused)" },
1783 201a51fc balrog
    { "pcmcia", "", pcmcia_info,
1784 201a51fc balrog
      "", "show guest PCMCIA status" },
1785 455204eb ths
    { "mice", "", do_info_mice,
1786 455204eb ths
      "", "show which guest mouse is receiving events" },
1787 a9ce8590 bellard
    { "vnc", "", do_info_vnc,
1788 a9ce8590 bellard
      "", "show the vnc server status"},
1789 c35734b2 ths
    { "name", "", do_info_name,
1790 c35734b2 ths
      "", "show the current VM name" },
1791 f1f23ad5 blueswir1
    { "uuid", "", do_info_uuid,
1792 f1f23ad5 blueswir1
      "", "show the current VM UUID" },
1793 76a66253 j_mayer
#if defined(TARGET_PPC)
1794 76a66253 j_mayer
    { "cpustats", "", do_info_cpu_stats,
1795 76a66253 j_mayer
      "", "show CPU statistics", },
1796 76a66253 j_mayer
#endif
1797 31a60e22 blueswir1
#if defined(CONFIG_SLIRP)
1798 31a60e22 blueswir1
    { "slirp", "", do_info_slirp,
1799 31a60e22 blueswir1
      "", "show SLIRP statistics", },
1800 31a60e22 blueswir1
#endif
1801 5bb7910a aliguori
    { "migrate", "", do_info_migrate, "", "show migration status" },
1802 df751fa8 aliguori
    { "balloon", "", do_info_balloon,
1803 df751fa8 aliguori
      "", "show balloon information" },
1804 9dc39cba bellard
    { NULL, NULL, },
1805 9dc39cba bellard
};
1806 9dc39cba bellard
1807 9307c4c1 bellard
/*******************************************************************/
1808 9307c4c1 bellard
1809 9307c4c1 bellard
static const char *pch;
1810 9307c4c1 bellard
static jmp_buf expr_env;
1811 9307c4c1 bellard
1812 92a31b1f bellard
#define MD_TLONG 0
1813 92a31b1f bellard
#define MD_I32   1
1814 92a31b1f bellard
1815 9307c4c1 bellard
typedef struct MonitorDef {
1816 9307c4c1 bellard
    const char *name;
1817 9307c4c1 bellard
    int offset;
1818 8662d656 blueswir1
    target_long (*get_value)(const struct MonitorDef *md, int val);
1819 92a31b1f bellard
    int type;
1820 9307c4c1 bellard
} MonitorDef;
1821 9307c4c1 bellard
1822 57206fd4 bellard
#if defined(TARGET_I386)
1823 8662d656 blueswir1
static target_long monitor_get_pc (const struct MonitorDef *md, int val)
1824 57206fd4 bellard
{
1825 6a00d601 bellard
    CPUState *env = mon_get_cpu();
1826 6a00d601 bellard
    if (!env)
1827 6a00d601 bellard
        return 0;
1828 6a00d601 bellard
    return env->eip + env->segs[R_CS].base;
1829 57206fd4 bellard
}
1830 57206fd4 bellard
#endif
1831 57206fd4 bellard
1832 a541f297 bellard
#if defined(TARGET_PPC)
1833 8662d656 blueswir1
static target_long monitor_get_ccr (const struct MonitorDef *md, int val)
1834 a541f297 bellard
{
1835 6a00d601 bellard
    CPUState *env = mon_get_cpu();
1836 a541f297 bellard
    unsigned int u;
1837 a541f297 bellard
    int i;
1838 a541f297 bellard
1839 6a00d601 bellard
    if (!env)
1840 6a00d601 bellard
        return 0;
1841 6a00d601 bellard
1842 a541f297 bellard
    u = 0;
1843 a541f297 bellard
    for (i = 0; i < 8; i++)
1844 28a76be8 aliguori
        u |= env->crf[i] << (32 - (4 * i));
1845 a541f297 bellard
1846 a541f297 bellard
    return u;
1847 a541f297 bellard
}
1848 a541f297 bellard
1849 8662d656 blueswir1
static target_long monitor_get_msr (const struct MonitorDef *md, int val)
1850 a541f297 bellard
{
1851 6a00d601 bellard
    CPUState *env = mon_get_cpu();
1852 6a00d601 bellard
    if (!env)
1853 6a00d601 bellard
        return 0;
1854 0411a972 j_mayer
    return env->msr;
1855 a541f297 bellard
}
1856 a541f297 bellard
1857 8662d656 blueswir1
static target_long monitor_get_xer (const struct MonitorDef *md, int val)
1858 a541f297 bellard
{
1859 6a00d601 bellard
    CPUState *env = mon_get_cpu();
1860 6a00d601 bellard
    if (!env)
1861 6a00d601 bellard
        return 0;
1862 3d7b417e aurel32
    return env->xer;
1863 a541f297 bellard
}
1864 9fddaa0c bellard
1865 8662d656 blueswir1
static target_long monitor_get_decr (const struct MonitorDef *md, int val)
1866 9fddaa0c bellard
{
1867 6a00d601 bellard
    CPUState *env = mon_get_cpu();
1868 6a00d601 bellard
    if (!env)
1869 6a00d601 bellard
        return 0;
1870 6a00d601 bellard
    return cpu_ppc_load_decr(env);
1871 9fddaa0c bellard
}
1872 9fddaa0c bellard
1873 8662d656 blueswir1
static target_long monitor_get_tbu (const struct MonitorDef *md, int val)
1874 9fddaa0c bellard
{
1875 6a00d601 bellard
    CPUState *env = mon_get_cpu();
1876 6a00d601 bellard
    if (!env)
1877 6a00d601 bellard
        return 0;
1878 6a00d601 bellard
    return cpu_ppc_load_tbu(env);
1879 9fddaa0c bellard
}
1880 9fddaa0c bellard
1881 8662d656 blueswir1
static target_long monitor_get_tbl (const struct MonitorDef *md, int val)
1882 9fddaa0c bellard
{
1883 6a00d601 bellard
    CPUState *env = mon_get_cpu();
1884 6a00d601 bellard
    if (!env)
1885 6a00d601 bellard
        return 0;
1886 6a00d601 bellard
    return cpu_ppc_load_tbl(env);
1887 9fddaa0c bellard
}
1888 a541f297 bellard
#endif
1889 a541f297 bellard
1890 e95c8d51 bellard
#if defined(TARGET_SPARC)
1891 7b936c0c bellard
#ifndef TARGET_SPARC64
1892 8662d656 blueswir1
static target_long monitor_get_psr (const struct MonitorDef *md, int val)
1893 e95c8d51 bellard
{
1894 6a00d601 bellard
    CPUState *env = mon_get_cpu();
1895 6a00d601 bellard
    if (!env)
1896 6a00d601 bellard
        return 0;
1897 6a00d601 bellard
    return GET_PSR(env);
1898 e95c8d51 bellard
}
1899 7b936c0c bellard
#endif
1900 e95c8d51 bellard
1901 8662d656 blueswir1
static target_long monitor_get_reg(const struct MonitorDef *md, int val)
1902 e95c8d51 bellard
{
1903 6a00d601 bellard
    CPUState *env = mon_get_cpu();
1904 6a00d601 bellard
    if (!env)
1905 6a00d601 bellard
        return 0;
1906 6a00d601 bellard
    return env->regwptr[val];
1907 e95c8d51 bellard
}
1908 e95c8d51 bellard
#endif
1909 e95c8d51 bellard
1910 8662d656 blueswir1
static const MonitorDef monitor_defs[] = {
1911 9307c4c1 bellard
#ifdef TARGET_I386
1912 57206fd4 bellard
1913 57206fd4 bellard
#define SEG(name, seg) \
1914 92a31b1f bellard
    { name, offsetof(CPUState, segs[seg].selector), NULL, MD_I32 },\
1915 57206fd4 bellard
    { name ".base", offsetof(CPUState, segs[seg].base) },\
1916 92a31b1f bellard
    { name ".limit", offsetof(CPUState, segs[seg].limit), NULL, MD_I32 },
1917 57206fd4 bellard
1918 9307c4c1 bellard
    { "eax", offsetof(CPUState, regs[0]) },
1919 9307c4c1 bellard
    { "ecx", offsetof(CPUState, regs[1]) },
1920 9307c4c1 bellard
    { "edx", offsetof(CPUState, regs[2]) },
1921 9307c4c1 bellard
    { "ebx", offsetof(CPUState, regs[3]) },
1922 9307c4c1 bellard
    { "esp|sp", offsetof(CPUState, regs[4]) },
1923 9307c4c1 bellard
    { "ebp|fp", offsetof(CPUState, regs[5]) },
1924 9307c4c1 bellard
    { "esi", offsetof(CPUState, regs[6]) },
1925 01038d2a bellard
    { "edi", offsetof(CPUState, regs[7]) },
1926 92a31b1f bellard
#ifdef TARGET_X86_64
1927 92a31b1f bellard
    { "r8", offsetof(CPUState, regs[8]) },
1928 92a31b1f bellard
    { "r9", offsetof(CPUState, regs[9]) },
1929 92a31b1f bellard
    { "r10", offsetof(CPUState, regs[10]) },
1930 92a31b1f bellard
    { "r11", offsetof(CPUState, regs[11]) },
1931 92a31b1f bellard
    { "r12", offsetof(CPUState, regs[12]) },
1932 92a31b1f bellard
    { "r13", offsetof(CPUState, regs[13]) },
1933 92a31b1f bellard
    { "r14", offsetof(CPUState, regs[14]) },
1934 92a31b1f bellard
    { "r15", offsetof(CPUState, regs[15]) },
1935 92a31b1f bellard
#endif
1936 9307c4c1 bellard
    { "eflags", offsetof(CPUState, eflags) },
1937 57206fd4 bellard
    { "eip", offsetof(CPUState, eip) },
1938 57206fd4 bellard
    SEG("cs", R_CS)
1939 57206fd4 bellard
    SEG("ds", R_DS)
1940 57206fd4 bellard
    SEG("es", R_ES)
1941 01038d2a bellard
    SEG("ss", R_SS)
1942 57206fd4 bellard
    SEG("fs", R_FS)
1943 57206fd4 bellard
    SEG("gs", R_GS)
1944 57206fd4 bellard
    { "pc", 0, monitor_get_pc, },
1945 a541f297 bellard
#elif defined(TARGET_PPC)
1946 ff937dba j_mayer
    /* General purpose registers */
1947 a541f297 bellard
    { "r0", offsetof(CPUState, gpr[0]) },
1948 a541f297 bellard
    { "r1", offsetof(CPUState, gpr[1]) },
1949 a541f297 bellard
    { "r2", offsetof(CPUState, gpr[2]) },
1950 a541f297 bellard
    { "r3", offsetof(CPUState, gpr[3]) },
1951 a541f297 bellard
    { "r4", offsetof(CPUState, gpr[4]) },
1952 a541f297 bellard
    { "r5", offsetof(CPUState, gpr[5]) },
1953 a541f297 bellard
    { "r6", offsetof(CPUState, gpr[6]) },
1954 a541f297 bellard
    { "r7", offsetof(CPUState, gpr[7]) },
1955 a541f297 bellard
    { "r8", offsetof(CPUState, gpr[8]) },
1956 a541f297 bellard
    { "r9", offsetof(CPUState, gpr[9]) },
1957 a541f297 bellard
    { "r10", offsetof(CPUState, gpr[10]) },
1958 a541f297 bellard
    { "r11", offsetof(CPUState, gpr[11]) },
1959 a541f297 bellard
    { "r12", offsetof(CPUState, gpr[12]) },
1960 a541f297 bellard
    { "r13", offsetof(CPUState, gpr[13]) },
1961 a541f297 bellard
    { "r14", offsetof(CPUState, gpr[14]) },
1962 a541f297 bellard
    { "r15", offsetof(CPUState, gpr[15]) },
1963 a541f297 bellard
    { "r16", offsetof(CPUState, gpr[16]) },
1964 a541f297 bellard
    { "r17", offsetof(CPUState, gpr[17]) },
1965 a541f297 bellard
    { "r18", offsetof(CPUState, gpr[18]) },
1966 a541f297 bellard
    { "r19", offsetof(CPUState, gpr[19]) },
1967 a541f297 bellard
    { "r20", offsetof(CPUState, gpr[20]) },
1968 a541f297 bellard
    { "r21", offsetof(CPUState, gpr[21]) },
1969 a541f297 bellard
    { "r22", offsetof(CPUState, gpr[22]) },
1970 a541f297 bellard
    { "r23", offsetof(CPUState, gpr[23]) },
1971 a541f297 bellard
    { "r24", offsetof(CPUState, gpr[24]) },
1972 a541f297 bellard
    { "r25", offsetof(CPUState, gpr[25]) },
1973 a541f297 bellard
    { "r26", offsetof(CPUState, gpr[26]) },
1974 a541f297 bellard
    { "r27", offsetof(CPUState, gpr[27]) },
1975 a541f297 bellard
    { "r28", offsetof(CPUState, gpr[28]) },
1976 a541f297 bellard
    { "r29", offsetof(CPUState, gpr[29]) },
1977 a541f297 bellard
    { "r30", offsetof(CPUState, gpr[30]) },
1978 a541f297 bellard
    { "r31", offsetof(CPUState, gpr[31]) },
1979 ff937dba j_mayer
    /* Floating point registers */
1980 ff937dba j_mayer
    { "f0", offsetof(CPUState, fpr[0]) },
1981 ff937dba j_mayer
    { "f1", offsetof(CPUState, fpr[1]) },
1982 ff937dba j_mayer
    { "f2", offsetof(CPUState, fpr[2]) },
1983 ff937dba j_mayer
    { "f3", offsetof(CPUState, fpr[3]) },
1984 ff937dba j_mayer
    { "f4", offsetof(CPUState, fpr[4]) },
1985 ff937dba j_mayer
    { "f5", offsetof(CPUState, fpr[5]) },
1986 ff937dba j_mayer
    { "f6", offsetof(CPUState, fpr[6]) },
1987 ff937dba j_mayer
    { "f7", offsetof(CPUState, fpr[7]) },
1988 ff937dba j_mayer
    { "f8", offsetof(CPUState, fpr[8]) },
1989 ff937dba j_mayer
    { "f9", offsetof(CPUState, fpr[9]) },
1990 ff937dba j_mayer
    { "f10", offsetof(CPUState, fpr[10]) },
1991 ff937dba j_mayer
    { "f11", offsetof(CPUState, fpr[11]) },
1992 ff937dba j_mayer
    { "f12", offsetof(CPUState, fpr[12]) },
1993 ff937dba j_mayer
    { "f13", offsetof(CPUState, fpr[13]) },
1994 ff937dba j_mayer
    { "f14", offsetof(CPUState, fpr[14]) },
1995 ff937dba j_mayer
    { "f15", offsetof(CPUState, fpr[15]) },
1996 ff937dba j_mayer
    { "f16", offsetof(CPUState, fpr[16]) },
1997 ff937dba j_mayer
    { "f17", offsetof(CPUState, fpr[17]) },
1998 ff937dba j_mayer
    { "f18", offsetof(CPUState, fpr[18]) },
1999 ff937dba j_mayer
    { "f19", offsetof(CPUState, fpr[19]) },
2000 ff937dba j_mayer
    { "f20", offsetof(CPUState, fpr[20]) },
2001 ff937dba j_mayer
    { "f21", offsetof(CPUState, fpr[21]) },
2002 ff937dba j_mayer
    { "f22", offsetof(CPUState, fpr[22]) },
2003 ff937dba j_mayer
    { "f23", offsetof(CPUState, fpr[23]) },
2004 ff937dba j_mayer
    { "f24", offsetof(CPUState, fpr[24]) },
2005 ff937dba j_mayer
    { "f25", offsetof(CPUState, fpr[25]) },
2006 ff937dba j_mayer
    { "f26", offsetof(CPUState, fpr[26]) },
2007 ff937dba j_mayer
    { "f27", offsetof(CPUState, fpr[27]) },
2008 ff937dba j_mayer
    { "f28", offsetof(CPUState, fpr[28]) },
2009 ff937dba j_mayer
    { "f29", offsetof(CPUState, fpr[29]) },
2010 ff937dba j_mayer
    { "f30", offsetof(CPUState, fpr[30]) },
2011 ff937dba j_mayer
    { "f31", offsetof(CPUState, fpr[31]) },
2012 ff937dba j_mayer
    { "fpscr", offsetof(CPUState, fpscr) },
2013 ff937dba j_mayer
    /* Next instruction pointer */
2014 57206fd4 bellard
    { "nip|pc", offsetof(CPUState, nip) },
2015 a541f297 bellard
    { "lr", offsetof(CPUState, lr) },
2016 a541f297 bellard
    { "ctr", offsetof(CPUState, ctr) },
2017 9fddaa0c bellard
    { "decr", 0, &monitor_get_decr, },
2018 a541f297 bellard
    { "ccr", 0, &monitor_get_ccr, },
2019 ff937dba j_mayer
    /* Machine state register */
2020 a541f297 bellard
    { "msr", 0, &monitor_get_msr, },
2021 a541f297 bellard
    { "xer", 0, &monitor_get_xer, },
2022 9fddaa0c bellard
    { "tbu", 0, &monitor_get_tbu, },
2023 9fddaa0c bellard
    { "tbl", 0, &monitor_get_tbl, },
2024 ff937dba j_mayer
#if defined(TARGET_PPC64)
2025 ff937dba j_mayer
    /* Address space register */
2026 ff937dba j_mayer
    { "asr", offsetof(CPUState, asr) },
2027 ff937dba j_mayer
#endif
2028 ff937dba j_mayer
    /* Segment registers */
2029 a541f297 bellard
    { "sdr1", offsetof(CPUState, sdr1) },
2030 a541f297 bellard
    { "sr0", offsetof(CPUState, sr[0]) },
2031 a541f297 bellard
    { "sr1", offsetof(CPUState, sr[1]) },
2032 a541f297 bellard
    { "sr2", offsetof(CPUState, sr[2]) },
2033 a541f297 bellard
    { "sr3", offsetof(CPUState, sr[3]) },
2034 a541f297 bellard
    { "sr4", offsetof(CPUState, sr[4]) },
2035 a541f297 bellard
    { "sr5", offsetof(CPUState, sr[5]) },
2036 a541f297 bellard
    { "sr6", offsetof(CPUState, sr[6]) },
2037 a541f297 bellard
    { "sr7", offsetof(CPUState, sr[7]) },
2038 a541f297 bellard
    { "sr8", offsetof(CPUState, sr[8]) },
2039 a541f297 bellard
    { "sr9", offsetof(CPUState, sr[9]) },
2040 a541f297 bellard
    { "sr10", offsetof(CPUState, sr[10]) },
2041 a541f297 bellard
    { "sr11", offsetof(CPUState, sr[11]) },
2042 a541f297 bellard
    { "sr12", offsetof(CPUState, sr[12]) },
2043 a541f297 bellard
    { "sr13", offsetof(CPUState, sr[13]) },
2044 a541f297 bellard
    { "sr14", offsetof(CPUState, sr[14]) },
2045 a541f297 bellard
    { "sr15", offsetof(CPUState, sr[15]) },
2046 a541f297 bellard
    /* Too lazy to put BATs and SPRs ... */
2047 e95c8d51 bellard
#elif defined(TARGET_SPARC)
2048 e95c8d51 bellard
    { "g0", offsetof(CPUState, gregs[0]) },
2049 e95c8d51 bellard
    { "g1", offsetof(CPUState, gregs[1]) },
2050 e95c8d51 bellard
    { "g2", offsetof(CPUState, gregs[2]) },
2051 e95c8d51 bellard
    { "g3", offsetof(CPUState, gregs[3]) },
2052 e95c8d51 bellard
    { "g4", offsetof(CPUState, gregs[4]) },
2053 e95c8d51 bellard
    { "g5", offsetof(CPUState, gregs[5]) },
2054 e95c8d51 bellard
    { "g6", offsetof(CPUState, gregs[6]) },
2055 e95c8d51 bellard
    { "g7", offsetof(CPUState, gregs[7]) },
2056 e95c8d51 bellard
    { "o0", 0, monitor_get_reg },
2057 e95c8d51 bellard
    { "o1", 1, monitor_get_reg },
2058 e95c8d51 bellard
    { "o2", 2, monitor_get_reg },
2059 e95c8d51 bellard
    { "o3", 3, monitor_get_reg },
2060 e95c8d51 bellard
    { "o4", 4, monitor_get_reg },
2061 e95c8d51 bellard
    { "o5", 5, monitor_get_reg },
2062 e95c8d51 bellard
    { "o6", 6, monitor_get_reg },
2063 e95c8d51 bellard
    { "o7", 7, monitor_get_reg },
2064 e95c8d51 bellard
    { "l0", 8, monitor_get_reg },
2065 e95c8d51 bellard
    { "l1", 9, monitor_get_reg },
2066 e95c8d51 bellard
    { "l2", 10, monitor_get_reg },
2067 e95c8d51 bellard
    { "l3", 11, monitor_get_reg },
2068 e95c8d51 bellard
    { "l4", 12, monitor_get_reg },
2069 e95c8d51 bellard
    { "l5", 13, monitor_get_reg },
2070 e95c8d51 bellard
    { "l6", 14, monitor_get_reg },
2071 e95c8d51 bellard
    { "l7", 15, monitor_get_reg },
2072 e95c8d51 bellard
    { "i0", 16, monitor_get_reg },
2073 e95c8d51 bellard
    { "i1", 17, monitor_get_reg },
2074 e95c8d51 bellard
    { "i2", 18, monitor_get_reg },
2075 e95c8d51 bellard
    { "i3", 19, monitor_get_reg },
2076 e95c8d51 bellard
    { "i4", 20, monitor_get_reg },
2077 e95c8d51 bellard
    { "i5", 21, monitor_get_reg },
2078 e95c8d51 bellard
    { "i6", 22, monitor_get_reg },
2079 e95c8d51 bellard
    { "i7", 23, monitor_get_reg },
2080 e95c8d51 bellard
    { "pc", offsetof(CPUState, pc) },
2081 e95c8d51 bellard
    { "npc", offsetof(CPUState, npc) },
2082 e95c8d51 bellard
    { "y", offsetof(CPUState, y) },
2083 7b936c0c bellard
#ifndef TARGET_SPARC64
2084 e95c8d51 bellard
    { "psr", 0, &monitor_get_psr, },
2085 e95c8d51 bellard
    { "wim", offsetof(CPUState, wim) },
2086 7b936c0c bellard
#endif
2087 e95c8d51 bellard
    { "tbr", offsetof(CPUState, tbr) },
2088 e95c8d51 bellard
    { "fsr", offsetof(CPUState, fsr) },
2089 e95c8d51 bellard
    { "f0", offsetof(CPUState, fpr[0]) },
2090 e95c8d51 bellard
    { "f1", offsetof(CPUState, fpr[1]) },
2091 e95c8d51 bellard
    { "f2", offsetof(CPUState, fpr[2]) },
2092 e95c8d51 bellard
    { "f3", offsetof(CPUState, fpr[3]) },
2093 e95c8d51 bellard
    { "f4", offsetof(CPUState, fpr[4]) },
2094 e95c8d51 bellard
    { "f5", offsetof(CPUState, fpr[5]) },
2095 e95c8d51 bellard
    { "f6", offsetof(CPUState, fpr[6]) },
2096 e95c8d51 bellard
    { "f7", offsetof(CPUState, fpr[7]) },
2097 e95c8d51 bellard
    { "f8", offsetof(CPUState, fpr[8]) },
2098 e95c8d51 bellard
    { "f9", offsetof(CPUState, fpr[9]) },
2099 e95c8d51 bellard
    { "f10", offsetof(CPUState, fpr[10]) },
2100 e95c8d51 bellard
    { "f11", offsetof(CPUState, fpr[11]) },
2101 e95c8d51 bellard
    { "f12", offsetof(CPUState, fpr[12]) },
2102 e95c8d51 bellard
    { "f13", offsetof(CPUState, fpr[13]) },
2103 e95c8d51 bellard
    { "f14", offsetof(CPUState, fpr[14]) },
2104 e95c8d51 bellard
    { "f15", offsetof(CPUState, fpr[15]) },
2105 e95c8d51 bellard
    { "f16", offsetof(CPUState, fpr[16]) },
2106 e95c8d51 bellard
    { "f17", offsetof(CPUState, fpr[17]) },
2107 e95c8d51 bellard
    { "f18", offsetof(CPUState, fpr[18]) },
2108 e95c8d51 bellard
    { "f19", offsetof(CPUState, fpr[19]) },
2109 e95c8d51 bellard
    { "f20", offsetof(CPUState, fpr[20]) },
2110 e95c8d51 bellard
    { "f21", offsetof(CPUState, fpr[21]) },
2111 e95c8d51 bellard
    { "f22", offsetof(CPUState, fpr[22]) },
2112 e95c8d51 bellard
    { "f23", offsetof(CPUState, fpr[23]) },
2113 e95c8d51 bellard
    { "f24", offsetof(CPUState, fpr[24]) },
2114 e95c8d51 bellard
    { "f25", offsetof(CPUState, fpr[25]) },
2115 e95c8d51 bellard
    { "f26", offsetof(CPUState, fpr[26]) },
2116 e95c8d51 bellard
    { "f27", offsetof(CPUState, fpr[27]) },
2117 e95c8d51 bellard
    { "f28", offsetof(CPUState, fpr[28]) },
2118 e95c8d51 bellard
    { "f29", offsetof(CPUState, fpr[29]) },
2119 e95c8d51 bellard
    { "f30", offsetof(CPUState, fpr[30]) },
2120 e95c8d51 bellard
    { "f31", offsetof(CPUState, fpr[31]) },
2121 7b936c0c bellard
#ifdef TARGET_SPARC64
2122 7b936c0c bellard
    { "f32", offsetof(CPUState, fpr[32]) },
2123 7b936c0c bellard
    { "f34", offsetof(CPUState, fpr[34]) },
2124 7b936c0c bellard
    { "f36", offsetof(CPUState, fpr[36]) },
2125 7b936c0c bellard
    { "f38", offsetof(CPUState, fpr[38]) },
2126 7b936c0c bellard
    { "f40", offsetof(CPUState, fpr[40]) },
2127 7b936c0c bellard
    { "f42", offsetof(CPUState, fpr[42]) },
2128 7b936c0c bellard
    { "f44", offsetof(CPUState, fpr[44]) },
2129 7b936c0c bellard
    { "f46", offsetof(CPUState, fpr[46]) },
2130 7b936c0c bellard
    { "f48", offsetof(CPUState, fpr[48]) },
2131 7b936c0c bellard
    { "f50", offsetof(CPUState, fpr[50]) },
2132 7b936c0c bellard
    { "f52", offsetof(CPUState, fpr[52]) },
2133 7b936c0c bellard
    { "f54", offsetof(CPUState, fpr[54]) },
2134 7b936c0c bellard
    { "f56", offsetof(CPUState, fpr[56]) },
2135 7b936c0c bellard
    { "f58", offsetof(CPUState, fpr[58]) },
2136 7b936c0c bellard
    { "f60", offsetof(CPUState, fpr[60]) },
2137 7b936c0c bellard
    { "f62", offsetof(CPUState, fpr[62]) },
2138 7b936c0c bellard
    { "asi", offsetof(CPUState, asi) },
2139 7b936c0c bellard
    { "pstate", offsetof(CPUState, pstate) },
2140 7b936c0c bellard
    { "cansave", offsetof(CPUState, cansave) },
2141 7b936c0c bellard
    { "canrestore", offsetof(CPUState, canrestore) },
2142 7b936c0c bellard
    { "otherwin", offsetof(CPUState, otherwin) },
2143 7b936c0c bellard
    { "wstate", offsetof(CPUState, wstate) },
2144 7b936c0c bellard
    { "cleanwin", offsetof(CPUState, cleanwin) },
2145 7b936c0c bellard
    { "fprs", offsetof(CPUState, fprs) },
2146 7b936c0c bellard
#endif
2147 9307c4c1 bellard
#endif
2148 9307c4c1 bellard
    { NULL },
2149 9307c4c1 bellard
};
2150 9307c4c1 bellard
2151 376253ec aliguori
static void expr_error(Monitor *mon, const char *msg)
2152 9dc39cba bellard
{
2153 376253ec aliguori
    monitor_printf(mon, "%s\n", msg);
2154 9307c4c1 bellard
    longjmp(expr_env, 1);
2155 9307c4c1 bellard
}
2156 9307c4c1 bellard
2157 6a00d601 bellard
/* return 0 if OK, -1 if not found, -2 if no CPU defined */
2158 92a31b1f bellard
static int get_monitor_def(target_long *pval, const char *name)
2159 9307c4c1 bellard
{
2160 8662d656 blueswir1
    const MonitorDef *md;
2161 92a31b1f bellard
    void *ptr;
2162 92a31b1f bellard
2163 9307c4c1 bellard
    for(md = monitor_defs; md->name != NULL; md++) {
2164 9307c4c1 bellard
        if (compare_cmd(name, md->name)) {
2165 9307c4c1 bellard
            if (md->get_value) {
2166 e95c8d51 bellard
                *pval = md->get_value(md, md->offset);
2167 9307c4c1 bellard
            } else {
2168 6a00d601 bellard
                CPUState *env = mon_get_cpu();
2169 6a00d601 bellard
                if (!env)
2170 6a00d601 bellard
                    return -2;
2171 6a00d601 bellard
                ptr = (uint8_t *)env + md->offset;
2172 92a31b1f bellard
                switch(md->type) {
2173 92a31b1f bellard
                case MD_I32:
2174 92a31b1f bellard
                    *pval = *(int32_t *)ptr;
2175 92a31b1f bellard
                    break;
2176 92a31b1f bellard
                case MD_TLONG:
2177 92a31b1f bellard
                    *pval = *(target_long *)ptr;
2178 92a31b1f bellard
                    break;
2179 92a31b1f bellard
                default:
2180 92a31b1f bellard
                    *pval = 0;
2181 92a31b1f bellard
                    break;
2182 92a31b1f bellard
                }
2183 9307c4c1 bellard
            }
2184 9307c4c1 bellard
            return 0;
2185 9307c4c1 bellard
        }
2186 9307c4c1 bellard
    }
2187 9307c4c1 bellard
    return -1;
2188 9307c4c1 bellard
}
2189 9307c4c1 bellard
2190 9307c4c1 bellard
static void next(void)
2191 9307c4c1 bellard
{
2192 9307c4c1 bellard
    if (pch != '\0') {
2193 9307c4c1 bellard
        pch++;
2194 cd390083 blueswir1
        while (qemu_isspace(*pch))
2195 9307c4c1 bellard
            pch++;
2196 9307c4c1 bellard
    }
2197 9307c4c1 bellard
}
2198 9307c4c1 bellard
2199 376253ec aliguori
static int64_t expr_sum(Monitor *mon);
2200 9307c4c1 bellard
2201 376253ec aliguori
static int64_t expr_unary(Monitor *mon)
2202 9307c4c1 bellard
{
2203 c2efc95d blueswir1
    int64_t n;
2204 9307c4c1 bellard
    char *p;
2205 6a00d601 bellard
    int ret;
2206 9307c4c1 bellard
2207 9307c4c1 bellard
    switch(*pch) {
2208 9307c4c1 bellard
    case '+':
2209 9307c4c1 bellard
        next();
2210 376253ec aliguori
        n = expr_unary(mon);
2211 9307c4c1 bellard
        break;
2212 9307c4c1 bellard
    case '-':
2213 9307c4c1 bellard
        next();
2214 376253ec aliguori
        n = -expr_unary(mon);
2215 9307c4c1 bellard
        break;
2216 9307c4c1 bellard
    case '~':
2217 9307c4c1 bellard
        next();
2218 376253ec aliguori
        n = ~expr_unary(mon);
2219 9307c4c1 bellard
        break;
2220 9307c4c1 bellard
    case '(':
2221 9307c4c1 bellard
        next();
2222 376253ec aliguori
        n = expr_sum(mon);
2223 9307c4c1 bellard
        if (*pch != ')') {
2224 376253ec aliguori
            expr_error(mon, "')' expected");
2225 9307c4c1 bellard
        }
2226 9307c4c1 bellard
        next();
2227 9307c4c1 bellard
        break;
2228 81d0912d bellard
    case '\'':
2229 81d0912d bellard
        pch++;
2230 81d0912d bellard
        if (*pch == '\0')
2231 376253ec aliguori
            expr_error(mon, "character constant expected");
2232 81d0912d bellard
        n = *pch;
2233 81d0912d bellard
        pch++;
2234 81d0912d bellard
        if (*pch != '\'')
2235 376253ec aliguori
            expr_error(mon, "missing terminating \' character");
2236 81d0912d bellard
        next();
2237 81d0912d bellard
        break;
2238 9307c4c1 bellard
    case '$':
2239 9307c4c1 bellard
        {
2240 9307c4c1 bellard
            char buf[128], *q;
2241 69b34976 ths
            target_long reg=0;
2242 3b46e624 ths
2243 9307c4c1 bellard
            pch++;
2244 9307c4c1 bellard
            q = buf;
2245 9307c4c1 bellard
            while ((*pch >= 'a' && *pch <= 'z') ||
2246 9307c4c1 bellard
                   (*pch >= 'A' && *pch <= 'Z') ||
2247 9307c4c1 bellard
                   (*pch >= '0' && *pch <= '9') ||
2248 57206fd4 bellard
                   *pch == '_' || *pch == '.') {
2249 9307c4c1 bellard
                if ((q - buf) < sizeof(buf) - 1)
2250 9307c4c1 bellard
                    *q++ = *pch;
2251 9307c4c1 bellard
                pch++;
2252 9307c4c1 bellard
            }
2253 cd390083 blueswir1
            while (qemu_isspace(*pch))
2254 9307c4c1 bellard
                pch++;
2255 9307c4c1 bellard
            *q = 0;
2256 7743e588 blueswir1
            ret = get_monitor_def(&reg, buf);
2257 6a00d601 bellard
            if (ret == -1)
2258 376253ec aliguori
                expr_error(mon, "unknown register");
2259 5fafdf24 ths
            else if (ret == -2)
2260 376253ec aliguori
                expr_error(mon, "no cpu defined");
2261 7743e588 blueswir1
            n = reg;
2262 9307c4c1 bellard
        }
2263 9307c4c1 bellard
        break;
2264 9307c4c1 bellard
    case '\0':
2265 376253ec aliguori
        expr_error(mon, "unexpected end of expression");
2266 9307c4c1 bellard
        n = 0;
2267 9307c4c1 bellard
        break;
2268 9307c4c1 bellard
    default:
2269 7743e588 blueswir1
#if TARGET_PHYS_ADDR_BITS > 32
2270 4f4fbf77 bellard
        n = strtoull(pch, &p, 0);
2271 4f4fbf77 bellard
#else
2272 9307c4c1 bellard
        n = strtoul(pch, &p, 0);
2273 4f4fbf77 bellard
#endif
2274 9307c4c1 bellard
        if (pch == p) {
2275 376253ec aliguori
            expr_error(mon, "invalid char in expression");
2276 9307c4c1 bellard
        }
2277 9307c4c1 bellard
        pch = p;
2278 cd390083 blueswir1
        while (qemu_isspace(*pch))
2279 9307c4c1 bellard
            pch++;
2280 9307c4c1 bellard
        break;
2281 9307c4c1 bellard
    }
2282 9307c4c1 bellard
    return n;
2283 9307c4c1 bellard
}
2284 9307c4c1 bellard
2285 9307c4c1 bellard
2286 376253ec aliguori
static int64_t expr_prod(Monitor *mon)
2287 9307c4c1 bellard
{
2288 c2efc95d blueswir1
    int64_t val, val2;
2289 92a31b1f bellard
    int op;
2290 3b46e624 ths
2291 376253ec aliguori
    val = expr_unary(mon);
2292 9307c4c1 bellard
    for(;;) {
2293 9307c4c1 bellard
        op = *pch;
2294 9307c4c1 bellard
        if (op != '*' && op != '/' && op != '%')
2295 9307c4c1 bellard
            break;
2296 9307c4c1 bellard
        next();
2297 376253ec aliguori
        val2 = expr_unary(mon);
2298 9307c4c1 bellard
        switch(op) {
2299 9307c4c1 bellard
        default:
2300 9307c4c1 bellard
        case '*':
2301 9307c4c1 bellard
            val *= val2;
2302 9307c4c1 bellard
            break;
2303 9307c4c1 bellard
        case '/':
2304 9307c4c1 bellard
        case '%':
2305 5fafdf24 ths
            if (val2 == 0)
2306 376253ec aliguori
                expr_error(mon, "division by zero");
2307 9307c4c1 bellard
            if (op == '/')
2308 9307c4c1 bellard
                val /= val2;
2309 9307c4c1 bellard
            else
2310 9307c4c1 bellard
                val %= val2;
2311 9307c4c1 bellard
            break;
2312 9307c4c1 bellard
        }
2313 9307c4c1 bellard
    }
2314 9307c4c1 bellard
    return val;
2315 9307c4c1 bellard
}
2316 9307c4c1 bellard
2317 376253ec aliguori
static int64_t expr_logic(Monitor *mon)
2318 9307c4c1 bellard
{
2319 c2efc95d blueswir1
    int64_t val, val2;
2320 92a31b1f bellard
    int op;
2321 9307c4c1 bellard
2322 376253ec aliguori
    val = expr_prod(mon);
2323 9307c4c1 bellard
    for(;;) {
2324 9307c4c1 bellard
        op = *pch;
2325 9307c4c1 bellard
        if (op != '&' && op != '|' && op != '^')
2326 9307c4c1 bellard
            break;
2327 9307c4c1 bellard
        next();
2328 376253ec aliguori
        val2 = expr_prod(mon);
2329 9307c4c1 bellard
        switch(op) {
2330 9307c4c1 bellard
        default:
2331 9307c4c1 bellard
        case '&':
2332 9307c4c1 bellard
            val &= val2;
2333 9307c4c1 bellard
            break;
2334 9307c4c1 bellard
        case '|':
2335 9307c4c1 bellard
            val |= val2;
2336 9307c4c1 bellard
            break;
2337 9307c4c1 bellard
        case '^':
2338 9307c4c1 bellard
            val ^= val2;
2339 9307c4c1 bellard
            break;
2340 9307c4c1 bellard
        }
2341 9307c4c1 bellard
    }
2342 9307c4c1 bellard
    return val;
2343 9307c4c1 bellard
}
2344 9307c4c1 bellard
2345 376253ec aliguori
static int64_t expr_sum(Monitor *mon)
2346 9307c4c1 bellard
{
2347 c2efc95d blueswir1
    int64_t val, val2;
2348 92a31b1f bellard
    int op;
2349 9307c4c1 bellard
2350 376253ec aliguori
    val = expr_logic(mon);
2351 9307c4c1 bellard
    for(;;) {
2352 9307c4c1 bellard
        op = *pch;
2353 9307c4c1 bellard
        if (op != '+' && op != '-')
2354 9307c4c1 bellard
            break;
2355 9307c4c1 bellard
        next();
2356 376253ec aliguori
        val2 = expr_logic(mon);
2357 9307c4c1 bellard
        if (op == '+')
2358 9307c4c1 bellard
            val += val2;
2359 9307c4c1 bellard
        else
2360 9307c4c1 bellard
            val -= val2;
2361 9307c4c1 bellard
    }
2362 9307c4c1 bellard
    return val;
2363 9307c4c1 bellard
}
2364 9307c4c1 bellard
2365 376253ec aliguori
static int get_expr(Monitor *mon, int64_t *pval, const char **pp)
2366 9307c4c1 bellard
{
2367 9307c4c1 bellard
    pch = *pp;
2368 9307c4c1 bellard
    if (setjmp(expr_env)) {
2369 9307c4c1 bellard
        *pp = pch;
2370 9307c4c1 bellard
        return -1;
2371 9307c4c1 bellard
    }
2372 cd390083 blueswir1
    while (qemu_isspace(*pch))
2373 9307c4c1 bellard
        pch++;
2374 376253ec aliguori
    *pval = expr_sum(mon);
2375 9307c4c1 bellard
    *pp = pch;
2376 9307c4c1 bellard
    return 0;
2377 9307c4c1 bellard
}
2378 9307c4c1 bellard
2379 9307c4c1 bellard
static int get_str(char *buf, int buf_size, const char **pp)
2380 9307c4c1 bellard
{
2381 9307c4c1 bellard
    const char *p;
2382 9307c4c1 bellard
    char *q;
2383 9307c4c1 bellard
    int c;
2384 9307c4c1 bellard
2385 81d0912d bellard
    q = buf;
2386 9307c4c1 bellard
    p = *pp;
2387 cd390083 blueswir1
    while (qemu_isspace(*p))
2388 9307c4c1 bellard
        p++;
2389 9307c4c1 bellard
    if (*p == '\0') {
2390 9307c4c1 bellard
    fail:
2391 81d0912d bellard
        *q = '\0';
2392 9307c4c1 bellard
        *pp = p;
2393 9307c4c1 bellard
        return -1;
2394 9307c4c1 bellard
    }
2395 9307c4c1 bellard
    if (*p == '\"') {
2396 9307c4c1 bellard
        p++;
2397 9307c4c1 bellard
        while (*p != '\0' && *p != '\"') {
2398 9307c4c1 bellard
            if (*p == '\\') {
2399 9307c4c1 bellard
                p++;
2400 9307c4c1 bellard
                c = *p++;
2401 9307c4c1 bellard
                switch(c) {
2402 9307c4c1 bellard
                case 'n':
2403 9307c4c1 bellard
                    c = '\n';
2404 9307c4c1 bellard
                    break;
2405 9307c4c1 bellard
                case 'r':
2406 9307c4c1 bellard
                    c = '\r';
2407 9307c4c1 bellard
                    break;
2408 9307c4c1 bellard
                case '\\':
2409 9307c4c1 bellard
                case '\'':
2410 9307c4c1 bellard
                case '\"':
2411 9307c4c1 bellard
                    break;
2412 9307c4c1 bellard
                default:
2413 9307c4c1 bellard
                    qemu_printf("unsupported escape code: '\\%c'\n", c);
2414 9307c4c1 bellard
                    goto fail;
2415 9307c4c1 bellard
                }
2416 9307c4c1 bellard
                if ((q - buf) < buf_size - 1) {
2417 9307c4c1 bellard
                    *q++ = c;
2418 9307c4c1 bellard
                }
2419 9307c4c1 bellard
            } else {
2420 9307c4c1 bellard
                if ((q - buf) < buf_size - 1) {
2421 9307c4c1 bellard
                    *q++ = *p;
2422 9307c4c1 bellard
                }
2423 9307c4c1 bellard
                p++;
2424 9307c4c1 bellard
            }
2425 9307c4c1 bellard
        }
2426 9307c4c1 bellard
        if (*p != '\"') {
2427 5b60212f bellard
            qemu_printf("unterminated string\n");
2428 9307c4c1 bellard
            goto fail;
2429 9307c4c1 bellard
        }
2430 9307c4c1 bellard
        p++;
2431 9307c4c1 bellard
    } else {
2432 cd390083 blueswir1
        while (*p != '\0' && !qemu_isspace(*p)) {
2433 9307c4c1 bellard
            if ((q - buf) < buf_size - 1) {
2434 9307c4c1 bellard
                *q++ = *p;
2435 9307c4c1 bellard
            }
2436 9307c4c1 bellard
            p++;
2437 9307c4c1 bellard
        }
2438 9307c4c1 bellard
    }
2439 81d0912d bellard
    *q = '\0';
2440 9307c4c1 bellard
    *pp = p;
2441 9307c4c1 bellard
    return 0;
2442 9307c4c1 bellard
}
2443 9307c4c1 bellard
2444 9307c4c1 bellard
static int default_fmt_format = 'x';
2445 9307c4c1 bellard
static int default_fmt_size = 4;
2446 9307c4c1 bellard
2447 9307c4c1 bellard
#define MAX_ARGS 16
2448 9307c4c1 bellard
2449 376253ec aliguori
static void monitor_handle_command(Monitor *mon, const char *cmdline)
2450 9307c4c1 bellard
{
2451 9307c4c1 bellard
    const char *p, *pstart, *typestr;
2452 9307c4c1 bellard
    char *q;
2453 9307c4c1 bellard
    int c, nb_args, len, i, has_arg;
2454 376253ec aliguori
    const mon_cmd_t *cmd;
2455 9307c4c1 bellard
    char cmdname[256];
2456 9307c4c1 bellard
    char buf[1024];
2457 9307c4c1 bellard
    void *str_allocated[MAX_ARGS];
2458 9307c4c1 bellard
    void *args[MAX_ARGS];
2459 376253ec aliguori
    void (*handler_0)(Monitor *mon);
2460 376253ec aliguori
    void (*handler_1)(Monitor *mon, void *arg0);
2461 376253ec aliguori
    void (*handler_2)(Monitor *mon, void *arg0, void *arg1);
2462 376253ec aliguori
    void (*handler_3)(Monitor *mon, void *arg0, void *arg1, void *arg2);
2463 376253ec aliguori
    void (*handler_4)(Monitor *mon, void *arg0, void *arg1, void *arg2,
2464 376253ec aliguori
                      void *arg3);
2465 376253ec aliguori
    void (*handler_5)(Monitor *mon, void *arg0, void *arg1, void *arg2,
2466 376253ec aliguori
                      void *arg3, void *arg4);
2467 376253ec aliguori
    void (*handler_6)(Monitor *mon, void *arg0, void *arg1, void *arg2,
2468 376253ec aliguori
                      void *arg3, void *arg4, void *arg5);
2469 376253ec aliguori
    void (*handler_7)(Monitor *mon, void *arg0, void *arg1, void *arg2,
2470 376253ec aliguori
                      void *arg3, void *arg4, void *arg5, void *arg6);
2471 9dc39cba bellard
2472 9dc39cba bellard
#ifdef DEBUG
2473 376253ec aliguori
    monitor_printf(mon, "command='%s'\n", cmdline);
2474 9dc39cba bellard
#endif
2475 3b46e624 ths
2476 9307c4c1 bellard
    /* extract the command name */
2477 9dc39cba bellard
    p = cmdline;
2478 9307c4c1 bellard
    q = cmdname;
2479 cd390083 blueswir1
    while (qemu_isspace(*p))
2480 9307c4c1 bellard
        p++;
2481 9307c4c1 bellard
    if (*p == '\0')
2482 9307c4c1 bellard
        return;
2483 9307c4c1 bellard
    pstart = p;
2484 cd390083 blueswir1
    while (*p != '\0' && *p != '/' && !qemu_isspace(*p))
2485 9307c4c1 bellard
        p++;
2486 9307c4c1 bellard
    len = p - pstart;
2487 9307c4c1 bellard
    if (len > sizeof(cmdname) - 1)
2488 9307c4c1 bellard
        len = sizeof(cmdname) - 1;
2489 9307c4c1 bellard
    memcpy(cmdname, pstart, len);
2490 9307c4c1 bellard
    cmdname[len] = '\0';
2491 3b46e624 ths
2492 9307c4c1 bellard
    /* find the command */
2493 376253ec aliguori
    for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
2494 5fafdf24 ths
        if (compare_cmd(cmdname, cmd->name))
2495 9307c4c1 bellard
            goto found;
2496 9307c4c1 bellard
    }
2497 376253ec aliguori
    monitor_printf(mon, "unknown command: '%s'\n", cmdname);
2498 9307c4c1 bellard
    return;
2499 9307c4c1 bellard
 found:
2500 9307c4c1 bellard
2501 9307c4c1 bellard
    for(i = 0; i < MAX_ARGS; i++)
2502 9307c4c1 bellard
        str_allocated[i] = NULL;
2503 3b46e624 ths
2504 9307c4c1 bellard
    /* parse the parameters */
2505 9307c4c1 bellard
    typestr = cmd->args_type;
2506 9307c4c1 bellard
    nb_args = 0;
2507 9dc39cba bellard
    for(;;) {
2508 9307c4c1 bellard
        c = *typestr;
2509 9307c4c1 bellard
        if (c == '\0')
2510 9dc39cba bellard
            break;
2511 9307c4c1 bellard
        typestr++;
2512 9307c4c1 bellard
        switch(c) {
2513 9307c4c1 bellard
        case 'F':
2514 81d0912d bellard
        case 'B':
2515 9307c4c1 bellard
        case 's':
2516 9307c4c1 bellard
            {
2517 9307c4c1 bellard
                int ret;
2518 9307c4c1 bellard
                char *str;
2519 3b46e624 ths
2520 cd390083 blueswir1
                while (qemu_isspace(*p))
2521 9307c4c1 bellard
                    p++;
2522 9307c4c1 bellard
                if (*typestr == '?') {
2523 9307c4c1 bellard
                    typestr++;
2524 9307c4c1 bellard
                    if (*p == '\0') {
2525 9307c4c1 bellard
                        /* no optional string: NULL argument */
2526 9307c4c1 bellard
                        str = NULL;
2527 9307c4c1 bellard
                        goto add_str;
2528 9307c4c1 bellard
                    }
2529 9307c4c1 bellard
                }
2530 9307c4c1 bellard
                ret = get_str(buf, sizeof(buf), &p);
2531 9307c4c1 bellard
                if (ret < 0) {
2532 81d0912d bellard
                    switch(c) {
2533 81d0912d bellard
                    case 'F':
2534 376253ec aliguori
                        monitor_printf(mon, "%s: filename expected\n",
2535 376253ec aliguori
                                       cmdname);
2536 81d0912d bellard
                        break;
2537 81d0912d bellard
                    case 'B':
2538 376253ec aliguori
                        monitor_printf(mon, "%s: block device name expected\n",
2539 376253ec aliguori
                                       cmdname);
2540 81d0912d bellard
                        break;
2541 81d0912d bellard
                    default:
2542 376253ec aliguori
                        monitor_printf(mon, "%s: string expected\n", cmdname);
2543 81d0912d bellard
                        break;
2544 81d0912d bellard
                    }
2545 9307c4c1 bellard
                    goto fail;
2546 9307c4c1 bellard
                }
2547 9307c4c1 bellard
                str = qemu_malloc(strlen(buf) + 1);
2548 363a37d5 blueswir1
                pstrcpy(str, sizeof(buf), buf);
2549 9307c4c1 bellard
                str_allocated[nb_args] = str;
2550 9307c4c1 bellard
            add_str:
2551 9307c4c1 bellard
                if (nb_args >= MAX_ARGS) {
2552 9307c4c1 bellard
                error_args:
2553 376253ec aliguori
                    monitor_printf(mon, "%s: too many arguments\n", cmdname);
2554 9307c4c1 bellard
                    goto fail;
2555 9307c4c1 bellard
                }
2556 9307c4c1 bellard
                args[nb_args++] = str;
2557 9307c4c1 bellard
            }
2558 9dc39cba bellard
            break;
2559 9307c4c1 bellard
        case '/':
2560 9307c4c1 bellard
            {
2561 9307c4c1 bellard
                int count, format, size;
2562 3b46e624 ths
2563 cd390083 blueswir1
                while (qemu_isspace(*p))
2564 9307c4c1 bellard
                    p++;
2565 9307c4c1 bellard
                if (*p == '/') {
2566 9307c4c1 bellard
                    /* format found */
2567 9307c4c1 bellard
                    p++;
2568 9307c4c1 bellard
                    count = 1;
2569 cd390083 blueswir1
                    if (qemu_isdigit(*p)) {
2570 9307c4c1 bellard
                        count = 0;
2571 cd390083 blueswir1
                        while (qemu_isdigit(*p)) {
2572 9307c4c1 bellard
                            count = count * 10 + (*p - '0');
2573 9307c4c1 bellard
                            p++;
2574 9307c4c1 bellard
                        }
2575 9307c4c1 bellard
                    }
2576 9307c4c1 bellard
                    size = -1;
2577 9307c4c1 bellard
                    format = -1;
2578 9307c4c1 bellard
                    for(;;) {
2579 9307c4c1 bellard
                        switch(*p) {
2580 9307c4c1 bellard
                        case 'o':
2581 9307c4c1 bellard
                        case 'd':
2582 9307c4c1 bellard
                        case 'u':
2583 9307c4c1 bellard
                        case 'x':
2584 9307c4c1 bellard
                        case 'i':
2585 9307c4c1 bellard
                        case 'c':
2586 9307c4c1 bellard
                            format = *p++;
2587 9307c4c1 bellard
                            break;
2588 9307c4c1 bellard
                        case 'b':
2589 9307c4c1 bellard
                            size = 1;
2590 9307c4c1 bellard
                            p++;
2591 9307c4c1 bellard
                            break;
2592 9307c4c1 bellard
                        case 'h':
2593 9307c4c1 bellard
                            size = 2;
2594 9307c4c1 bellard
                            p++;
2595 9307c4c1 bellard
                            break;
2596 9307c4c1 bellard
                        case 'w':
2597 9307c4c1 bellard
                            size = 4;
2598 9307c4c1 bellard
                            p++;
2599 9307c4c1 bellard
                            break;
2600 9307c4c1 bellard
                        case 'g':
2601 9307c4c1 bellard
                        case 'L':
2602 9307c4c1 bellard
                            size = 8;
2603 9307c4c1 bellard
                            p++;
2604 9307c4c1 bellard
                            break;
2605 9307c4c1 bellard
                        default:
2606 9307c4c1 bellard
                            goto next;
2607 9307c4c1 bellard
                        }
2608 9307c4c1 bellard
                    }
2609 9307c4c1 bellard
                next:
2610 cd390083 blueswir1
                    if (*p != '\0' && !qemu_isspace(*p)) {
2611 376253ec aliguori
                        monitor_printf(mon, "invalid char in format: '%c'\n",
2612 376253ec aliguori
                                       *p);
2613 9307c4c1 bellard
                        goto fail;
2614 9307c4c1 bellard
                    }
2615 9307c4c1 bellard
                    if (format < 0)
2616 9307c4c1 bellard
                        format = default_fmt_format;
2617 4c27ba27 bellard
                    if (format != 'i') {
2618 4c27ba27 bellard
                        /* for 'i', not specifying a size gives -1 as size */
2619 4c27ba27 bellard
                        if (size < 0)
2620 4c27ba27 bellard
                            size = default_fmt_size;
2621 e90f009b aurel32
                        default_fmt_size = size;
2622 4c27ba27 bellard
                    }
2623 9307c4c1 bellard
                    default_fmt_format = format;
2624 9307c4c1 bellard
                } else {
2625 9307c4c1 bellard
                    count = 1;
2626 9307c4c1 bellard
                    format = default_fmt_format;
2627 4c27ba27 bellard
                    if (format != 'i') {
2628 4c27ba27 bellard
                        size = default_fmt_size;
2629 4c27ba27 bellard
                    } else {
2630 4c27ba27 bellard
                        size = -1;
2631 4c27ba27 bellard
                    }
2632 9307c4c1 bellard
                }
2633 9307c4c1 bellard
                if (nb_args + 3 > MAX_ARGS)
2634 9307c4c1 bellard
                    goto error_args;
2635 1c5bf3bf j_mayer
                args[nb_args++] = (void*)(long)count;
2636 1c5bf3bf j_mayer
                args[nb_args++] = (void*)(long)format;
2637 1c5bf3bf j_mayer
                args[nb_args++] = (void*)(long)size;
2638 9307c4c1 bellard
            }
2639 9dc39cba bellard
            break;
2640 9307c4c1 bellard
        case 'i':
2641 92a31b1f bellard
        case 'l':
2642 9307c4c1 bellard
            {
2643 c2efc95d blueswir1
                int64_t val;
2644 7743e588 blueswir1
2645 cd390083 blueswir1
                while (qemu_isspace(*p))
2646 9307c4c1 bellard
                    p++;
2647 3440557b bellard
                if (*typestr == '?' || *typestr == '.') {
2648 3440557b bellard
                    if (*typestr == '?') {
2649 3440557b bellard
                        if (*p == '\0')
2650 3440557b bellard
                            has_arg = 0;
2651 3440557b bellard
                        else
2652 3440557b bellard
                            has_arg = 1;
2653 3440557b bellard
                    } else {
2654 3440557b bellard
                        if (*p == '.') {
2655 3440557b bellard
                            p++;
2656 cd390083 blueswir1
                            while (qemu_isspace(*p))
2657 3440557b bellard
                                p++;
2658 3440557b bellard
                            has_arg = 1;
2659 3440557b bellard
                        } else {
2660 3440557b bellard
                            has_arg = 0;
2661 3440557b bellard
                        }
2662 3440557b bellard
                    }
2663 13224a87 bellard
                    typestr++;
2664 9307c4c1 bellard
                    if (nb_args >= MAX_ARGS)
2665 9307c4c1 bellard
                        goto error_args;
2666 1c5bf3bf j_mayer
                    args[nb_args++] = (void *)(long)has_arg;
2667 9307c4c1 bellard
                    if (!has_arg) {
2668 9307c4c1 bellard
                        if (nb_args >= MAX_ARGS)
2669 9307c4c1 bellard
                            goto error_args;
2670 9307c4c1 bellard
                        val = -1;
2671 9307c4c1 bellard
                        goto add_num;
2672 9307c4c1 bellard
                    }
2673 9307c4c1 bellard
                }
2674 376253ec aliguori
                if (get_expr(mon, &val, &p))
2675 9307c4c1 bellard
                    goto fail;
2676 9307c4c1 bellard
            add_num:
2677 92a31b1f bellard
                if (c == 'i') {
2678 92a31b1f bellard
                    if (nb_args >= MAX_ARGS)
2679 92a31b1f bellard
                        goto error_args;
2680 1c5bf3bf j_mayer
                    args[nb_args++] = (void *)(long)val;
2681 92a31b1f bellard
                } else {
2682 92a31b1f bellard
                    if ((nb_args + 1) >= MAX_ARGS)
2683 92a31b1f bellard
                        goto error_args;
2684 7743e588 blueswir1
#if TARGET_PHYS_ADDR_BITS > 32
2685 1c5bf3bf j_mayer
                    args[nb_args++] = (void *)(long)((val >> 32) & 0xffffffff);
2686 92a31b1f bellard
#else
2687 92a31b1f bellard
                    args[nb_args++] = (void *)0;
2688 92a31b1f bellard
#endif
2689 1c5bf3bf j_mayer
                    args[nb_args++] = (void *)(long)(val & 0xffffffff);
2690 92a31b1f bellard
                }
2691 9307c4c1 bellard
            }
2692 9307c4c1 bellard
            break;
2693 9307c4c1 bellard
        case '-':
2694 9307c4c1 bellard
            {
2695 9307c4c1 bellard
                int has_option;
2696 9307c4c1 bellard
                /* option */
2697 3b46e624 ths
2698 9307c4c1 bellard
                c = *typestr++;
2699 9307c4c1 bellard
                if (c == '\0')
2700 9307c4c1 bellard
                    goto bad_type;
2701 cd390083 blueswir1
                while (qemu_isspace(*p))
2702 9307c4c1 bellard
                    p++;
2703 9307c4c1 bellard
                has_option = 0;
2704 9307c4c1 bellard
                if (*p == '-') {
2705 9307c4c1 bellard
                    p++;
2706 9307c4c1 bellard
                    if (*p != c) {
2707 376253ec aliguori
                        monitor_printf(mon, "%s: unsupported option -%c\n",
2708 376253ec aliguori
                                       cmdname, *p);
2709 9307c4c1 bellard
                        goto fail;
2710 9307c4c1 bellard
                    }
2711 9307c4c1 bellard
                    p++;
2712 9307c4c1 bellard
                    has_option = 1;
2713 9307c4c1 bellard
                }
2714 9307c4c1 bellard
                if (nb_args >= MAX_ARGS)
2715 9307c4c1 bellard
                    goto error_args;
2716 1c5bf3bf j_mayer
                args[nb_args++] = (void *)(long)has_option;
2717 9307c4c1 bellard
            }
2718 9307c4c1 bellard
            break;
2719 9307c4c1 bellard
        default:
2720 9307c4c1 bellard
        bad_type:
2721 376253ec aliguori
            monitor_printf(mon, "%s: unknown type '%c'\n", cmdname, c);
2722 9307c4c1 bellard
            goto fail;
2723 9307c4c1 bellard
        }
2724 9dc39cba bellard
    }
2725 9307c4c1 bellard
    /* check that all arguments were parsed */
2726 cd390083 blueswir1
    while (qemu_isspace(*p))
2727 9307c4c1 bellard
        p++;
2728 9307c4c1 bellard
    if (*p != '\0') {
2729 376253ec aliguori
        monitor_printf(mon, "%s: extraneous characters at the end of line\n",
2730 376253ec aliguori
                       cmdname);
2731 9307c4c1 bellard
        goto fail;
2732 9dc39cba bellard
    }
2733 9307c4c1 bellard
2734 9307c4c1 bellard
    switch(nb_args) {
2735 9307c4c1 bellard
    case 0:
2736 a5f1b965 blueswir1
        handler_0 = cmd->handler;
2737 376253ec aliguori
        handler_0(mon);
2738 9307c4c1 bellard
        break;
2739 9307c4c1 bellard
    case 1:
2740 a5f1b965 blueswir1
        handler_1 = cmd->handler;
2741 376253ec aliguori
        handler_1(mon, args[0]);
2742 9307c4c1 bellard
        break;
2743 9307c4c1 bellard
    case 2:
2744 a5f1b965 blueswir1
        handler_2 = cmd->handler;
2745 376253ec aliguori
        handler_2(mon, args[0], args[1]);
2746 9307c4c1 bellard
        break;
2747 9307c4c1 bellard
    case 3:
2748 a5f1b965 blueswir1
        handler_3 = cmd->handler;
2749 376253ec aliguori
        handler_3(mon, args[0], args[1], args[2]);
2750 9307c4c1 bellard
        break;
2751 9307c4c1 bellard
    case 4:
2752 a5f1b965 blueswir1
        handler_4 = cmd->handler;
2753 376253ec aliguori
        handler_4(mon, args[0], args[1], args[2], args[3]);
2754 9307c4c1 bellard
        break;
2755 9307c4c1 bellard
    case 5:
2756 a5f1b965 blueswir1
        handler_5 = cmd->handler;
2757 376253ec aliguori
        handler_5(mon, args[0], args[1], args[2], args[3], args[4]);
2758 9307c4c1 bellard
        break;
2759 3440557b bellard
    case 6:
2760 a5f1b965 blueswir1
        handler_6 = cmd->handler;
2761 376253ec aliguori
        handler_6(mon, args[0], args[1], args[2], args[3], args[4], args[5]);
2762 3440557b bellard
        break;
2763 ec36b695 bellard
    case 7:
2764 a5f1b965 blueswir1
        handler_7 = cmd->handler;
2765 376253ec aliguori
        handler_7(mon, args[0], args[1], args[2], args[3], args[4], args[5],
2766 376253ec aliguori
                  args[6]);
2767 ec36b695 bellard
        break;
2768 9307c4c1 bellard
    default:
2769 376253ec aliguori
        monitor_printf(mon, "unsupported number of arguments: %d\n", nb_args);
2770 9307c4c1 bellard
        goto fail;
2771 9dc39cba bellard
    }
2772 9307c4c1 bellard
 fail:
2773 9307c4c1 bellard
    for(i = 0; i < MAX_ARGS; i++)
2774 9307c4c1 bellard
        qemu_free(str_allocated[i]);
2775 9dc39cba bellard
    return;
2776 9dc39cba bellard
}
2777 9dc39cba bellard
2778 81d0912d bellard
static void cmd_completion(const char *name, const char *list)
2779 81d0912d bellard
{
2780 81d0912d bellard
    const char *p, *pstart;
2781 81d0912d bellard
    char cmd[128];
2782 81d0912d bellard
    int len;
2783 81d0912d bellard
2784 81d0912d bellard
    p = list;
2785 81d0912d bellard
    for(;;) {
2786 81d0912d bellard
        pstart = p;
2787 81d0912d bellard
        p = strchr(p, '|');
2788 81d0912d bellard
        if (!p)
2789 81d0912d bellard
            p = pstart + strlen(pstart);
2790 81d0912d bellard
        len = p - pstart;
2791 81d0912d bellard
        if (len > sizeof(cmd) - 2)
2792 81d0912d bellard
            len = sizeof(cmd) - 2;
2793 81d0912d bellard
        memcpy(cmd, pstart, len);
2794 81d0912d bellard
        cmd[len] = '\0';
2795 81d0912d bellard
        if (name[0] == '\0' || !strncmp(name, cmd, strlen(name))) {
2796 731b0364 aliguori
            readline_add_completion(cur_mon->rs, cmd);
2797 81d0912d bellard
        }
2798 81d0912d bellard
        if (*p == '\0')
2799 81d0912d bellard
            break;
2800 81d0912d bellard
        p++;
2801 81d0912d bellard
    }
2802 81d0912d bellard
}
2803 81d0912d bellard
2804 81d0912d bellard
static void file_completion(const char *input)
2805 81d0912d bellard
{
2806 81d0912d bellard
    DIR *ffs;
2807 81d0912d bellard
    struct dirent *d;
2808 81d0912d bellard
    char path[1024];
2809 81d0912d bellard
    char file[1024], file_prefix[1024];
2810 81d0912d bellard
    int input_path_len;
2811 81d0912d bellard
    const char *p;
2812 81d0912d bellard
2813 5fafdf24 ths
    p = strrchr(input, '/');
2814 81d0912d bellard
    if (!p) {
2815 81d0912d bellard
        input_path_len = 0;
2816 81d0912d bellard
        pstrcpy(file_prefix, sizeof(file_prefix), input);
2817 363a37d5 blueswir1
        pstrcpy(path, sizeof(path), ".");
2818 81d0912d bellard
    } else {
2819 81d0912d bellard
        input_path_len = p - input + 1;
2820 81d0912d bellard
        memcpy(path, input, input_path_len);
2821 81d0912d bellard
        if (input_path_len > sizeof(path) - 1)
2822 81d0912d bellard
            input_path_len = sizeof(path) - 1;
2823 81d0912d bellard
        path[input_path_len] = '\0';
2824 81d0912d bellard
        pstrcpy(file_prefix, sizeof(file_prefix), p + 1);
2825 81d0912d bellard
    }
2826 81d0912d bellard
#ifdef DEBUG_COMPLETION
2827 376253ec aliguori
    monitor_printf(cur_mon, "input='%s' path='%s' prefix='%s'\n",
2828 376253ec aliguori
                   input, path, file_prefix);
2829 81d0912d bellard
#endif
2830 81d0912d bellard
    ffs = opendir(path);
2831 81d0912d bellard
    if (!ffs)
2832 81d0912d bellard
        return;
2833 81d0912d bellard
    for(;;) {
2834 81d0912d bellard
        struct stat sb;
2835 81d0912d bellard
        d = readdir(ffs);
2836 81d0912d bellard
        if (!d)
2837 81d0912d bellard
            break;
2838 81d0912d bellard
        if (strstart(d->d_name, file_prefix, NULL)) {
2839 81d0912d bellard
            memcpy(file, input, input_path_len);
2840 363a37d5 blueswir1
            if (input_path_len < sizeof(file))
2841 363a37d5 blueswir1
                pstrcpy(file + input_path_len, sizeof(file) - input_path_len,
2842 363a37d5 blueswir1
                        d->d_name);
2843 81d0912d bellard
            /* stat the file to find out if it's a directory.
2844 81d0912d bellard
             * In that case add a slash to speed up typing long paths
2845 81d0912d bellard
             */
2846 81d0912d bellard
            stat(file, &sb);
2847 81d0912d bellard
            if(S_ISDIR(sb.st_mode))
2848 363a37d5 blueswir1
                pstrcat(file, sizeof(file), "/");
2849 731b0364 aliguori
            readline_add_completion(cur_mon->rs, file);
2850 81d0912d bellard
        }
2851 81d0912d bellard
    }
2852 81d0912d bellard
    closedir(ffs);
2853 81d0912d bellard
}
2854 81d0912d bellard
2855 51de9760 aliguori
static void block_completion_it(void *opaque, BlockDriverState *bs)
2856 81d0912d bellard
{
2857 51de9760 aliguori
    const char *name = bdrv_get_device_name(bs);
2858 81d0912d bellard
    const char *input = opaque;
2859 81d0912d bellard
2860 81d0912d bellard
    if (input[0] == '\0' ||
2861 81d0912d bellard
        !strncmp(name, (char *)input, strlen(input))) {
2862 731b0364 aliguori
        readline_add_completion(cur_mon->rs, name);
2863 81d0912d bellard
    }
2864 81d0912d bellard
}
2865 81d0912d bellard
2866 81d0912d bellard
/* NOTE: this parser is an approximate form of the real command parser */
2867 81d0912d bellard
static void parse_cmdline(const char *cmdline,
2868 81d0912d bellard
                         int *pnb_args, char **args)
2869 81d0912d bellard
{
2870 81d0912d bellard
    const char *p;
2871 81d0912d bellard
    int nb_args, ret;
2872 81d0912d bellard
    char buf[1024];
2873 81d0912d bellard
2874 81d0912d bellard
    p = cmdline;
2875 81d0912d bellard
    nb_args = 0;
2876 81d0912d bellard
    for(;;) {
2877 cd390083 blueswir1
        while (qemu_isspace(*p))
2878 81d0912d bellard
            p++;
2879 81d0912d bellard
        if (*p == '\0')
2880 81d0912d bellard
            break;
2881 81d0912d bellard
        if (nb_args >= MAX_ARGS)
2882 81d0912d bellard
            break;
2883 81d0912d bellard
        ret = get_str(buf, sizeof(buf), &p);
2884 81d0912d bellard
        args[nb_args] = qemu_strdup(buf);
2885 81d0912d bellard
        nb_args++;
2886 81d0912d bellard
        if (ret < 0)
2887 81d0912d bellard
            break;
2888 81d0912d bellard
    }
2889 81d0912d bellard
    *pnb_args = nb_args;
2890 81d0912d bellard
}
2891 81d0912d bellard
2892 4c36ba32 aliguori
static void monitor_find_completion(const char *cmdline)
2893 81d0912d bellard
{
2894 81d0912d bellard
    const char *cmdname;
2895 81d0912d bellard
    char *args[MAX_ARGS];
2896 81d0912d bellard
    int nb_args, i, len;
2897 81d0912d bellard
    const char *ptype, *str;
2898 376253ec aliguori
    const mon_cmd_t *cmd;
2899 64866c3d bellard
    const KeyDef *key;
2900 81d0912d bellard
2901 81d0912d bellard
    parse_cmdline(cmdline, &nb_args, args);
2902 81d0912d bellard
#ifdef DEBUG_COMPLETION
2903 81d0912d bellard
    for(i = 0; i < nb_args; i++) {
2904 376253ec aliguori
        monitor_printf(cur_mon, "arg%d = '%s'\n", i, (char *)args[i]);
2905 81d0912d bellard
    }
2906 81d0912d bellard
#endif
2907 81d0912d bellard
2908 81d0912d bellard
    /* if the line ends with a space, it means we want to complete the
2909 81d0912d bellard
       next arg */
2910 81d0912d bellard
    len = strlen(cmdline);
2911 cd390083 blueswir1
    if (len > 0 && qemu_isspace(cmdline[len - 1])) {
2912 81d0912d bellard
        if (nb_args >= MAX_ARGS)
2913 81d0912d bellard
            return;
2914 81d0912d bellard
        args[nb_args++] = qemu_strdup("");
2915 81d0912d bellard
    }
2916 81d0912d bellard
    if (nb_args <= 1) {
2917 81d0912d bellard
        /* command completion */
2918 81d0912d bellard
        if (nb_args == 0)
2919 81d0912d bellard
            cmdname = "";
2920 81d0912d bellard
        else
2921 81d0912d bellard
            cmdname = args[0];
2922 731b0364 aliguori
        readline_set_completion_index(cur_mon->rs, strlen(cmdname));
2923 376253ec aliguori
        for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
2924 81d0912d bellard
            cmd_completion(cmdname, cmd->name);
2925 81d0912d bellard
        }
2926 81d0912d bellard
    } else {
2927 81d0912d bellard
        /* find the command */
2928 376253ec aliguori
        for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
2929 81d0912d bellard
            if (compare_cmd(args[0], cmd->name))
2930 81d0912d bellard
                goto found;
2931 81d0912d bellard
        }
2932 81d0912d bellard
        return;
2933 81d0912d bellard
    found:
2934 81d0912d bellard
        ptype = cmd->args_type;
2935 81d0912d bellard
        for(i = 0; i < nb_args - 2; i++) {
2936 81d0912d bellard
            if (*ptype != '\0') {
2937 81d0912d bellard
                ptype++;
2938 81d0912d bellard
                while (*ptype == '?')
2939 81d0912d bellard
                    ptype++;
2940 81d0912d bellard
            }
2941 81d0912d bellard
        }
2942 81d0912d bellard
        str = args[nb_args - 1];
2943 81d0912d bellard
        switch(*ptype) {
2944 81d0912d bellard
        case 'F':
2945 81d0912d bellard
            /* file completion */
2946 731b0364 aliguori
            readline_set_completion_index(cur_mon->rs, strlen(str));
2947 81d0912d bellard
            file_completion(str);
2948 81d0912d bellard
            break;
2949 81d0912d bellard
        case 'B':
2950 81d0912d bellard
            /* block device name completion */
2951 731b0364 aliguori
            readline_set_completion_index(cur_mon->rs, strlen(str));
2952 81d0912d bellard
            bdrv_iterate(block_completion_it, (void *)str);
2953 81d0912d bellard
            break;
2954 7fe48483 bellard
        case 's':
2955 7fe48483 bellard
            /* XXX: more generic ? */
2956 7fe48483 bellard
            if (!strcmp(cmd->name, "info")) {
2957 731b0364 aliguori
                readline_set_completion_index(cur_mon->rs, strlen(str));
2958 7fe48483 bellard
                for(cmd = info_cmds; cmd->name != NULL; cmd++) {
2959 7fe48483 bellard
                    cmd_completion(str, cmd->name);
2960 7fe48483 bellard
                }
2961 64866c3d bellard
            } else if (!strcmp(cmd->name, "sendkey")) {
2962 e600d1ef blueswir1
                char *sep = strrchr(str, '-');
2963 e600d1ef blueswir1
                if (sep)
2964 e600d1ef blueswir1
                    str = sep + 1;
2965 731b0364 aliguori
                readline_set_completion_index(cur_mon->rs, strlen(str));
2966 64866c3d bellard
                for(key = key_defs; key->name != NULL; key++) {
2967 64866c3d bellard
                    cmd_completion(str, key->name);
2968 64866c3d bellard
                }
2969 7fe48483 bellard
            }
2970 7fe48483 bellard
            break;
2971 81d0912d bellard
        default:
2972 81d0912d bellard
            break;
2973 81d0912d bellard
        }
2974 81d0912d bellard
    }
2975 81d0912d bellard
    for(i = 0; i < nb_args; i++)
2976 81d0912d bellard
        qemu_free(args[i]);
2977 81d0912d bellard
}
2978 81d0912d bellard
2979 731b0364 aliguori
static int monitor_can_read(void *opaque)
2980 9dc39cba bellard
{
2981 731b0364 aliguori
    Monitor *mon = opaque;
2982 731b0364 aliguori
2983 731b0364 aliguori
    return (mon->suspend_cnt == 0) ? 128 : 0;
2984 9dc39cba bellard
}
2985 9dc39cba bellard
2986 731b0364 aliguori
static void monitor_read(void *opaque, const uint8_t *buf, int size)
2987 9dc39cba bellard
{
2988 731b0364 aliguori
    Monitor *old_mon = cur_mon;
2989 7e2515e8 bellard
    int i;
2990 376253ec aliguori
2991 731b0364 aliguori
    cur_mon = opaque;
2992 731b0364 aliguori
2993 cde76ee1 aliguori
    if (cur_mon->rs) {
2994 cde76ee1 aliguori
        for (i = 0; i < size; i++)
2995 cde76ee1 aliguori
            readline_handle_byte(cur_mon->rs, buf[i]);
2996 cde76ee1 aliguori
    } else {
2997 cde76ee1 aliguori
        if (size == 0 || buf[size - 1] != 0)
2998 cde76ee1 aliguori
            monitor_printf(cur_mon, "corrupted command\n");
2999 cde76ee1 aliguori
        else
3000 cde76ee1 aliguori
            monitor_handle_command(cur_mon, (char *)buf);
3001 cde76ee1 aliguori
    }
3002 9dc39cba bellard
3003 731b0364 aliguori
    cur_mon = old_mon;
3004 731b0364 aliguori
}
3005 d8f44609 aliguori
3006 376253ec aliguori
static void monitor_command_cb(Monitor *mon, const char *cmdline, void *opaque)
3007 aa455485 bellard
{
3008 731b0364 aliguori
    monitor_suspend(mon);
3009 376253ec aliguori
    monitor_handle_command(mon, cmdline);
3010 731b0364 aliguori
    monitor_resume(mon);
3011 d8f44609 aliguori
}
3012 d8f44609 aliguori
3013 cde76ee1 aliguori
int monitor_suspend(Monitor *mon)
3014 d8f44609 aliguori
{
3015 cde76ee1 aliguori
    if (!mon->rs)
3016 cde76ee1 aliguori
        return -ENOTTY;
3017 731b0364 aliguori
    mon->suspend_cnt++;
3018 cde76ee1 aliguori
    return 0;
3019 d8f44609 aliguori
}
3020 d8f44609 aliguori
3021 376253ec aliguori
void monitor_resume(Monitor *mon)
3022 d8f44609 aliguori
{
3023 cde76ee1 aliguori
    if (!mon->rs)
3024 cde76ee1 aliguori
        return;
3025 731b0364 aliguori
    if (--mon->suspend_cnt == 0)
3026 731b0364 aliguori
        readline_show_prompt(mon->rs);
3027 aa455485 bellard
}
3028 aa455485 bellard
3029 731b0364 aliguori
static void monitor_event(void *opaque, int event)
3030 86e94dea ths
{
3031 376253ec aliguori
    Monitor *mon = opaque;
3032 376253ec aliguori
3033 2724b180 aliguori
    switch (event) {
3034 2724b180 aliguori
    case CHR_EVENT_MUX_IN:
3035 2724b180 aliguori
        readline_restart(mon->rs);
3036 2724b180 aliguori
        monitor_resume(mon);
3037 2724b180 aliguori
        monitor_flush(mon);
3038 2724b180 aliguori
        break;
3039 2724b180 aliguori
3040 2724b180 aliguori
    case CHR_EVENT_MUX_OUT:
3041 2724b180 aliguori
        if (mon->suspend_cnt == 0)
3042 2724b180 aliguori
            monitor_printf(mon, "\n");
3043 2724b180 aliguori
        monitor_flush(mon);
3044 2724b180 aliguori
        monitor_suspend(mon);
3045 2724b180 aliguori
        break;
3046 86e94dea ths
3047 2724b180 aliguori
    case CHR_EVENT_RESET:
3048 2724b180 aliguori
        monitor_printf(mon, "QEMU %s monitor - type 'help' for more "
3049 2724b180 aliguori
                       "information\n", QEMU_VERSION);
3050 2724b180 aliguori
        if (mon->chr->focus == 0)
3051 2724b180 aliguori
            readline_show_prompt(mon->rs);
3052 2724b180 aliguori
        break;
3053 2724b180 aliguori
    }
3054 86e94dea ths
}
3055 86e94dea ths
3056 76655d6d aliguori
3057 76655d6d aliguori
/*
3058 76655d6d aliguori
 * Local variables:
3059 76655d6d aliguori
 *  c-indent-level: 4
3060 76655d6d aliguori
 *  c-basic-offset: 4
3061 76655d6d aliguori
 *  tab-width: 8
3062 76655d6d aliguori
 * End:
3063 76655d6d aliguori
 */
3064 76655d6d aliguori
3065 731b0364 aliguori
void monitor_init(CharDriverState *chr, int flags)
3066 aa455485 bellard
{
3067 731b0364 aliguori
    static int is_first_init = 1;
3068 87127161 aliguori
    Monitor *mon;
3069 20d8a3ed ths
3070 20d8a3ed ths
    if (is_first_init) {
3071 c8256f9d balrog
        key_timer = qemu_new_timer(vm_clock, release_keys, NULL);
3072 20d8a3ed ths
        is_first_init = 0;
3073 20d8a3ed ths
    }
3074 87127161 aliguori
3075 87127161 aliguori
    mon = qemu_mallocz(sizeof(*mon));
3076 20d8a3ed ths
3077 87127161 aliguori
    mon->chr = chr;
3078 731b0364 aliguori
    mon->flags = flags;
3079 2724b180 aliguori
    if (mon->chr->focus != 0)
3080 2724b180 aliguori
        mon->suspend_cnt = 1; /* mux'ed monitors start suspended */
3081 cde76ee1 aliguori
    if (flags & MONITOR_USE_READLINE) {
3082 cde76ee1 aliguori
        mon->rs = readline_init(mon, monitor_find_completion);
3083 cde76ee1 aliguori
        monitor_read_command(mon, 0);
3084 cde76ee1 aliguori
    }
3085 87127161 aliguori
3086 731b0364 aliguori
    qemu_chr_add_handlers(chr, monitor_can_read, monitor_read, monitor_event,
3087 731b0364 aliguori
                          mon);
3088 87127161 aliguori
3089 87127161 aliguori
    LIST_INSERT_HEAD(&mon_list, mon, entry);
3090 731b0364 aliguori
    if (!cur_mon || (flags & MONITOR_IS_DEFAULT))
3091 87127161 aliguori
        cur_mon = mon;
3092 aa455485 bellard
}
3093 aa455485 bellard
3094 376253ec aliguori
static void bdrv_password_cb(Monitor *mon, const char *password, void *opaque)
3095 81d0912d bellard
{
3096 bb5fc20f aliguori
    BlockDriverState *bs = opaque;
3097 bb5fc20f aliguori
    int ret = 0;
3098 81d0912d bellard
3099 bb5fc20f aliguori
    if (bdrv_set_key(bs, password) != 0) {
3100 376253ec aliguori
        monitor_printf(mon, "invalid password\n");
3101 bb5fc20f aliguori
        ret = -EPERM;
3102 9dc39cba bellard
    }
3103 731b0364 aliguori
    if (mon->password_completion_cb)
3104 731b0364 aliguori
        mon->password_completion_cb(mon->password_opaque, ret);
3105 bb5fc20f aliguori
3106 731b0364 aliguori
    monitor_read_command(mon, 1);
3107 9dc39cba bellard
}
3108 c0f4ce77 aliguori
3109 376253ec aliguori
void monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs,
3110 bb5fc20f aliguori
                                 BlockDriverCompletionFunc *completion_cb,
3111 bb5fc20f aliguori
                                 void *opaque)
3112 c0f4ce77 aliguori
{
3113 cde76ee1 aliguori
    int err;
3114 cde76ee1 aliguori
3115 bb5fc20f aliguori
    if (!bdrv_key_required(bs)) {
3116 bb5fc20f aliguori
        if (completion_cb)
3117 bb5fc20f aliguori
            completion_cb(opaque, 0);
3118 bb5fc20f aliguori
        return;
3119 bb5fc20f aliguori
    }
3120 c0f4ce77 aliguori
3121 376253ec aliguori
    monitor_printf(mon, "%s (%s) is encrypted.\n", bdrv_get_device_name(bs),
3122 376253ec aliguori
                   bdrv_get_encrypted_filename(bs));
3123 bb5fc20f aliguori
3124 731b0364 aliguori
    mon->password_completion_cb = completion_cb;
3125 731b0364 aliguori
    mon->password_opaque = opaque;
3126 bb5fc20f aliguori
3127 cde76ee1 aliguori
    err = monitor_read_password(mon, bdrv_password_cb, bs);
3128 cde76ee1 aliguori
3129 cde76ee1 aliguori
    if (err && completion_cb)
3130 cde76ee1 aliguori
        completion_cb(opaque, err);
3131 c0f4ce77 aliguori
}