Statistics
| Branch: | Revision:

root / monitor.c @ 651721b2

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