18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * QEMU monitor
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 2003-2004 Fabrice Bellard
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a copy
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * of this software and associated documentation files (the "Software"), to deal
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * in the Software without restriction, including without limitation the rights
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * copies of the Software, and to permit persons to whom the Software is
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * furnished to do so, subject to the following conditions:
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * The above copyright notice and this permission notice shall be included in
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * all copies or substantial portions of the Software.
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE SOFTWARE.
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <dirent.h>
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "hw/hw.h"
265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "hw/qdev.h"
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "hw/usb.h"
285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "hw/pcmcia.h"
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "hw/pc.h"
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "hw/pci.h"
315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "hw/watchdog.h"
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "gdbstub.h"
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "net.h"
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "qemu-char.h"
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "sysemu.h"
365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "monitor.h"
375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "readline.h"
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "console.h"
39cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner#include "blockdev.h"
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "audio/audio.h"
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "disas.h"
425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "balloon.h"
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "qemu-timer.h"
445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "migration.h"
455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "kvm.h"
465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "acl.h"
475285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#include "exec-all.h"
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//#define DEBUG
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//#define DEBUG_COMPLETION
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Supported types:
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 'F'          filename
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 'B'          block device name
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 's'          string (accept optional quote)
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 'i'          32 bit integer
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 'l'          target long (32 or 64 bit)
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * '/'          optional gdb-like print format (like "/10x")
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * '?'          optional type (for 'F', 's' and 'i')
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct mon_cmd_t {
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *name;
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *args_type;
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    void *handler;
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *params;
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *help;
725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} mon_cmd_t;
735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
74e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner#define MON_CMD_T_INITIALIZER { NULL, NULL, NULL, NULL, NULL }
75e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner
765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct Monitor {
775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    CharDriverState *chr;
789d1188280fa5294f9438424e5e8eae91f645bfd8David Turner    int mux_out;
799d1188280fa5294f9438424e5e8eae91f645bfd8David Turner    int reset_seen;
805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int flags;
815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int suspend_cnt;
825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    uint8_t outbuf[1024];
835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int outbuf_index;
845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    ReadLineState *rs;
855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    CPUState *mon_cpu;
865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    BlockDriverCompletionFunc *password_completion_cb;
875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void *password_opaque;
88a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner    QLIST_ENTRY(Monitor) entry;
89e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner    int has_quit;
9095a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner#ifdef CONFIG_ANDROID
9195a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner    void*            fake_opaque;
9295a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner    MonitorFakeFunc  fake_func;
9395a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner    int64_t          fake_count;
9495a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner
9595a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner#endif
965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner};
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9895a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner#ifdef CONFIG_ANDROID
9995a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner#include "monitor-android.h"
10095a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner#endif
10195a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner
102a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turnerstatic QLIST_HEAD(mon_list, Monitor) mon_list;
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
104334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima#if defined(TARGET_I386)
105334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajimastatic void do_inject_mce(Monitor *mon,
106334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                          int cpu_index, int bank,
107334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                          unsigned status_hi, unsigned status_lo,
108334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                          unsigned mcg_status_hi, unsigned mcg_status_lo,
109334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                          unsigned addr_hi, unsigned addr_lo,
110334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                          unsigned misc_hi, unsigned misc_lo)
111334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima{
112334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima    CPUState *cenv;
113334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima    uint64_t status = ((uint64_t)status_hi << 32) | status_lo;
114334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima    uint64_t mcg_status = ((uint64_t)mcg_status_hi << 32) | mcg_status_lo;
115334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima    uint64_t addr = ((uint64_t)addr_hi << 32) | addr_lo;
116334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima    uint64_t misc = ((uint64_t)misc_hi << 32) | misc_lo;
117334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima
118334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima    for (cenv = first_cpu; cenv != NULL; cenv = cenv->next_cpu)
119334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        if (cenv->cpu_index == cpu_index && cenv->mcg_cap) {
120334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima            cpu_inject_x86_mce(cenv, bank, status, mcg_status, addr, misc);
121334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima            break;
122334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        }
123334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima}
124334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima#endif
125334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima
1265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic const mon_cmd_t mon_cmds[];
1275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic const mon_cmd_t info_cmds[];
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerMonitor *cur_mon = NULL;
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void monitor_command_cb(Monitor *mon, const char *cmdline,
1325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                               void *opaque);
1335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
134edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turnerstatic inline int qmp_cmd_mode(const Monitor *mon)
135edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner{
136edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner    //return (mon->mc ? mon->mc->command_mode : 0);
137edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner    return 0;
138edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner}
139edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner
140edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner/* Return true if in control mode, false otherwise */
141edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turnerstatic inline int monitor_ctrl_mode(const Monitor *mon)
142edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner{
143edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner    return (mon->flags & MONITOR_USE_CONTROL);
144edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner}
145edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner
146edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner/* Return non-zero iff we have a current monitor, and it is in QMP mode.  */
147edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turnerint monitor_cur_is_qmp(void)
148edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner{
149edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner    return cur_mon && monitor_ctrl_mode(cur_mon);
150edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner}
151edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner
1525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void monitor_read_command(Monitor *mon, int show_prompt)
1535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
1545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    readline_start(mon->rs, "(qemu) ", 0, monitor_command_cb, NULL);
1555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (show_prompt)
1565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        readline_show_prompt(mon->rs);
1575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
1605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                 void *opaque)
1615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
1625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (mon->rs) {
1635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        readline_start(mon->rs, "Password: ", 1, readline_func, opaque);
1645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        /* prompt is printed on return from the command handler */
1655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        return 0;
1665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    } else {
1675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "terminal does not support password prompting\n");
1685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        return -ENOTTY;
1695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    }
1705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17295a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner#ifndef CONFIG_ANDROID /* See monitor-android.h */
1735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid monitor_flush(Monitor *mon)
1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1759d1188280fa5294f9438424e5e8eae91f645bfd8David Turner    if (mon && mon->outbuf_index != 0 && !mon->mux_out) {
1765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        qemu_chr_write(mon->chr, mon->outbuf, mon->outbuf_index);
1775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        mon->outbuf_index = 0;
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
18095a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner#endif
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* flush at every end of line or if the buffer is full */
1835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void monitor_puts(Monitor *mon, const char *str)
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char c;
1865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (!mon)
1885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        return;
1895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(;;) {
1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        c = *str++;
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (c == '\0')
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (c == '\n')
1955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            mon->outbuf[mon->outbuf_index++] = '\r';
1965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        mon->outbuf[mon->outbuf_index++] = c;
1975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        if (mon->outbuf_index >= (sizeof(mon->outbuf) - 1)
1985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            || c == '\n')
1995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_flush(mon);
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
203d09775c3fe2d9ef1ffca6437beb3f328ab99f2beDavid 'Digit' Turnervoid monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char buf[4096];
206d09775c3fe2d9ef1ffca6437beb3f328ab99f2beDavid 'Digit' Turner    vsnprintf(buf, sizeof(buf), fmt, ap);
2075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_puts(mon, buf);
2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid monitor_printf(Monitor *mon, const char *fmt, ...)
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    va_list ap;
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    va_start(ap, fmt);
2145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_vprintf(mon, fmt, ap);
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    va_end(ap);
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid monitor_print_filename(Monitor *mon, const char *filename)
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int i;
2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for (i = 0; filename[i]; i++) {
2235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        switch (filename[i]) {
2245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        case ' ':
2255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        case '"':
2265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        case '\\':
2275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "\\%c", filename[i]);
2285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            break;
2295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        case '\t':
2305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "\\t");
2315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            break;
2325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        case '\r':
2335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "\\r");
2345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            break;
2355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        case '\n':
2365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "\\n");
2375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            break;
2385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        default:
2395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "%c", filename[i]);
2405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            break;
2415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        }
2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
245d09775c3fe2d9ef1ffca6437beb3f328ab99f2beDavid 'Digit' Turnerstatic int GCC_FMT_ATTR(2, 3) monitor_fprintf(FILE *stream,
246d09775c3fe2d9ef1ffca6437beb3f328ab99f2beDavid 'Digit' Turner                                              const char *fmt, ...)
2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    va_list ap;
2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    va_start(ap, fmt);
2505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_vprintf((Monitor *)stream, fmt, ap);
2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    va_end(ap);
2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return 0;
2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
255cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turnervoid monitor_protocol_event(MonitorEvent event, QObject *data)
256cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner{
257cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner    /* XXX: TODO */
258cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner}
259cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner
2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int compare_cmd(const char *name, const char *list)
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *p, *pstart;
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int len;
2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    len = strlen(name);
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    p = list;
2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(;;) {
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        pstart = p;
2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        p = strchr(p, '|');
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (!p)
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            p = pstart + strlen(pstart);
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if ((p - pstart) == len && !memcmp(pstart, name, len))
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return 1;
2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (*p == '\0')
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        p++;
2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return 0;
2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void help_cmd_dump(Monitor *mon, const mon_cmd_t *cmds,
2815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                          const char *prefix, const char *name)
2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    const mon_cmd_t *cmd;
2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(cmd = cmds; cmd->name != NULL; cmd++) {
2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (!name || !strcmp(name, cmd->name))
2875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "%s%s %s -- %s\n", prefix, cmd->name,
2885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                           cmd->params, cmd->help);
2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void help_cmd(Monitor *mon, const char *name)
2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (name && !strcmp(name, "info")) {
2955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        help_cmd_dump(mon, info_cmds, "info ", NULL);
2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } else {
2975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        help_cmd_dump(mon, mon_cmds, "", name);
2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (name && !strcmp(name, "log")) {
2995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            const CPULogItem *item;
3005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "Log items (comma separated):\n");
3015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "%-10s %s\n", "none", "remove all logs");
3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for(item = cpu_log_items; item->mask != 0; item++) {
3035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                monitor_printf(mon, "%-10s %s\n", item->name, item->help);
3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info(Monitor *mon, const char *item)
3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    const mon_cmd_t *cmd;
3125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void (*handler)(Monitor *);
3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!item)
3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        goto help;
3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(cmd = info_cmds; cmd->name != NULL; cmd++) {
3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (compare_cmd(item, cmd->name))
3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            goto found;
3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project help:
3215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    help_cmd(mon, "info");
3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return;
3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project found:
3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    handler = cmd->handler;
3255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    handler(mon);
3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info_version(Monitor *mon)
3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "%s\n", QEMU_VERSION QEMU_PKGVERSION);
3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info_name(Monitor *mon)
3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (qemu_name)
3365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "%s\n", qemu_name);
3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(TARGET_I386)
3405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info_hpet(Monitor *mon)
3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "HPET is %s by QEMU\n",
3435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   (no_hpet) ? "disabled" : "enabled");
3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif
3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info_uuid(Monitor *mon)
3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, UUID_FMT "\n", qemu_uuid[0], qemu_uuid[1],
3505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   qemu_uuid[2], qemu_uuid[3], qemu_uuid[4], qemu_uuid[5],
3515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   qemu_uuid[6], qemu_uuid[7], qemu_uuid[8], qemu_uuid[9],
3525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   qemu_uuid[10], qemu_uuid[11], qemu_uuid[12], qemu_uuid[13],
3535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   qemu_uuid[14], qemu_uuid[15]);
3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* get the current CPU defined by the user */
3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int mon_set_cpu(int cpu_index)
3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env;
3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(env = first_cpu; env != NULL; env = env->next_cpu) {
3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (env->cpu_index == cpu_index) {
3635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            cur_mon->mon_cpu = env;
3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return 0;
3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return -1;
3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic CPUState *mon_get_cpu(void)
3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (!cur_mon->mon_cpu) {
3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        mon_set_cpu(0);
3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    cpu_synchronize_state(cur_mon->mon_cpu, 0);
3765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    return cur_mon->mon_cpu;
3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info_registers(Monitor *mon)
3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env;
3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    env = mon_get_cpu();
3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!env)
3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_I386
3865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    cpu_dump_state(env, (FILE *)mon, monitor_fprintf,
3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   X86_DUMP_FPU);
3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
3895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    cpu_dump_state(env, (FILE *)mon, monitor_fprintf,
3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   0);
3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info_cpus(Monitor *mon)
3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env;
3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* just to set the default cpu if not already done */
3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    mon_get_cpu();
4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(env = first_cpu; env != NULL; env = env->next_cpu) {
4025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        cpu_synchronize_state(env, 0);
4035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "%c CPU #%d:",
4045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                       (env == mon->mon_cpu) ? '*' : ' ',
4055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                       env->cpu_index);
4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(TARGET_I386)
4075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, " pc=0x" TARGET_FMT_lx,
4085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                       env->eip + env->segs[R_CS].base);
4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_PPC)
4105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, " nip=0x" TARGET_FMT_lx, env->nip);
4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_SPARC)
4125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, " pc=0x" TARGET_FMT_lx " npc=0x" TARGET_FMT_lx,
4135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                       env->pc, env->npc);
4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_MIPS)
4155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, " PC=0x" TARGET_FMT_lx, env->active_tc.PC);
4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (env->halted)
4185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, " (halted)");
4195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "\n");
4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_cpu_set(Monitor *mon, int index)
4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (mon_set_cpu(index) < 0)
4265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "Invalid CPU index\n");
4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info_jit(Monitor *mon)
4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    dump_exec_info((FILE *)mon, monitor_fprintf);
4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info_history(Monitor *mon)
4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int i;
4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *str;
4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (!mon->rs)
4405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        return;
4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    i = 0;
4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(;;) {
4435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        str = readline_get_history(mon->rs, i);
4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (!str)
4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
4465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "%d: '%s'\n", i, str);
4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        i++;
4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(TARGET_PPC)
4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* XXX: not implemented in other targets */
4535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info_cpu_stats(Monitor *mon)
4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env;
4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    env = mon_get_cpu();
4585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    cpu_dump_statistics(env, (FILE *)mon, &monitor_fprintf, 0);
4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_quit(Monitor *mon)
4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
464e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner    if ((mon->flags & MONITOR_QUIT_DOESNT_EXIT) == 0) {
465e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner        exit(0);
466e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner    }
467e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner    /* we cannot destroy the monitor just yet, so flag it instead */
468e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner    mon->has_quit = 1;
4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void change_vnc_password_cb(Monitor *mon, const char *password,
4725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                   void *opaque)
4735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
4745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (vnc_display_password(NULL, password) < 0)
4755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "could not set VNC server password\n");
4765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
4775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_read_command(mon, 1);
4785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
4795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
4805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_change_vnc(Monitor *mon, const char *target, const char *arg)
4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (strcmp(target, "passwd") == 0 ||
4835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        strcmp(target, "password") == 0) {
4845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        if (arg) {
4855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            char password[9];
4865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            strncpy(password, arg, sizeof(password));
4875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            password[sizeof(password) - 1] = '\0';
4885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            change_vnc_password_cb(mon, password, NULL);
4895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        } else {
4905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_read_password(mon, change_vnc_password_cb, NULL);
4915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        }
4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } else {
4935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        if (vnc_display_open(NULL, target) < 0)
4945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "could not start VNC server on %s\n", target);
4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_change(Monitor *mon, const char *device, const char *target,
4995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                      const char *arg)
5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (strcmp(device, "vnc") == 0) {
5025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        do_change_vnc(mon, target, arg);
5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } else {
5045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        do_change_block(mon, device, target, arg);
5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_screen_dump(Monitor *mon, const char *filename)
5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    vga_hw_screen_dump(filename);
5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_logfile(Monitor *mon, const char *filename)
5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    cpu_set_log_filename(filename);
5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_log(Monitor *mon, const char *items)
5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int mask;
5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!strcmp(items, "none")) {
5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        mask = 0;
5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } else {
5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        mask = cpu_str_to_log_mask(items);
5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (!mask) {
5275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            help_cmd(mon, "log");
5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return;
5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    cpu_set_log(mask);
5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_singlestep(Monitor *mon, const char *option)
5355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
5365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (!option || !strcmp(option, "on")) {
5375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        singlestep = 1;
5385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    } else if (!strcmp(option, "off")) {
5395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        singlestep = 0;
5405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    } else {
5415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "unexpected option %s\n", option);
5425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    }
5435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
5445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
5455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_stop(Monitor *mon)
5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    vm_stop(EXCP_INTERRUPT);
5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void encrypted_bdrv_it(void *opaque, BlockDriverState *bs);
5515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
5525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct bdrv_iterate_context {
5535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    Monitor *mon;
5545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int err;
5555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner};
5565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
5575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_cont(Monitor *mon)
5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    struct bdrv_iterate_context context = { mon, 0 };
5605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
5615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    bdrv_iterate(encrypted_bdrv_it, &context);
5625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    /* only resume the vm if all keys are set and valid */
5635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (!context.err)
5645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        vm_start();
5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void bdrv_key_cb(void *opaque, int err)
5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    Monitor *mon = opaque;
5705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
5715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    /* another key was set successfully, retry to continue */
5725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (!err)
5735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        do_cont(mon);
5745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
5755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
5765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void encrypted_bdrv_it(void *opaque, BlockDriverState *bs)
5775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
5785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    struct bdrv_iterate_context *context = opaque;
5795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
5805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (!context->err && bdrv_key_required(bs)) {
5815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        context->err = -EBUSY;
5825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_read_bdrv_key_start(context->mon, bs, bdrv_key_cb,
5835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                    context->mon);
5845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    }
5855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
5865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
5875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_gdbserver(Monitor *mon, const char *device)
5885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
5895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (!device)
5905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        device = "tcp::" DEFAULT_GDBSTUB_PORT;
5915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (gdbserver_start(device) < 0) {
5925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "Could not open gdbserver on device '%s'\n",
5935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                       device);
5945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    } else if (strcmp(device, "none") == 0) {
5955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "Disabled gdbserver\n");
5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } else {
5975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "Waiting for gdb connection on device '%s'\n",
5985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                       device);
5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_watchdog_action(Monitor *mon, const char *action)
6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
6045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (select_watchdog_action(action) == -1) {
6055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "Unknown watchdog action '%s'\n", action);
6065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    }
6075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
6085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
6095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void monitor_printc(Monitor *mon, int c)
6105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
6115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "'");
6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch(c) {
6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case '\'':
6145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "\\'");
6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case '\\':
6175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "\\\\");
6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case '\n':
6205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "\\n");
6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case '\r':
6235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "\\r");
6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    default:
6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (c >= 32 && c <= 126) {
6275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "%c", c);
6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        } else {
6295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "\\x%02x", c);
6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
6335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "'");
6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void memory_dump(Monitor *mon, int count, int format, int wsize,
6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        target_phys_addr_t addr, int is_physical)
6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env;
6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int nb_per_line, l, line_size, i, max_digits, len;
6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint8_t buf[16];
6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint64_t v;
6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (format == 'i') {
6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        int flags;
6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        flags = 0;
6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        env = mon_get_cpu();
6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (!env && !is_physical)
6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return;
6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_I386
6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (wsize == 2) {
6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            flags = 1;
6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        } else if (wsize == 4) {
6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            flags = 0;
6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        } else {
6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            /* as default we use the current CS size */
6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            flags = 0;
6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (env) {
6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_X86_64
6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if ((env->efer & MSR_EFER_LMA) &&
6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    (env->segs[R_CS].flags & DESC_L_MASK))
6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    flags = 2;
6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                else
6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (!(env->segs[R_CS].flags & DESC_B_MASK))
6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    flags = 1;
6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_disas(mon, env, addr, count, is_physical, flags);
6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    len = wsize * count;
6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (wsize == 1)
6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        line_size = 8;
6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    else
6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        line_size = 16;
6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    nb_per_line = line_size / wsize;
6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    max_digits = 0;
6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch(format) {
6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'o':
6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        max_digits = (wsize * 8 + 2) / 3;
6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    default:
6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'x':
6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        max_digits = (wsize * 8) / 4;
6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'u':
6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'd':
6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        max_digits = (wsize * 8 * 10 + 32) / 33;
6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'c':
6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        wsize = 1;
6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    while (len > 0) {
7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (is_physical)
7015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, TARGET_FMT_plx ":", addr);
7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        else
7035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, TARGET_FMT_lx ":", (target_ulong)addr);
7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        l = len;
7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (l > line_size)
7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            l = line_size;
7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (is_physical) {
7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            cpu_physical_memory_rw(addr, buf, l, 0);
7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        } else {
7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            env = mon_get_cpu();
7118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (!env)
7128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                break;
7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (cpu_memory_rw_debug(env, addr, buf, l, 0) < 0) {
7145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                monitor_printf(mon, " Cannot access memory\n");
7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                break;
7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        i = 0;
7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        while (i < l) {
7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            switch(wsize) {
7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            default:
7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case 1:
7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                v = ldub_raw(buf + i);
7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                break;
7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case 2:
7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                v = lduw_raw(buf + i);
7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                break;
7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case 4:
7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                v = (uint32_t)ldl_raw(buf + i);
7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                break;
7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case 8:
7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                v = ldq_raw(buf + i);
7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                break;
7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
7355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, " ");
7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            switch(format) {
7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case 'o':
7385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                monitor_printf(mon, "%#*" PRIo64, max_digits, v);
7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                break;
7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case 'x':
7415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                monitor_printf(mon, "0x%0*" PRIx64, max_digits, v);
7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                break;
7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case 'u':
7445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                monitor_printf(mon, "%*" PRIu64, max_digits, v);
7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                break;
7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case 'd':
7475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                monitor_printf(mon, "%*" PRId64, max_digits, v);
7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                break;
7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case 'c':
7505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                monitor_printc(mon, v);
7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                break;
7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
7538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            i += wsize;
7548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
7555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "\n");
7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        addr += l;
7578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        len -= l;
7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
7598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if TARGET_LONG_BITS == 64
7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define GET_TLONG(h, l) (((uint64_t)(h) << 32) | (l))
7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define GET_TLONG(h, l) (l)
7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
7668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_memory_dump(Monitor *mon, int count, int format, int size,
7688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           uint32_t addrh, uint32_t addrl)
7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    target_long addr = GET_TLONG(addrh, addrl);
7715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    memory_dump(mon, count, format, size, addr, 0);
7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if TARGET_PHYS_ADDR_BITS > 32
7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define GET_TPHYSADDR(h, l) (((uint64_t)(h) << 32) | (l))
7768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
7778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define GET_TPHYSADDR(h, l) (l)
7788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_physical_memory_dump(Monitor *mon, int count, int format,
7815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                    int size, uint32_t addrh, uint32_t addrl)
7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
7848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    target_phys_addr_t addr = GET_TPHYSADDR(addrh, addrl);
7855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    memory_dump(mon, count, format, size, addr, 1);
7868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
7878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_print(Monitor *mon, int count, int format, int size,
7895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                     unsigned int valh, unsigned int vall)
7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    target_phys_addr_t val = GET_TPHYSADDR(valh, vall);
7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if TARGET_PHYS_ADDR_BITS == 32
7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch(format) {
7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'o':
7955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "%#o", val);
7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'x':
7985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "%#x", val);
7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
8008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'u':
8015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "%u", val);
8028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    default:
8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'd':
8055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "%d", val);
8068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'c':
8085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printc(mon, val);
8098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
8108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch(format) {
8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'o':
8145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "%#" PRIo64, val);
8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'x':
8175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "%#" PRIx64, val);
8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'u':
8205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "%" PRIu64, val);
8218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
8228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    default:
8238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'd':
8245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "%" PRId64, val);
8258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
8268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'c':
8275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printc(mon, val);
8288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
8298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
8308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
8315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "\n");
8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_memory_save(Monitor *mon, unsigned int valh, unsigned int vall,
8358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           uint32_t size, const char *filename)
8368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
8378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    FILE *f;
8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    target_long addr = GET_TLONG(valh, vall);
8398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t l;
8408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env;
8418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint8_t buf[1024];
8428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    env = mon_get_cpu();
8448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!env)
8458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
8468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    f = fopen(filename, "wb");
8488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!f) {
8495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "could not open '%s'\n", filename);
8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    while (size != 0) {
8538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        l = sizeof(buf);
8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (l > size)
8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            l = size;
8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        cpu_memory_rw_debug(env, addr, buf, l, 0);
8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        fwrite(buf, 1, l, f);
8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        addr += l;
8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        size -= l;
8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    fclose(f);
8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
8638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_physical_memory_save(Monitor *mon, unsigned int valh,
8655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                    unsigned int vall, uint32_t size,
8665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                    const char *filename)
8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    FILE *f;
8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t l;
8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint8_t buf[1024];
871cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner    target_phys_addr_t addr = GET_TPHYSADDR(valh, vall);
8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    f = fopen(filename, "wb");
8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!f) {
8755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "could not open '%s'\n", filename);
8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    while (size != 0) {
8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        l = sizeof(buf);
8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (l > size)
8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            l = size;
8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        cpu_physical_memory_rw(addr, buf, l, 0);
8838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        fwrite(buf, 1, l, f);
8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        fflush(f);
8858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        addr += l;
8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        size -= l;
8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    fclose(f);
8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_sum(Monitor *mon, uint32_t start, uint32_t size)
8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t addr;
8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint8_t buf[1];
8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint16_t sum;
8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    sum = 0;
8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(addr = start; addr < (start + size); addr++) {
8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        cpu_physical_memory_rw(addr, buf, 1, 0);
9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* BSD sum algorithm ('sum' Unix command) */
9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        sum = (sum >> 1) | (sum << 15);
9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        sum += buf[0];
9038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
9045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "%05d\n", sum);
9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct {
9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int keycode;
9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *name;
9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} KeyDef;
9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const KeyDef key_defs[] = {
9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x2a, "shift" },
9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x36, "shift_r" },
9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x38, "alt" },
9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xb8, "alt_r" },
9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x64, "altgr" },
9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xe4, "altgr_r" },
9208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x1d, "ctrl" },
9218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x9d, "ctrl_r" },
9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xdd, "menu" },
9248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x01, "esc" },
9268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x02, "1" },
9288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x03, "2" },
9298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x04, "3" },
9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x05, "4" },
9318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x06, "5" },
9328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x07, "6" },
9338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x08, "7" },
9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x09, "8" },
9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x0a, "9" },
9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x0b, "0" },
9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x0c, "minus" },
9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x0d, "equal" },
9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x0e, "backspace" },
9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x0f, "tab" },
9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x10, "q" },
9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x11, "w" },
9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x12, "e" },
9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x13, "r" },
9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x14, "t" },
9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x15, "y" },
9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x16, "u" },
9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x17, "i" },
9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x18, "o" },
9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x19, "p" },
9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x1c, "ret" },
9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x1e, "a" },
9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x1f, "s" },
9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x20, "d" },
9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x21, "f" },
9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x22, "g" },
9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x23, "h" },
9618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x24, "j" },
9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x25, "k" },
9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x26, "l" },
9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x2c, "z" },
9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x2d, "x" },
9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x2e, "c" },
9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x2f, "v" },
9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x30, "b" },
9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x31, "n" },
9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x32, "m" },
9725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { 0x33, "comma" },
9735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { 0x34, "dot" },
9745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { 0x35, "slash" },
9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x37, "asterisk" },
9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x39, "spc" },
9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x3a, "caps_lock" },
9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x3b, "f1" },
9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x3c, "f2" },
9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x3d, "f3" },
9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x3e, "f4" },
9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x3f, "f5" },
9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x40, "f6" },
9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x41, "f7" },
9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x42, "f8" },
9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x43, "f9" },
9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x44, "f10" },
9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x45, "num_lock" },
9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x46, "scroll_lock" },
9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xb5, "kp_divide" },
9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x37, "kp_multiply" },
9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x4a, "kp_subtract" },
9968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x4e, "kp_add" },
9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x9c, "kp_enter" },
9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x53, "kp_decimal" },
9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x54, "sysrq" },
10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x52, "kp_0" },
10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x4f, "kp_1" },
10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x50, "kp_2" },
10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x51, "kp_3" },
10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x4b, "kp_4" },
10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x4c, "kp_5" },
10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x4d, "kp_6" },
10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x47, "kp_7" },
10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x48, "kp_8" },
10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x49, "kp_9" },
10118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x56, "<" },
10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x57, "f11" },
10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0x58, "f12" },
10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xb7, "print" },
10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xc7, "home" },
10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xc9, "pgup" },
10218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xd1, "pgdn" },
10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xcf, "end" },
10238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xcb, "left" },
10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xc8, "up" },
10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xd0, "down" },
10278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xcd, "right" },
10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xd2, "insert" },
10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xd3, "delete" },
10318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(TARGET_SPARC) && !defined(TARGET_SPARC64)
10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xf0, "stop" },
10338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xf1, "again" },
10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xf2, "props" },
10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xf3, "undo" },
10368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xf4, "front" },
10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xf5, "copy" },
10388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xf6, "open" },
10398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xf7, "paste" },
10408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xf8, "find" },
10418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xf9, "cut" },
10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xfa, "lf" },
10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xfb, "help" },
10448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xfc, "meta_l" },
10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xfd, "meta_r" },
10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0xfe, "compose" },
10478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0, NULL },
10498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
10508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int get_keycode(const char *key)
10528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
10538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const KeyDef *p;
10548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char *endp;
10558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int ret;
10568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(p = key_defs; p->name != NULL; p++) {
10588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (!strcmp(key, p->name))
10598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return p->keycode;
10608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
10618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (strstart(key, "0x", NULL)) {
10628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ret = strtoul(key, &endp, 0);
10638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (*endp == '\0' && ret >= 0x01 && ret <= 0xff)
10648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return ret;
10658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
10668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return -1;
10678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
10688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MAX_KEYCODES 16
10708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic uint8_t keycodes[MAX_KEYCODES];
10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int nb_pending_keycodes;
10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic QEMUTimer *key_timer;
10738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void release_keys(void *opaque)
10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int keycode;
10778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    while (nb_pending_keycodes > 0) {
10798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        nb_pending_keycodes--;
10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        keycode = keycodes[nb_pending_keycodes];
10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (keycode & 0x80)
10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            kbd_put_keycode(0xe0);
10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        kbd_put_keycode(keycode | 0x80);
10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
10868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_sendkey(Monitor *mon, const char *string, int has_hold_time,
10885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                       int hold_time)
10898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
10908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char keyname_buf[16];
10918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char *separator;
10928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int keyname_len, keycode, i;
10938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (nb_pending_keycodes > 0) {
10958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        qemu_del_timer(key_timer);
10968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        release_keys(NULL);
10978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
10988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!has_hold_time)
10998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        hold_time = 100;
11008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    i = 0;
11018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    while (1) {
11028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        separator = strchr(string, '-');
11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        keyname_len = separator ? separator - string : strlen(string);
11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (keyname_len > 0) {
11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            pstrcpy(keyname_buf, sizeof(keyname_buf), string);
11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (keyname_len > sizeof(keyname_buf) - 1) {
11075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                monitor_printf(mon, "invalid key: '%s...'\n", keyname_buf);
11088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                return;
11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (i == MAX_KEYCODES) {
11115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                monitor_printf(mon, "too many keys\n");
11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                return;
11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
11148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            keyname_buf[keyname_len] = 0;
11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            keycode = get_keycode(keyname_buf);
11168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (keycode < 0) {
11175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                monitor_printf(mon, "unknown key: '%s'\n", keyname_buf);
11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                return;
11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            keycodes[i++] = keycode;
11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (!separator)
11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        string = separator + 1;
11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    nb_pending_keycodes = i;
11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* key down events */
11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for (i = 0; i < nb_pending_keycodes; i++) {
11298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        keycode = keycodes[i];
11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (keycode & 0x80)
11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            kbd_put_keycode(0xe0);
11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        kbd_put_keycode(keycode & 0x7f);
11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* delayed key up events */
11355973c775c853e26f684de58ad28c267281aaffd6David 'Digit' Turner    qemu_mod_timer(key_timer, qemu_get_clock_ms(vm_clock) + hold_time);
11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int mouse_button_state;
11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_mouse_move(Monitor *mon, const char *dx_str, const char *dy_str,
11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                          const char *dz_str)
11428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int dx, dy, dz;
11448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    dx = strtol(dx_str, NULL, 0);
11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    dy = strtol(dy_str, NULL, 0);
11468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    dz = 0;
11478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (dz_str)
11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        dz = strtol(dz_str, NULL, 0);
11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    kbd_mouse_event(dx, dy, dz, mouse_button_state);
11508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_mouse_button(Monitor *mon, int button_state)
11538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    mouse_button_state = button_state;
11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    kbd_mouse_event(0, 0, 0, mouse_button_state);
11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_ioport_read(Monitor *mon, int count, int format, int size,
11595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                           int addr, int has_index, int index)
11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t val;
11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int suffix;
11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (has_index) {
11653266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turner        cpu_outb(addr & 0xffff, index & 0xff);
11668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        addr++;
11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    addr &= 0xffff;
11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch(size) {
11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    default:
11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 1:
11733266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turner        val = cpu_inb(addr);
11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        suffix = 'b';
11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 2:
11773266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turner        val = cpu_inw(addr);
11788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        suffix = 'w';
11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
11808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 4:
11813266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turner        val = cpu_inl(addr);
11828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        suffix = 'l';
11838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
11848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
11855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "port%c[0x%04x] = %#0*x\n",
11865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   suffix, addr, size * 2, val);
11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
11888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* boot_set handler */
11905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic QEMUBootSetHandler *qemu_boot_set_handler = NULL;
11915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void *boot_opaque;
11925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
11935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque)
11945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
11955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    qemu_boot_set_handler = func;
11965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    boot_opaque = opaque;
11975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
11985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
11995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_boot_set(Monitor *mon, const char *bootdevice)
12005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
12015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int res;
12025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
12035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (qemu_boot_set_handler)  {
12045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        res = qemu_boot_set_handler(boot_opaque, bootdevice);
12055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        if (res == 0)
12065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "boot device list now set to %s\n",
12075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                           bootdevice);
12085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        else
12095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "setting boot device list failed with "
12105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                           "error %i\n", res);
12115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    } else {
12125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "no function defined to set boot device list for "
12135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                       "this architecture\n");
12145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    }
12155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
12165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
12175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_system_reset(Monitor *mon)
12188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
12198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qemu_system_reset_request();
12208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
12218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_system_powerdown(Monitor *mon)
12238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
12248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qemu_system_powerdown_request();
12258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
12268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(TARGET_I386)
12285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void print_pte(Monitor *mon, uint32_t addr, uint32_t pte, uint32_t mask)
12298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
12305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "%08x: %08x %c%c%c%c%c%c%c%c\n",
12315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   addr,
12325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   pte & mask,
12335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   pte & PG_GLOBAL_MASK ? 'G' : '-',
12345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   pte & PG_PSE_MASK ? 'P' : '-',
12355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   pte & PG_DIRTY_MASK ? 'D' : '-',
12365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   pte & PG_ACCESSED_MASK ? 'A' : '-',
12375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   pte & PG_PCD_MASK ? 'C' : '-',
12385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   pte & PG_PWT_MASK ? 'T' : '-',
12395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   pte & PG_USER_MASK ? 'U' : '-',
12405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   pte & PG_RW_MASK ? 'W' : '-');
12418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
12428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void tlb_info(Monitor *mon)
12448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
12458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env;
12468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int l1, l2;
12478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t pgd, pde, pte;
12488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    env = mon_get_cpu();
12508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!env)
12518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
12528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!(env->cr[0] & CR0_PG_MASK)) {
12545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "PG disabled\n");
12558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
12568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
12578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    pgd = env->cr[3] & ~0xfff;
12588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(l1 = 0; l1 < 1024; l1++) {
12598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4);
12608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        pde = le32_to_cpu(pde);
12618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (pde & PG_PRESENT_MASK) {
12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
12635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                print_pte(mon, (l1 << 22), pde, ~((1 << 20) - 1));
12648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            } else {
12658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                for(l2 = 0; l2 < 1024; l2++) {
12668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    cpu_physical_memory_read((pde & ~0xfff) + l2 * 4,
12678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                             (uint8_t *)&pte, 4);
12688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    pte = le32_to_cpu(pte);
12698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if (pte & PG_PRESENT_MASK) {
12705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                        print_pte(mon, (l1 << 22) + (l2 << 12),
12718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                  pte & ~PG_PSE_MASK,
12728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                  ~0xfff);
12738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
12748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
12758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
12768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
12778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
12788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
12798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void mem_print(Monitor *mon, uint32_t *pstart, int *plast_prot,
12818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                      uint32_t end, int prot)
12828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
12838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int prot1;
12848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    prot1 = *plast_prot;
12858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (prot != prot1) {
12868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (*pstart != -1) {
12875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "%08x-%08x %08x %c%c%c\n",
12885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                           *pstart, end, end - *pstart,
12895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                           prot1 & PG_USER_MASK ? 'u' : '-',
12905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                           'r',
12915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                           prot1 & PG_RW_MASK ? 'w' : '-');
12928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
12938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (prot != 0)
12948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            *pstart = end;
12958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        else
12968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            *pstart = -1;
12978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        *plast_prot = prot;
12988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
12998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
13008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void mem_info(Monitor *mon)
13028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
13038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env;
13048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int l1, l2, prot, last_prot;
13058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t pgd, pde, pte, start, end;
13068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    env = mon_get_cpu();
13088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!env)
13098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
13108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!(env->cr[0] & CR0_PG_MASK)) {
13125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "PG disabled\n");
13138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
13148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
13158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    pgd = env->cr[3] & ~0xfff;
13168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    last_prot = 0;
13178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    start = -1;
13188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(l1 = 0; l1 < 1024; l1++) {
13198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4);
13208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        pde = le32_to_cpu(pde);
13218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        end = l1 << 22;
13228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (pde & PG_PRESENT_MASK) {
13238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
13248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                prot = pde & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
13255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                mem_print(mon, &start, &last_prot, end, prot);
13268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            } else {
13278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                for(l2 = 0; l2 < 1024; l2++) {
13288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    cpu_physical_memory_read((pde & ~0xfff) + l2 * 4,
13298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                             (uint8_t *)&pte, 4);
13308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    pte = le32_to_cpu(pte);
13318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    end = (l1 << 22) + (l2 << 12);
13328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if (pte & PG_PRESENT_MASK) {
13338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        prot = pte & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
13348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    } else {
13358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        prot = 0;
13368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
13375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                    mem_print(mon, &start, &last_prot, end, prot);
13388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
13398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
13408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        } else {
13418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            prot = 0;
13425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            mem_print(mon, &start, &last_prot, end, prot);
13438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
13448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
13458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
13468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(TARGET_SH4)
13495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
13505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void print_tlb(Monitor *mon, int idx, tlb_t *tlb)
13515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
13525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, " tlb%i:\t"
13535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   "asid=%hhu vpn=%x\tppn=%x\tsz=%hhu size=%u\t"
13545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   "v=%hhu shared=%hhu cached=%hhu prot=%hhu "
13555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   "dirty=%hhu writethrough=%hhu\n",
13565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   idx,
13575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   tlb->asid, tlb->vpn, tlb->ppn, tlb->sz, tlb->size,
13585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   tlb->v, tlb->sh, tlb->c, tlb->pr,
13595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   tlb->d, tlb->wt);
13605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
13615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
13625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void tlb_info(Monitor *mon)
13638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
13645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    CPUState *env = mon_get_cpu();
13655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int i;
13665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
13675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf (mon, "ITLB:\n");
13685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    for (i = 0 ; i < ITLB_SIZE ; i++)
13695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        print_tlb (mon, i, &env->itlb[i]);
13705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf (mon, "UTLB:\n");
13715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    for (i = 0 ; i < UTLB_SIZE ; i++)
13725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        print_tlb (mon, i, &env->utlb[i]);
13735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
13745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
13755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif
13765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
13775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info_kqemu(Monitor *mon)
13785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
13795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef CONFIG_KQEMU
13808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env;
13818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int val;
13828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    val = 0;
13838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    env = mon_get_cpu();
13848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!env) {
13855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "No cpu initialized yet");
13868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
13878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
13888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    val = env->kqemu_enabled;
13895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "kqemu support: ");
13908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch(val) {
13918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    default:
13928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 0:
13935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "disabled\n");
13948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
13958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 1:
13965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "enabled for user code\n");
13978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
13988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 2:
13995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "enabled for user and kernel code\n");
14008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
14018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
14028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
14035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "kqemu support: not compiled\n");
14048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
14068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info_kvm(Monitor *mon)
14085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
14095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef CONFIG_KVM
14105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "kvm support: ");
14115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (kvm_enabled())
14125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "enabled\n");
14135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    else
14145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "disabled\n");
14155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#else
14165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "kvm support: not compiled\n");
14175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif
14185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
14195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
14205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info_numa(Monitor *mon)
14215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
14225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int i;
14235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    CPUState *env;
14245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
14255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "%d nodes\n", nb_numa_nodes);
14265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    for (i = 0; i < nb_numa_nodes; i++) {
14275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "node %d cpus:", i);
14285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        for (env = first_cpu; env != NULL; env = env->next_cpu) {
14295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            if (env->numa_node == i) {
14305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                monitor_printf(mon, " %d", env->cpu_index);
14315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            }
14325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        }
14335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "\n");
14345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i,
14355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            node_mem[i] >> 20);
14365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    }
14375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
14385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
14398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER
14408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint64_t kqemu_time;
14428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint64_t qemu_time;
14438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint64_t kqemu_exec_count;
14448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint64_t dev_time;
14458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint64_t kqemu_ret_int_count;
14468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint64_t kqemu_ret_excp_count;
14478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint64_t kqemu_ret_intr_count;
14488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info_profile(Monitor *mon)
14508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
14518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t total;
14528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    total = qemu_time;
14538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (total == 0)
14548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        total = 1;
14555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "async time  %" PRId64 " (%0.3f)\n",
14565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   dev_time, dev_time / (double)ticks_per_sec);
14575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "qemu time   %" PRId64 " (%0.3f)\n",
14585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   qemu_time, qemu_time / (double)ticks_per_sec);
14595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "kqemu time  %" PRId64 " (%0.3f %0.1f%%) count=%"
14605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                        PRId64 " int=%" PRId64 " excp=%" PRId64 " intr=%"
14615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                        PRId64 "\n",
14625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   kqemu_time, kqemu_time / (double)ticks_per_sec,
14635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   kqemu_time / (double)total * 100.0,
14645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   kqemu_exec_count,
14655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   kqemu_ret_int_count,
14665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   kqemu_ret_excp_count,
14675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   kqemu_ret_intr_count);
14688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qemu_time = 0;
14698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    kqemu_time = 0;
14708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    kqemu_exec_count = 0;
14718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    dev_time = 0;
14728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    kqemu_ret_int_count = 0;
14738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    kqemu_ret_excp_count = 0;
14748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    kqemu_ret_intr_count = 0;
14755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef CONFIG_KQEMU
14768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    kqemu_record_dump();
14778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
14798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
14805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info_profile(Monitor *mon)
14818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
14825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "Internal profiler not compiled\n");
14838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
14848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Capture support */
1487a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turnerstatic QLIST_HEAD (capture_list_head, CaptureState) capture_head;
14888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info_capture(Monitor *mon)
14908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
14918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int i;
14928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CaptureState *s;
14938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
14955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "[%d]: ", i);
14968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        s->ops.info (s->opaque);
14978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
14988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
14998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef HAS_AUDIO
15015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_stop_capture(Monitor *mon, int n)
15028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
15038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int i;
15048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CaptureState *s;
15058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
15078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (i == n) {
15088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            s->ops.destroy (s->opaque);
1509a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner            QLIST_REMOVE (s, entries);
15108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            qemu_free (s);
15118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return;
15128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
15138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
15148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
15158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_wav_capture(Monitor *mon, const char *path,
15175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                           int has_freq, int freq,
15185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                           int has_bits, int bits,
15195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                           int has_channels, int nchannels)
15208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
15218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CaptureState *s;
15228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s = qemu_mallocz (sizeof (*s));
15248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    freq = has_freq ? freq : 44100;
15268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    bits = has_bits ? bits : 16;
15278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    nchannels = has_channels ? nchannels : 2;
15288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (wav_start_capture (s, path, freq, bits, nchannels)) {
15305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "Faied to add wave capture\n");
15318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        qemu_free (s);
15328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1533a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner    QLIST_INSERT_HEAD (&capture_head, s, entries);
15348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
15358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
15368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(TARGET_I386)
15385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_inject_nmi(Monitor *mon, int cpu_index)
15395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
15405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    CPUState *env;
15415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
15425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    for (env = first_cpu; env != NULL; env = env->next_cpu)
15435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        if (env->cpu_index == cpu_index) {
15445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            cpu_interrupt(env, CPU_INTERRUPT_NMI);
15455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            break;
15465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        }
15475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
15488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
15495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
15505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info_status(Monitor *mon)
15515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
15525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (vm_running) {
15535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        if (singlestep) {
15545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "VM status: running (single step mode)\n");
15555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        } else {
15565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "VM status: running\n");
15575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        }
15585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    } else
15595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner       monitor_printf(mon, "VM status: paused\n");
15605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
15615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
15625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
15635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_balloon(Monitor *mon, int value)
15645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
15655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    ram_addr_t target = value;
15665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    qemu_balloon(target << 20);
15675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
15685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
15695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_info_balloon(Monitor *mon)
15705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
15715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    ram_addr_t actual;
15725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
15735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    actual = qemu_balloon_status();
15745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (kvm_enabled() && !kvm_has_sync_mmu())
15755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "Using KVM without synchronous MMU, "
15765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                       "ballooning disabled\n");
15775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    else if (actual == 0)
15785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "Ballooning not activated in VM\n");
15795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    else
15805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "balloon: actual=%d\n", (int)(actual >> 20));
15815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
15825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
15835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void do_acl(Monitor *mon,
15845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   const char *command,
15855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   const char *aclname,
15865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   const char *match,
15875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   int has_index,
15885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   int index)
15895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
15905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    qemu_acl *acl;
15915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
15925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    acl = qemu_acl_find(aclname);
15935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (!acl) {
15945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "acl: unknown list '%s'\n", aclname);
15955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        return;
15965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    }
15975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
15985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (strcmp(command, "show") == 0) {
15995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        int i = 0;
16005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        qemu_acl_entry *entry;
16015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "policy: %s\n",
16025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                       acl->defaultDeny ? "deny" : "allow");
1603a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner        QTAILQ_FOREACH(entry, &acl->entries, next) {
16045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            i++;
16055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "%d: %s %s\n", i,
16065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                           entry->deny ? "deny" : "allow",
16075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                           entry->match);
16085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        }
16095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    } else if (strcmp(command, "reset") == 0) {
16105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        qemu_acl_reset(acl);
16115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "acl: removed all rules\n");
16125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    } else if (strcmp(command, "policy") == 0) {
16135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        if (!match) {
16145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "acl: missing policy parameter\n");
16155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            return;
16165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        }
16175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
16185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        if (strcmp(match, "allow") == 0) {
16195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            acl->defaultDeny = 0;
16205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "acl: policy set to 'allow'\n");
16215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        } else if (strcmp(match, "deny") == 0) {
16225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            acl->defaultDeny = 1;
16235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "acl: policy set to 'deny'\n");
16245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        } else {
16255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "acl: unknown policy '%s', expected 'deny' or 'allow'\n", match);
16265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        }
16275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    } else if ((strcmp(command, "allow") == 0) ||
16285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner               (strcmp(command, "deny") == 0)) {
16295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        int deny = strcmp(command, "deny") == 0 ? 1 : 0;
16305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        int ret;
16315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
16325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        if (!match) {
16335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "acl: missing match parameter\n");
16345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            return;
16355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        }
16365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
16375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        if (has_index)
16385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            ret = qemu_acl_insert(acl, deny, match, index);
16395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        else
16405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            ret = qemu_acl_append(acl, deny, match);
16415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        if (ret < 0)
16425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "acl: unable to add acl entry\n");
16435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        else
16445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "acl: added rule at position %d\n", ret);
16455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    } else if (strcmp(command, "remove") == 0) {
16465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        int ret;
16475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
16485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        if (!match) {
16495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "acl: missing match parameter\n");
16505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            return;
16515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        }
16525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
16535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        ret = qemu_acl_remove(acl, match);
16545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        if (ret < 0)
16555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "acl: no matching acl entry\n");
16565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        else
16575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "acl: removed rule at position %d\n", ret);
16585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    } else {
16595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "acl: unknown command '%s'\n", command);
16605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    }
16615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
16625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
16635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic const mon_cmd_t mon_cmds[] = {
16645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "qemu-monitor.h"
1665e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner    MON_CMD_T_INITIALIZER
16668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
16678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
16685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Please update qemu-monitor.hx when adding or changing commands */
16695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic const mon_cmd_t info_cmds[] = {
16708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "version", "", do_info_version,
16715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show the version of QEMU" },
16728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "network", "", do_info_network,
16738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      "", "show the network state" },
16745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "chardev", "", qemu_chr_info,
16755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show the character devices" },
16765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "block", "", bdrv_info,
16778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      "", "show the block devices" },
16785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "blockstats", "", bdrv_info_stats,
16795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show block device statistics" },
16808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "registers", "", do_info_registers,
16818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      "", "show the cpu registers" },
16828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "cpus", "", do_info_cpus,
16838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      "", "show infos for each CPU" },
16848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "history", "", do_info_history,
16858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      "", "show the command line history", },
16868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "irq", "", irq_info,
16878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      "", "show the interrupts statistics (if available)", },
16888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "pic", "", pic_info,
16898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      "", "show i8259 (PIC) state", },
16908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "pci", "", pci_info,
16918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      "", "show PCI info", },
16925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(TARGET_I386) || defined(TARGET_SH4)
16938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "tlb", "", tlb_info,
16948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      "", "show virtual to physical memory mappings", },
16955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif
16965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(TARGET_I386)
16978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "mem", "", mem_info,
16988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      "", "show the active virtual memory mappings", },
16995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "hpet", "", do_info_hpet,
17005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show state of HPET", },
17018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
17028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "jit", "", do_info_jit,
17038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      "", "show dynamic compiler info", },
17048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "kqemu", "", do_info_kqemu,
17055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show KQEMU information", },
17065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "kvm", "", do_info_kvm,
17075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show KVM information", },
17085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "numa", "", do_info_numa,
17095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show NUMA information", },
17108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "usb", "", usb_info,
17118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      "", "show guest USB devices", },
17128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "usbhost", "", usb_host_info,
17138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      "", "show host USB devices", },
17148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "profile", "", do_info_profile,
17158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      "", "show profiling information", },
17168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "capture", "", do_info_capture,
17175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show capture information" },
17185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "snapshots", "", do_info_snapshots,
17195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show the currently saved VM snapshots" },
17205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "status", "", do_info_status,
17215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show the current VM status (running|paused)" },
17225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "pcmcia", "", pcmcia_info,
17235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show guest PCMCIA status" },
17245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "mice", "", do_info_mice,
17255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show which guest mouse is receiving events" },
17265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "vnc", "", do_info_vnc,
17275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show the vnc server status"},
17285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "name", "", do_info_name,
17295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show the current VM name" },
17305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "uuid", "", do_info_uuid,
17315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show the current VM UUID" },
17325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(TARGET_PPC)
17335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "cpustats", "", do_info_cpu_stats,
17345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show CPU statistics", },
17355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif
17365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(CONFIG_SLIRP)
17375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "slirp", "", do_info_slirp,
17385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show SLIRP statistics", },
17395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif
17405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "migrate", "", do_info_migrate, "", "show migration status" },
17415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "balloon", "", do_info_balloon,
17425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show balloon information" },
17435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    { "qtree", "", do_info_qtree,
17445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      "", "show device tree" },
1745e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner    MON_CMD_T_INITIALIZER
17468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
17478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*******************************************************************/
17498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const char *pch;
17518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic jmp_buf expr_env;
17528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MD_TLONG 0
17548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MD_I32   1
17558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct MonitorDef {
17578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *name;
17588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int offset;
17595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    target_long (*get_value)(const struct MonitorDef *md, int val);
17608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int type;
17618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} MonitorDef;
17628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1763e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner#define MONITOR_DEF_INITIALIZER  { NULL, 0, NULL, 0 }
1764e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner
17658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(TARGET_I386)
17665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic target_long monitor_get_pc (const struct MonitorDef *md, int val)
17678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
17688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env = mon_get_cpu();
17698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!env)
17708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return 0;
17718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return env->eip + env->segs[R_CS].base;
17728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
17738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
17748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(TARGET_PPC)
17765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic target_long monitor_get_ccr (const struct MonitorDef *md, int val)
17778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
17788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env = mon_get_cpu();
17798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    unsigned int u;
17808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int i;
17818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!env)
17838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return 0;
17848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    u = 0;
17868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for (i = 0; i < 8; i++)
17875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        u |= env->crf[i] << (32 - (4 * i));
17888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return u;
17908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
17918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic target_long monitor_get_msr (const struct MonitorDef *md, int val)
17938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
17948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env = mon_get_cpu();
17958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!env)
17968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return 0;
17978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return env->msr;
17988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
17998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
18005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic target_long monitor_get_xer (const struct MonitorDef *md, int val)
18018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
18028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env = mon_get_cpu();
18038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!env)
18048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return 0;
18055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    return env->xer;
18068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
18078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
18085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic target_long monitor_get_decr (const struct MonitorDef *md, int val)
18098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
18108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env = mon_get_cpu();
18118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!env)
18128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return 0;
18138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return cpu_ppc_load_decr(env);
18148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
18158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
18165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic target_long monitor_get_tbu (const struct MonitorDef *md, int val)
18178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
18188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env = mon_get_cpu();
18198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!env)
18208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return 0;
18218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return cpu_ppc_load_tbu(env);
18228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
18238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
18245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic target_long monitor_get_tbl (const struct MonitorDef *md, int val)
18258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
18268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env = mon_get_cpu();
18278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!env)
18288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return 0;
18298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return cpu_ppc_load_tbl(env);
18308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
18318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
18328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
18338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(TARGET_SPARC)
18348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef TARGET_SPARC64
18355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic target_long monitor_get_psr (const struct MonitorDef *md, int val)
18368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
18378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env = mon_get_cpu();
18388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!env)
18398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return 0;
18408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return GET_PSR(env);
18418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
18428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
18438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
18445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic target_long monitor_get_reg(const struct MonitorDef *md, int val)
18458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
18468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPUState *env = mon_get_cpu();
18478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!env)
18488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return 0;
18498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return env->regwptr[val];
18508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
18518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
18528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
18535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic const MonitorDef monitor_defs[] = {
18548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_I386
18558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
18568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define SEG(name, seg) \
18578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { name, offsetof(CPUState, segs[seg].selector), NULL, MD_I32 },\
18588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { name ".base", offsetof(CPUState, segs[seg].base) },\
18598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { name ".limit", offsetof(CPUState, segs[seg].limit), NULL, MD_I32 },
18608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
18618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "eax", offsetof(CPUState, regs[0]) },
18628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "ecx", offsetof(CPUState, regs[1]) },
18638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "edx", offsetof(CPUState, regs[2]) },
18648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "ebx", offsetof(CPUState, regs[3]) },
18658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "esp|sp", offsetof(CPUState, regs[4]) },
18668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "ebp|fp", offsetof(CPUState, regs[5]) },
18678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "esi", offsetof(CPUState, regs[6]) },
18688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "edi", offsetof(CPUState, regs[7]) },
18698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_X86_64
18708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r8", offsetof(CPUState, regs[8]) },
18718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r9", offsetof(CPUState, regs[9]) },
18728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r10", offsetof(CPUState, regs[10]) },
18738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r11", offsetof(CPUState, regs[11]) },
18748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r12", offsetof(CPUState, regs[12]) },
18758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r13", offsetof(CPUState, regs[13]) },
18768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r14", offsetof(CPUState, regs[14]) },
18778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r15", offsetof(CPUState, regs[15]) },
18788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
18798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "eflags", offsetof(CPUState, eflags) },
18808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "eip", offsetof(CPUState, eip) },
18818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SEG("cs", R_CS)
18828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SEG("ds", R_DS)
18838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SEG("es", R_ES)
18848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SEG("ss", R_SS)
18858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SEG("fs", R_FS)
18868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SEG("gs", R_GS)
18878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "pc", 0, monitor_get_pc, },
18888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_PPC)
18898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* General purpose registers */
18908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r0", offsetof(CPUState, gpr[0]) },
18918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r1", offsetof(CPUState, gpr[1]) },
18928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r2", offsetof(CPUState, gpr[2]) },
18938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r3", offsetof(CPUState, gpr[3]) },
18948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r4", offsetof(CPUState, gpr[4]) },
18958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r5", offsetof(CPUState, gpr[5]) },
18968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r6", offsetof(CPUState, gpr[6]) },
18978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r7", offsetof(CPUState, gpr[7]) },
18988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r8", offsetof(CPUState, gpr[8]) },
18998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r9", offsetof(CPUState, gpr[9]) },
19008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r10", offsetof(CPUState, gpr[10]) },
19018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r11", offsetof(CPUState, gpr[11]) },
19028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r12", offsetof(CPUState, gpr[12]) },
19038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r13", offsetof(CPUState, gpr[13]) },
19048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r14", offsetof(CPUState, gpr[14]) },
19058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r15", offsetof(CPUState, gpr[15]) },
19068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r16", offsetof(CPUState, gpr[16]) },
19078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r17", offsetof(CPUState, gpr[17]) },
19088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r18", offsetof(CPUState, gpr[18]) },
19098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r19", offsetof(CPUState, gpr[19]) },
19108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r20", offsetof(CPUState, gpr[20]) },
19118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r21", offsetof(CPUState, gpr[21]) },
19128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r22", offsetof(CPUState, gpr[22]) },
19138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r23", offsetof(CPUState, gpr[23]) },
19148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r24", offsetof(CPUState, gpr[24]) },
19158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r25", offsetof(CPUState, gpr[25]) },
19168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r26", offsetof(CPUState, gpr[26]) },
19178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r27", offsetof(CPUState, gpr[27]) },
19188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r28", offsetof(CPUState, gpr[28]) },
19198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r29", offsetof(CPUState, gpr[29]) },
19208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r30", offsetof(CPUState, gpr[30]) },
19218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r31", offsetof(CPUState, gpr[31]) },
19228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* Floating point registers */
19238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f0", offsetof(CPUState, fpr[0]) },
19248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f1", offsetof(CPUState, fpr[1]) },
19258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f2", offsetof(CPUState, fpr[2]) },
19268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f3", offsetof(CPUState, fpr[3]) },
19278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f4", offsetof(CPUState, fpr[4]) },
19288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f5", offsetof(CPUState, fpr[5]) },
19298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f6", offsetof(CPUState, fpr[6]) },
19308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f7", offsetof(CPUState, fpr[7]) },
19318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f8", offsetof(CPUState, fpr[8]) },
19328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f9", offsetof(CPUState, fpr[9]) },
19338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f10", offsetof(CPUState, fpr[10]) },
19348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f11", offsetof(CPUState, fpr[11]) },
19358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f12", offsetof(CPUState, fpr[12]) },
19368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f13", offsetof(CPUState, fpr[13]) },
19378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f14", offsetof(CPUState, fpr[14]) },
19388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f15", offsetof(CPUState, fpr[15]) },
19398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f16", offsetof(CPUState, fpr[16]) },
19408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f17", offsetof(CPUState, fpr[17]) },
19418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f18", offsetof(CPUState, fpr[18]) },
19428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f19", offsetof(CPUState, fpr[19]) },
19438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f20", offsetof(CPUState, fpr[20]) },
19448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f21", offsetof(CPUState, fpr[21]) },
19458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f22", offsetof(CPUState, fpr[22]) },
19468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f23", offsetof(CPUState, fpr[23]) },
19478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f24", offsetof(CPUState, fpr[24]) },
19488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f25", offsetof(CPUState, fpr[25]) },
19498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f26", offsetof(CPUState, fpr[26]) },
19508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f27", offsetof(CPUState, fpr[27]) },
19518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f28", offsetof(CPUState, fpr[28]) },
19528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f29", offsetof(CPUState, fpr[29]) },
19538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f30", offsetof(CPUState, fpr[30]) },
19548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f31", offsetof(CPUState, fpr[31]) },
19558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "fpscr", offsetof(CPUState, fpscr) },
19568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* Next instruction pointer */
19578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "nip|pc", offsetof(CPUState, nip) },
19588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "lr", offsetof(CPUState, lr) },
19598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "ctr", offsetof(CPUState, ctr) },
19608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "decr", 0, &monitor_get_decr, },
19618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "ccr", 0, &monitor_get_ccr, },
19628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* Machine state register */
19638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "msr", 0, &monitor_get_msr, },
19648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "xer", 0, &monitor_get_xer, },
19658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "tbu", 0, &monitor_get_tbu, },
19668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "tbl", 0, &monitor_get_tbl, },
19678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(TARGET_PPC64)
19688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* Address space register */
19698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "asr", offsetof(CPUState, asr) },
19708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
19718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* Segment registers */
19728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "sdr1", offsetof(CPUState, sdr1) },
19738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "sr0", offsetof(CPUState, sr[0]) },
19748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "sr1", offsetof(CPUState, sr[1]) },
19758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "sr2", offsetof(CPUState, sr[2]) },
19768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "sr3", offsetof(CPUState, sr[3]) },
19778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "sr4", offsetof(CPUState, sr[4]) },
19788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "sr5", offsetof(CPUState, sr[5]) },
19798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "sr6", offsetof(CPUState, sr[6]) },
19808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "sr7", offsetof(CPUState, sr[7]) },
19818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "sr8", offsetof(CPUState, sr[8]) },
19828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "sr9", offsetof(CPUState, sr[9]) },
19838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "sr10", offsetof(CPUState, sr[10]) },
19848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "sr11", offsetof(CPUState, sr[11]) },
19858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "sr12", offsetof(CPUState, sr[12]) },
19868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "sr13", offsetof(CPUState, sr[13]) },
19878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "sr14", offsetof(CPUState, sr[14]) },
19888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "sr15", offsetof(CPUState, sr[15]) },
19898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* Too lazy to put BATs and SPRs ... */
19908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_SPARC)
19918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "g0", offsetof(CPUState, gregs[0]) },
19928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "g1", offsetof(CPUState, gregs[1]) },
19938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "g2", offsetof(CPUState, gregs[2]) },
19948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "g3", offsetof(CPUState, gregs[3]) },
19958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "g4", offsetof(CPUState, gregs[4]) },
19968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "g5", offsetof(CPUState, gregs[5]) },
19978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "g6", offsetof(CPUState, gregs[6]) },
19988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "g7", offsetof(CPUState, gregs[7]) },
19998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "o0", 0, monitor_get_reg },
20008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "o1", 1, monitor_get_reg },
20018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "o2", 2, monitor_get_reg },
20028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "o3", 3, monitor_get_reg },
20038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "o4", 4, monitor_get_reg },
20048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "o5", 5, monitor_get_reg },
20058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "o6", 6, monitor_get_reg },
20068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "o7", 7, monitor_get_reg },
20078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "l0", 8, monitor_get_reg },
20088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "l1", 9, monitor_get_reg },
20098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "l2", 10, monitor_get_reg },
20108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "l3", 11, monitor_get_reg },
20118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "l4", 12, monitor_get_reg },
20128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "l5", 13, monitor_get_reg },
20138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "l6", 14, monitor_get_reg },
20148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "l7", 15, monitor_get_reg },
20158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "i0", 16, monitor_get_reg },
20168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "i1", 17, monitor_get_reg },
20178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "i2", 18, monitor_get_reg },
20188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "i3", 19, monitor_get_reg },
20198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "i4", 20, monitor_get_reg },
20208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "i5", 21, monitor_get_reg },
20218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "i6", 22, monitor_get_reg },
20228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "i7", 23, monitor_get_reg },
20238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "pc", offsetof(CPUState, pc) },
20248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "npc", offsetof(CPUState, npc) },
20258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "y", offsetof(CPUState, y) },
20268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef TARGET_SPARC64
20278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "psr", 0, &monitor_get_psr, },
20288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "wim", offsetof(CPUState, wim) },
20298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
20308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "tbr", offsetof(CPUState, tbr) },
20318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "fsr", offsetof(CPUState, fsr) },
20328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f0", offsetof(CPUState, fpr[0]) },
20338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f1", offsetof(CPUState, fpr[1]) },
20348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f2", offsetof(CPUState, fpr[2]) },
20358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f3", offsetof(CPUState, fpr[3]) },
20368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f4", offsetof(CPUState, fpr[4]) },
20378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f5", offsetof(CPUState, fpr[5]) },
20388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f6", offsetof(CPUState, fpr[6]) },
20398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f7", offsetof(CPUState, fpr[7]) },
20408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f8", offsetof(CPUState, fpr[8]) },
20418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f9", offsetof(CPUState, fpr[9]) },
20428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f10", offsetof(CPUState, fpr[10]) },
20438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f11", offsetof(CPUState, fpr[11]) },
20448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f12", offsetof(CPUState, fpr[12]) },
20458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f13", offsetof(CPUState, fpr[13]) },
20468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f14", offsetof(CPUState, fpr[14]) },
20478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f15", offsetof(CPUState, fpr[15]) },
20488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f16", offsetof(CPUState, fpr[16]) },
20498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f17", offsetof(CPUState, fpr[17]) },
20508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f18", offsetof(CPUState, fpr[18]) },
20518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f19", offsetof(CPUState, fpr[19]) },
20528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f20", offsetof(CPUState, fpr[20]) },
20538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f21", offsetof(CPUState, fpr[21]) },
20548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f22", offsetof(CPUState, fpr[22]) },
20558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f23", offsetof(CPUState, fpr[23]) },
20568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f24", offsetof(CPUState, fpr[24]) },
20578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f25", offsetof(CPUState, fpr[25]) },
20588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f26", offsetof(CPUState, fpr[26]) },
20598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f27", offsetof(CPUState, fpr[27]) },
20608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f28", offsetof(CPUState, fpr[28]) },
20618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f29", offsetof(CPUState, fpr[29]) },
20628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f30", offsetof(CPUState, fpr[30]) },
20638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f31", offsetof(CPUState, fpr[31]) },
20648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_SPARC64
20658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f32", offsetof(CPUState, fpr[32]) },
20668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f34", offsetof(CPUState, fpr[34]) },
20678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f36", offsetof(CPUState, fpr[36]) },
20688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f38", offsetof(CPUState, fpr[38]) },
20698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f40", offsetof(CPUState, fpr[40]) },
20708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f42", offsetof(CPUState, fpr[42]) },
20718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f44", offsetof(CPUState, fpr[44]) },
20728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f46", offsetof(CPUState, fpr[46]) },
20738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f48", offsetof(CPUState, fpr[48]) },
20748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f50", offsetof(CPUState, fpr[50]) },
20758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f52", offsetof(CPUState, fpr[52]) },
20768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f54", offsetof(CPUState, fpr[54]) },
20778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f56", offsetof(CPUState, fpr[56]) },
20788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f58", offsetof(CPUState, fpr[58]) },
20798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f60", offsetof(CPUState, fpr[60]) },
20808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f62", offsetof(CPUState, fpr[62]) },
20818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "asi", offsetof(CPUState, asi) },
20828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "pstate", offsetof(CPUState, pstate) },
20838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "cansave", offsetof(CPUState, cansave) },
20848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "canrestore", offsetof(CPUState, canrestore) },
20858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "otherwin", offsetof(CPUState, otherwin) },
20868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "wstate", offsetof(CPUState, wstate) },
20878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "cleanwin", offsetof(CPUState, cleanwin) },
20888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "fprs", offsetof(CPUState, fprs) },
20898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
20908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2091e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner    MONITOR_DEF_INITIALIZER
20928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
20938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
20945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void expr_error(Monitor *mon, const char *msg)
20958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
20965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "%s\n", msg);
20978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    longjmp(expr_env, 1);
20988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
20998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
21008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* return 0 if OK, -1 if not found, -2 if no CPU defined */
21018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int get_monitor_def(target_long *pval, const char *name)
21028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
21035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    const MonitorDef *md;
21048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    void *ptr;
21058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
21068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(md = monitor_defs; md->name != NULL; md++) {
21078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (compare_cmd(name, md->name)) {
21088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (md->get_value) {
21098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                *pval = md->get_value(md, md->offset);
21108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            } else {
21118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                CPUState *env = mon_get_cpu();
21128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (!env)
21138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    return -2;
21148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                ptr = (uint8_t *)env + md->offset;
21158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                switch(md->type) {
21168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case MD_I32:
21178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    *pval = *(int32_t *)ptr;
21188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    break;
21198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case MD_TLONG:
21208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    *pval = *(target_long *)ptr;
21218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    break;
21228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                default:
21238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    *pval = 0;
21248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    break;
21258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
21268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
21278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return 0;
21288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
21298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
21308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return -1;
21318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
21328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
21338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void next(void)
21348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
21358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (pch != '\0') {
21368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        pch++;
21375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        while (qemu_isspace(*pch))
21388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            pch++;
21398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
21408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
21418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
21425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int64_t expr_sum(Monitor *mon);
21438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
21445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int64_t expr_unary(Monitor *mon)
21458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
21468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t n;
21478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char *p;
21488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int ret;
21498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
21508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch(*pch) {
21518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case '+':
21528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        next();
21535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        n = expr_unary(mon);
21548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
21558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case '-':
21568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        next();
21575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        n = -expr_unary(mon);
21588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
21598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case '~':
21608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        next();
21615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        n = ~expr_unary(mon);
21628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
21638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case '(':
21648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        next();
21655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        n = expr_sum(mon);
21668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (*pch != ')') {
21675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            expr_error(mon, "')' expected");
21688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
21698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        next();
21708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
21718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case '\'':
21728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        pch++;
21738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (*pch == '\0')
21745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            expr_error(mon, "character constant expected");
21758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        n = *pch;
21768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        pch++;
21778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (*pch != '\'')
21785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            expr_error(mon, "missing terminating \' character");
21798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        next();
21808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
21818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case '$':
21828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
21838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            char buf[128], *q;
21848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            target_long reg=0;
21858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
21868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            pch++;
21878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            q = buf;
21888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            while ((*pch >= 'a' && *pch <= 'z') ||
21898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   (*pch >= 'A' && *pch <= 'Z') ||
21908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   (*pch >= '0' && *pch <= '9') ||
21918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   *pch == '_' || *pch == '.') {
21928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if ((q - buf) < sizeof(buf) - 1)
21938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    *q++ = *pch;
21948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                pch++;
21958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
21965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            while (qemu_isspace(*pch))
21978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                pch++;
21988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            *q = 0;
21998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            ret = get_monitor_def(&reg, buf);
22008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (ret == -1)
22015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                expr_error(mon, "unknown register");
22028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else if (ret == -2)
22035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                expr_error(mon, "no cpu defined");
22048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            n = reg;
22058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
22068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
22078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case '\0':
22085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        expr_error(mon, "unexpected end of expression");
22098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        n = 0;
22108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
22118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    default:
22128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if TARGET_PHYS_ADDR_BITS > 32
22138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        n = strtoull(pch, &p, 0);
22148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
22158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        n = strtoul(pch, &p, 0);
22168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
22178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (pch == p) {
22185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            expr_error(mon, "invalid char in expression");
22198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
22208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        pch = p;
22215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        while (qemu_isspace(*pch))
22228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            pch++;
22238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
22248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
22258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return n;
22268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
22278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
22288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
22295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int64_t expr_prod(Monitor *mon)
22308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
22318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t val, val2;
22328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int op;
22338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
22345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    val = expr_unary(mon);
22358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(;;) {
22368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        op = *pch;
22378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (op != '*' && op != '/' && op != '%')
22388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
22398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        next();
22405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        val2 = expr_unary(mon);
22418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        switch(op) {
22428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        default:
22438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case '*':
22448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            val *= val2;
22458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
22468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case '/':
22478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case '%':
22488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (val2 == 0)
22495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                expr_error(mon, "division by zero");
22508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (op == '/')
22518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                val /= val2;
22528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else
22538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                val %= val2;
22548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
22558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
22568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
22578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return val;
22588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
22598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
22605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int64_t expr_logic(Monitor *mon)
22618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
22628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t val, val2;
22638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int op;
22648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
22655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    val = expr_prod(mon);
22668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(;;) {
22678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        op = *pch;
22688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (op != '&' && op != '|' && op != '^')
22698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
22708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        next();
22715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        val2 = expr_prod(mon);
22728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        switch(op) {
22738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        default:
22748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case '&':
22758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            val &= val2;
22768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
22778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case '|':
22788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            val |= val2;
22798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
22808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case '^':
22818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            val ^= val2;
22828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
22838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
22848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
22858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return val;
22868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
22878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
22885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int64_t expr_sum(Monitor *mon)
22898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
22908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t val, val2;
22918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int op;
22928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
22935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    val = expr_logic(mon);
22948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(;;) {
22958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        op = *pch;
22968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (op != '+' && op != '-')
22978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
22988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        next();
22995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        val2 = expr_logic(mon);
23008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (op == '+')
23018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            val += val2;
23028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        else
23038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            val -= val2;
23048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
23058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return val;
23068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
23078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
23085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int get_expr(Monitor *mon, int64_t *pval, const char **pp)
23098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
23108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    pch = *pp;
23118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (setjmp(expr_env)) {
23128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        *pp = pch;
23138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
23148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
23155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    while (qemu_isspace(*pch))
23168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        pch++;
23175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    *pval = expr_sum(mon);
23188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    *pp = pch;
23198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return 0;
23208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
23218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
23228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int get_str(char *buf, int buf_size, const char **pp)
23238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
23248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *p;
23258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char *q;
23268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int c;
23278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
23288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    q = buf;
23298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    p = *pp;
23305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    while (qemu_isspace(*p))
23318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        p++;
23328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (*p == '\0') {
23338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    fail:
23348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        *q = '\0';
23358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        *pp = p;
23368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
23378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
23388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (*p == '\"') {
23398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        p++;
23408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        while (*p != '\0' && *p != '\"') {
23418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (*p == '\\') {
23428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                p++;
23438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                c = *p++;
23448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                switch(c) {
23458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case 'n':
23468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    c = '\n';
23478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    break;
23488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case 'r':
23498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    c = '\r';
23508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    break;
23518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case '\\':
23528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case '\'':
23538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case '\"':
23548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    break;
23558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                default:
23568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    qemu_printf("unsupported escape code: '\\%c'\n", c);
23578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    goto fail;
23588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
23598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if ((q - buf) < buf_size - 1) {
23608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    *q++ = c;
23618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
23628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            } else {
23638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if ((q - buf) < buf_size - 1) {
23648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    *q++ = *p;
23658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
23668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                p++;
23678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
23688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
23698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (*p != '\"') {
23708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            qemu_printf("unterminated string\n");
23718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            goto fail;
23728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
23738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        p++;
23748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } else {
23755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        while (*p != '\0' && !qemu_isspace(*p)) {
23768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if ((q - buf) < buf_size - 1) {
23778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                *q++ = *p;
23788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
23798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            p++;
23808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
23818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
23828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    *q = '\0';
23838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    *pp = p;
23848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return 0;
23858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
23868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
23875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/*
23885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Store the command-name in cmdname, and return a pointer to
23895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * the remaining of the command string.
23905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */
23915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic const char *get_command_name(const char *cmdline,
23925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                    char *cmdname, size_t nlen)
23935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
23945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    size_t len;
23955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    const char *p, *pstart;
23965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
23975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    p = cmdline;
23985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    while (qemu_isspace(*p))
23995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        p++;
24005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (*p == '\0')
24015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        return NULL;
24025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    pstart = p;
24035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    while (*p != '\0' && *p != '/' && !qemu_isspace(*p))
24045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        p++;
24055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    len = p - pstart;
24065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (len > nlen - 1)
24075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        len = nlen - 1;
24085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    memcpy(cmdname, pstart, len);
24095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    cmdname[len] = '\0';
24105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    return p;
24115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
24125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
24138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int default_fmt_format = 'x';
24148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int default_fmt_size = 4;
24158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
24168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MAX_ARGS 16
24178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
24185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void monitor_handle_command(Monitor *mon, const char *cmdline)
24198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
24205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    const char *p, *typestr;
24215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int c, nb_args, i, has_arg;
24225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    const mon_cmd_t *cmd;
24238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char cmdname[256];
24248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char buf[1024];
24258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    void *str_allocated[MAX_ARGS];
24268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    void *args[MAX_ARGS];
24275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void (*handler_0)(Monitor *mon);
24285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void (*handler_1)(Monitor *mon, void *arg0);
24295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void (*handler_2)(Monitor *mon, void *arg0, void *arg1);
24305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void (*handler_3)(Monitor *mon, void *arg0, void *arg1, void *arg2);
24315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void (*handler_4)(Monitor *mon, void *arg0, void *arg1, void *arg2,
24325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                      void *arg3);
24335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void (*handler_5)(Monitor *mon, void *arg0, void *arg1, void *arg2,
24345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                      void *arg3, void *arg4);
24355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void (*handler_6)(Monitor *mon, void *arg0, void *arg1, void *arg2,
24365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                      void *arg3, void *arg4, void *arg5);
24375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void (*handler_7)(Monitor *mon, void *arg0, void *arg1, void *arg2,
24385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                      void *arg3, void *arg4, void *arg5, void *arg6);
2439334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima    void (*handler_8)(Monitor *mon, void *arg0, void *arg1, void *arg2,
2440334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                      void *arg3, void *arg4, void *arg5, void *arg6,
2441334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                      void *arg7);
2442334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima    void (*handler_9)(Monitor *mon, void *arg0, void *arg1, void *arg2,
2443334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                      void *arg3, void *arg4, void *arg5, void *arg6,
2444334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                      void *arg7, void *arg8);
2445334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima    void (*handler_10)(Monitor *mon, void *arg0, void *arg1, void *arg2,
2446334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                       void *arg3, void *arg4, void *arg5, void *arg6,
2447334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                       void *arg7, void *arg8, void *arg9);
24488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef DEBUG
24495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "command='%s'\n", cmdline);
24508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
24518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
24528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* extract the command name */
24535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    p = get_command_name(cmdline, cmdname, sizeof(cmdname));
24545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (!p)
24558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
24568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
24578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* find the command */
24585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
24598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (compare_cmd(cmdname, cmd->name))
24605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            break;
24615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    }
24625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
24635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (cmd->name == NULL) {
24645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "unknown command: '%s'\n", cmdname);
24655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        return;
24668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
24678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
24688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(i = 0; i < MAX_ARGS; i++)
24698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        str_allocated[i] = NULL;
24708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
24718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* parse the parameters */
24728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    typestr = cmd->args_type;
24738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    nb_args = 0;
24748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(;;) {
24758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        c = *typestr;
24768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (c == '\0')
24778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
24788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        typestr++;
24798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        switch(c) {
24808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case 'F':
24818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case 'B':
24828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case 's':
24838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
24848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                int ret;
24858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                char *str;
24868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
24875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                while (qemu_isspace(*p))
24888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    p++;
24898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (*typestr == '?') {
24908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    typestr++;
24918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if (*p == '\0') {
24928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        /* no optional string: NULL argument */
24938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        str = NULL;
24948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        goto add_str;
24958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
24968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
24978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                ret = get_str(buf, sizeof(buf), &p);
24988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (ret < 0) {
24998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    switch(c) {
25008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    case 'F':
25015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                        monitor_printf(mon, "%s: filename expected\n",
25025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                       cmdname);
25038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        break;
25048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    case 'B':
25055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                        monitor_printf(mon, "%s: block device name expected\n",
25065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                       cmdname);
25078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        break;
25088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    default:
25095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                        monitor_printf(mon, "%s: string expected\n", cmdname);
25108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        break;
25118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
25128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    goto fail;
25138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
25148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                str = qemu_malloc(strlen(buf) + 1);
25158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                pstrcpy(str, sizeof(buf), buf);
25168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                str_allocated[nb_args] = str;
25178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            add_str:
25188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (nb_args >= MAX_ARGS) {
25198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                error_args:
25205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                    monitor_printf(mon, "%s: too many arguments\n", cmdname);
25218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    goto fail;
25228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
25238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                args[nb_args++] = str;
25248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
25258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
25268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case '/':
25278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
25288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                int count, format, size;
25298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
25305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                while (qemu_isspace(*p))
25318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    p++;
25328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (*p == '/') {
25338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    /* format found */
25348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    p++;
25358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    count = 1;
25365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                    if (qemu_isdigit(*p)) {
25378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        count = 0;
25385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                        while (qemu_isdigit(*p)) {
25398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            count = count * 10 + (*p - '0');
25408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            p++;
25418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        }
25428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
25438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    size = -1;
25448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    format = -1;
25458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    for(;;) {
25468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        switch(*p) {
25478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        case 'o':
25488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        case 'd':
25498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        case 'u':
25508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        case 'x':
25518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        case 'i':
25528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        case 'c':
25538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            format = *p++;
25548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            break;
25558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        case 'b':
25568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            size = 1;
25578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            p++;
25588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            break;
25598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        case 'h':
25608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            size = 2;
25618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            p++;
25628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            break;
25638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        case 'w':
25648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            size = 4;
25658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            p++;
25668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            break;
25678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        case 'g':
25688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        case 'L':
25698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            size = 8;
25708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            p++;
25718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            break;
25728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        default:
25738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            goto next;
25748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        }
25758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
25768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                next:
25775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                    if (*p != '\0' && !qemu_isspace(*p)) {
25785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                        monitor_printf(mon, "invalid char in format: '%c'\n",
25795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                       *p);
25808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        goto fail;
25818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
25828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if (format < 0)
25838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        format = default_fmt_format;
25848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if (format != 'i') {
25858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        /* for 'i', not specifying a size gives -1 as size */
25868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        if (size < 0)
25878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            size = default_fmt_size;
25885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                        default_fmt_size = size;
25898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
25908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    default_fmt_format = format;
25918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                } else {
25928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    count = 1;
25938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    format = default_fmt_format;
25948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if (format != 'i') {
25958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        size = default_fmt_size;
25968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    } else {
25978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        size = -1;
25988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
25998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
26008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (nb_args + 3 > MAX_ARGS)
26018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    goto error_args;
26028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                args[nb_args++] = (void*)(long)count;
26038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                args[nb_args++] = (void*)(long)format;
26048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                args[nb_args++] = (void*)(long)size;
26058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
26068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
26078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case 'i':
26088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case 'l':
26098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
26108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                int64_t val;
26118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
26125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                while (qemu_isspace(*p))
26138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    p++;
26148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (*typestr == '?' || *typestr == '.') {
26158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if (*typestr == '?') {
26168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        if (*p == '\0')
26178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            has_arg = 0;
26188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        else
26198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            has_arg = 1;
26208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    } else {
26218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        if (*p == '.') {
26228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            p++;
26235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                            while (qemu_isspace(*p))
26248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                p++;
26258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            has_arg = 1;
26268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        } else {
26278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            has_arg = 0;
26288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        }
26298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
26308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    typestr++;
26318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if (nb_args >= MAX_ARGS)
26328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        goto error_args;
26338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    args[nb_args++] = (void *)(long)has_arg;
26348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if (!has_arg) {
26358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        if (nb_args >= MAX_ARGS)
26368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            goto error_args;
26378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        val = -1;
26388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        goto add_num;
26398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
26408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
26415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                if (get_expr(mon, &val, &p))
26428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    goto fail;
26438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            add_num:
26448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (c == 'i') {
26458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if (nb_args >= MAX_ARGS)
26468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        goto error_args;
26478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    args[nb_args++] = (void *)(long)val;
26488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                } else {
26498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if ((nb_args + 1) >= MAX_ARGS)
26508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        goto error_args;
26518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if TARGET_PHYS_ADDR_BITS > 32
26528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    args[nb_args++] = (void *)(long)((val >> 32) & 0xffffffff);
26538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
26548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    args[nb_args++] = (void *)0;
26558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
26568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    args[nb_args++] = (void *)(long)(val & 0xffffffff);
26578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
26588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
26598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
26608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case '-':
26618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
26628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                int has_option;
26638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                /* option */
26648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
26658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                c = *typestr++;
26668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (c == '\0')
26678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    goto bad_type;
26685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                while (qemu_isspace(*p))
26698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    p++;
26708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                has_option = 0;
26718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (*p == '-') {
26728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    p++;
26738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if (*p != c) {
26745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                        monitor_printf(mon, "%s: unsupported option -%c\n",
26755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                       cmdname, *p);
26768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        goto fail;
26778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
26788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    p++;
26798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    has_option = 1;
26808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
26818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (nb_args >= MAX_ARGS)
26828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    goto error_args;
26838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                args[nb_args++] = (void *)(long)has_option;
26848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
26858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
26868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        default:
26878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        bad_type:
26885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(mon, "%s: unknown type '%c'\n", cmdname, c);
26898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            goto fail;
26908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
26918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
26928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* check that all arguments were parsed */
26935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    while (qemu_isspace(*p))
26948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        p++;
26958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (*p != '\0') {
26965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "%s: extraneous characters at the end of line\n",
26975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                       cmdname);
26988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        goto fail;
26998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
27008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
27018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch(nb_args) {
27028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 0:
27038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        handler_0 = cmd->handler;
27045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        handler_0(mon);
27058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
27068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 1:
27078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        handler_1 = cmd->handler;
27085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        handler_1(mon, args[0]);
27098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
27108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 2:
27118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        handler_2 = cmd->handler;
27125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        handler_2(mon, args[0], args[1]);
27138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
27148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 3:
27158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        handler_3 = cmd->handler;
27165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        handler_3(mon, args[0], args[1], args[2]);
27178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
27188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 4:
27198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        handler_4 = cmd->handler;
27205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        handler_4(mon, args[0], args[1], args[2], args[3]);
27218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
27228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 5:
27238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        handler_5 = cmd->handler;
27245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        handler_5(mon, args[0], args[1], args[2], args[3], args[4]);
27258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
27268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 6:
27278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        handler_6 = cmd->handler;
27285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        handler_6(mon, args[0], args[1], args[2], args[3], args[4], args[5]);
27298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
27308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 7:
27318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        handler_7 = cmd->handler;
27325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        handler_7(mon, args[0], args[1], args[2], args[3], args[4], args[5],
27335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                  args[6]);
27348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
2735334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima    case 8:
2736334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        handler_8 = cmd->handler;
2737334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        handler_8(mon, args[0], args[1], args[2], args[3], args[4], args[5],
2738334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                  args[6], args[7]);
2739334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        break;
2740334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima    case 9:
2741334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        handler_9 = cmd->handler;
2742334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        handler_9(mon, args[0], args[1], args[2], args[3], args[4], args[5],
2743334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                  args[6], args[7], args[8]);
2744334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        break;
2745334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima    case 10:
2746334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        handler_10 = cmd->handler;
2747334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        handler_10(mon, args[0], args[1], args[2], args[3], args[4], args[5],
2748334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                   args[6], args[7], args[8], args[9]);
2749334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        break;
27508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    default:
27515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "unsupported number of arguments: %d\n", nb_args);
27528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        goto fail;
27538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
27548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fail:
27558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(i = 0; i < MAX_ARGS; i++)
27568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        qemu_free(str_allocated[i]);
27578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
27588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2759edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turnervoid monitor_set_error(Monitor *mon, QError *qerror)
2760edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner{
2761edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner#if 1
2762edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner    QDECREF(qerror);
2763edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner#else
2764edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner    /* report only the first error */
2765edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner    if (!mon->error) {
2766edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner        mon->error = qerror;
2767edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner    } else {
2768edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner        MON_DEBUG("Additional error report at %s:%d\n",
2769edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner                  qerror->file, qerror->linenr);
2770edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner        QDECREF(qerror);
2771edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner    }
2772edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner#endif
2773edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner}
2774edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner
27758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void cmd_completion(const char *name, const char *list)
27768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
27778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *p, *pstart;
27788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char cmd[128];
27798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int len;
27808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
27818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    p = list;
27828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(;;) {
27838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        pstart = p;
27848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        p = strchr(p, '|');
27858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (!p)
27868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            p = pstart + strlen(pstart);
27878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        len = p - pstart;
27888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (len > sizeof(cmd) - 2)
27898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            len = sizeof(cmd) - 2;
27908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        memcpy(cmd, pstart, len);
27918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        cmd[len] = '\0';
27928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (name[0] == '\0' || !strncmp(name, cmd, strlen(name))) {
27935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            readline_add_completion(cur_mon->rs, cmd);
27948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
27958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (*p == '\0')
27968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
27978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        p++;
27988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
27998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
28008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
28018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void file_completion(const char *input)
28028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
28038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DIR *ffs;
28048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    struct dirent *d;
28058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char path[1024];
28068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char file[1024], file_prefix[1024];
28078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int input_path_len;
28088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *p;
28098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
28108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    p = strrchr(input, '/');
28118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!p) {
28128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        input_path_len = 0;
28138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        pstrcpy(file_prefix, sizeof(file_prefix), input);
28148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        pstrcpy(path, sizeof(path), ".");
28158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } else {
28168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        input_path_len = p - input + 1;
28178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        memcpy(path, input, input_path_len);
28188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (input_path_len > sizeof(path) - 1)
28198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            input_path_len = sizeof(path) - 1;
28208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        path[input_path_len] = '\0';
28218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        pstrcpy(file_prefix, sizeof(file_prefix), p + 1);
28228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
28238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef DEBUG_COMPLETION
28245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(cur_mon, "input='%s' path='%s' prefix='%s'\n",
28255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   input, path, file_prefix);
28268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
28278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ffs = opendir(path);
28288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!ffs)
28298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
28308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(;;) {
28318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        struct stat sb;
28328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        d = readdir(ffs);
28338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (!d)
28348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
28358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (strstart(d->d_name, file_prefix, NULL)) {
28368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            memcpy(file, input, input_path_len);
28378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (input_path_len < sizeof(file))
28388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                pstrcpy(file + input_path_len, sizeof(file) - input_path_len,
28398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        d->d_name);
28408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            /* stat the file to find out if it's a directory.
28418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             * In that case add a slash to speed up typing long paths
28428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             */
28438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            stat(file, &sb);
28448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if(S_ISDIR(sb.st_mode))
28458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                pstrcat(file, sizeof(file), "/");
28465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            readline_add_completion(cur_mon->rs, file);
28478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
28488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
28498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    closedir(ffs);
28508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
28518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
28525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void block_completion_it(void *opaque, BlockDriverState *bs)
28538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
28545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    const char *name = bdrv_get_device_name(bs);
28558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *input = opaque;
28568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
28578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (input[0] == '\0' ||
28588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        !strncmp(name, (char *)input, strlen(input))) {
28595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        readline_add_completion(cur_mon->rs, name);
28608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
28618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
28628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
28638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* NOTE: this parser is an approximate form of the real command parser */
28648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void parse_cmdline(const char *cmdline,
28658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         int *pnb_args, char **args)
28668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
28678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *p;
28688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int nb_args, ret;
28698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char buf[1024];
28708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
28718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    p = cmdline;
28728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    nb_args = 0;
28738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(;;) {
28745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        while (qemu_isspace(*p))
28758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            p++;
28768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (*p == '\0')
28778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
28788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (nb_args >= MAX_ARGS)
28798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
28808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ret = get_str(buf, sizeof(buf), &p);
28818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        args[nb_args] = qemu_strdup(buf);
28828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        nb_args++;
28838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (ret < 0)
28848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
28858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
28868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    *pnb_args = nb_args;
28878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
28888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
28895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void monitor_find_completion(const char *cmdline)
28908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
28918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *cmdname;
28928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char *args[MAX_ARGS];
28938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int nb_args, i, len;
28948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *ptype, *str;
28955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    const mon_cmd_t *cmd;
28968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const KeyDef *key;
28978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
28988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    parse_cmdline(cmdline, &nb_args, args);
28998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef DEBUG_COMPLETION
29008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(i = 0; i < nb_args; i++) {
29015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(cur_mon, "arg%d = '%s'\n", i, (char *)args[i]);
29028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
29038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
29048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
29058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* if the line ends with a space, it means we want to complete the
29068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       next arg */
29078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    len = strlen(cmdline);
29085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (len > 0 && qemu_isspace(cmdline[len - 1])) {
29098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (nb_args >= MAX_ARGS)
29108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return;
29118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        args[nb_args++] = qemu_strdup("");
29128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
29138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (nb_args <= 1) {
29148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* command completion */
29158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (nb_args == 0)
29168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            cmdname = "";
29178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        else
29188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            cmdname = args[0];
29195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        readline_set_completion_index(cur_mon->rs, strlen(cmdname));
29205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
29218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            cmd_completion(cmdname, cmd->name);
29228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
29238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } else {
29248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* find the command */
29255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
29268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (compare_cmd(args[0], cmd->name))
29278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                goto found;
29288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
29298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
29308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    found:
29318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ptype = cmd->args_type;
29328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        for(i = 0; i < nb_args - 2; i++) {
29338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (*ptype != '\0') {
29348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                ptype++;
29358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                while (*ptype == '?')
29368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    ptype++;
29378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
29388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
29398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        str = args[nb_args - 1];
29408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        switch(*ptype) {
29418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case 'F':
29428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            /* file completion */
29435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            readline_set_completion_index(cur_mon->rs, strlen(str));
29448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            file_completion(str);
29458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
29468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case 'B':
29478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            /* block device name completion */
29485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            readline_set_completion_index(cur_mon->rs, strlen(str));
29498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            bdrv_iterate(block_completion_it, (void *)str);
29508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
29518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case 's':
29528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            /* XXX: more generic ? */
29538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (!strcmp(cmd->name, "info")) {
29545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                readline_set_completion_index(cur_mon->rs, strlen(str));
29558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                for(cmd = info_cmds; cmd->name != NULL; cmd++) {
29568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    cmd_completion(str, cmd->name);
29578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
29588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            } else if (!strcmp(cmd->name, "sendkey")) {
29595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                char *sep = strrchr(str, '-');
29605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                if (sep)
29615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                    str = sep + 1;
29625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                readline_set_completion_index(cur_mon->rs, strlen(str));
29638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                for(key = key_defs; key->name != NULL; key++) {
29648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    cmd_completion(str, key->name);
29658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
29668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
29678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
29688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        default:
29698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
29708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
29718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
29728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(i = 0; i < nb_args; i++)
29738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        qemu_free(args[i]);
29748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
29758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
29765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int monitor_can_read(void *opaque)
29778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
29785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    Monitor *mon = opaque;
29795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
29805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    return (mon->suspend_cnt == 0) ? 128 : 0;
29818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
29828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2983e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnerstatic void monitor_done(Monitor *mon); // forward
2984e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner
29855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void monitor_read(void *opaque, const uint8_t *buf, int size)
29868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
29875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    Monitor *old_mon = cur_mon;
29888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int i;
29895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
29905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    cur_mon = opaque;
29915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
29925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (cur_mon->rs) {
29935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        for (i = 0; i < size; i++)
29945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            readline_handle_byte(cur_mon->rs, buf[i]);
29955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    } else {
29965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        if (size == 0 || buf[size - 1] != 0)
29975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_printf(cur_mon, "corrupted command\n");
29985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        else
29995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            monitor_handle_command(cur_mon, (char *)buf);
30005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    }
30015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
3002e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner    if (cur_mon->has_quit) {
3003e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner        monitor_done(cur_mon);
3004e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner    }
30055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    cur_mon = old_mon;
30068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
30078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
30085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void monitor_command_cb(Monitor *mon, const char *cmdline, void *opaque)
30095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
30105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_suspend(mon);
30115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_handle_command(mon, cmdline);
30125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_resume(mon);
30135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
30148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
30155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint monitor_suspend(Monitor *mon)
30168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
30175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (!mon->rs)
30185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        return -ENOTTY;
30195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    mon->suspend_cnt++;
30205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    return 0;
30218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
30228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
30235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid monitor_resume(Monitor *mon)
30248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
30255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (!mon->rs)
30265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        return;
30275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (--mon->suspend_cnt == 0)
30285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        readline_show_prompt(mon->rs);
30298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
30308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
30315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void monitor_event(void *opaque, int event)
30328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
30335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    Monitor *mon = opaque;
30348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
30355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    switch (event) {
30365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    case CHR_EVENT_MUX_IN:
30379d1188280fa5294f9438424e5e8eae91f645bfd8David Turner        mon->mux_out = 0;
30389d1188280fa5294f9438424e5e8eae91f645bfd8David Turner        if (mon->reset_seen) {
30399d1188280fa5294f9438424e5e8eae91f645bfd8David Turner            readline_restart(mon->rs);
30409d1188280fa5294f9438424e5e8eae91f645bfd8David Turner            monitor_resume(mon);
30419d1188280fa5294f9438424e5e8eae91f645bfd8David Turner            monitor_flush(mon);
30429d1188280fa5294f9438424e5e8eae91f645bfd8David Turner        } else {
30439d1188280fa5294f9438424e5e8eae91f645bfd8David Turner            mon->suspend_cnt = 0;
30449d1188280fa5294f9438424e5e8eae91f645bfd8David Turner        }
30455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        break;
30465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
30475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    case CHR_EVENT_MUX_OUT:
30489d1188280fa5294f9438424e5e8eae91f645bfd8David Turner        if (mon->reset_seen) {
30499d1188280fa5294f9438424e5e8eae91f645bfd8David Turner            if (mon->suspend_cnt == 0) {
30509d1188280fa5294f9438424e5e8eae91f645bfd8David Turner                monitor_printf(mon, "\n");
30519d1188280fa5294f9438424e5e8eae91f645bfd8David Turner            }
30529d1188280fa5294f9438424e5e8eae91f645bfd8David Turner            monitor_flush(mon);
30539d1188280fa5294f9438424e5e8eae91f645bfd8David Turner            monitor_suspend(mon);
30549d1188280fa5294f9438424e5e8eae91f645bfd8David Turner        } else {
30559d1188280fa5294f9438424e5e8eae91f645bfd8David Turner            mon->suspend_cnt++;
30569d1188280fa5294f9438424e5e8eae91f645bfd8David Turner        }
30579d1188280fa5294f9438424e5e8eae91f645bfd8David Turner        mon->mux_out = 1;
30585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        break;
30595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
3060a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner    case CHR_EVENT_OPENED:
30615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "QEMU %s monitor - type 'help' for more "
30625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                       "information\n", QEMU_VERSION);
30639d1188280fa5294f9438424e5e8eae91f645bfd8David Turner        if (!mon->mux_out) {
30645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            readline_show_prompt(mon->rs);
30659d1188280fa5294f9438424e5e8eae91f645bfd8David Turner        }
30669d1188280fa5294f9438424e5e8eae91f645bfd8David Turner        mon->reset_seen = 1;
30675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        break;
30685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    }
30698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
30708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
30718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
30725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/*
30735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Local variables:
30745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *  c-indent-level: 4
30755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *  c-basic-offset: 4
30765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *  tab-width: 8
30775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * End:
30785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */
30795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
30805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid monitor_init(CharDriverState *chr, int flags)
30818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
30825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    static int is_first_init = 1;
30835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    Monitor *mon;
30848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
30858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (is_first_init) {
30865973c775c853e26f684de58ad28c267281aaffd6David 'Digit' Turner        key_timer = qemu_new_timer_ms(vm_clock, release_keys, NULL);
30878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        is_first_init = 0;
30888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
30898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
30905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    mon = qemu_mallocz(sizeof(*mon));
30915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
30925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    mon->chr = chr;
30935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    mon->flags = flags;
30945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (flags & MONITOR_USE_READLINE) {
30955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        mon->rs = readline_init(mon, monitor_find_completion);
30965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_read_command(mon, 0);
30975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    }
30988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
30995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    qemu_chr_add_handlers(chr, monitor_can_read, monitor_read, monitor_event,
31005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                          mon);
31018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3102a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner    QLIST_INSERT_HEAD(&mon_list, mon, entry);
31035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (!cur_mon || (flags & MONITOR_IS_DEFAULT))
31045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        cur_mon = mon;
31058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
31068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3107e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnerstatic void monitor_done(Monitor *mon)
3108e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner{
3109e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner    if (cur_mon == mon)
3110e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner        cur_mon = NULL;
3111e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner
3112e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner    QLIST_REMOVE(mon, entry);
3113e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner
3114e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner    readline_free(mon->rs);
3115e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner    qemu_chr_close(mon->chr);
3116e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner
3117e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner    qemu_free(mon);
3118e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner}
3119e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner
31205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void bdrv_password_cb(Monitor *mon, const char *password, void *opaque)
31218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
31225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    BlockDriverState *bs = opaque;
31235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int ret = 0;
31245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
31255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (bdrv_set_key(bs, password) != 0) {
31265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        monitor_printf(mon, "invalid password\n");
31275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        ret = -EPERM;
31285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    }
31295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (mon->password_completion_cb)
31305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        mon->password_completion_cb(mon->password_opaque, ret);
31315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
31325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_read_command(mon, 1);
31338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
31348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3135edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turnerint monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs,
3136edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner                                BlockDriverCompletionFunc *completion_cb,
3137edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner                                void *opaque)
31388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
31395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int err;
31408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
31415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (!bdrv_key_required(bs)) {
31425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        if (completion_cb)
31435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            completion_cb(opaque, 0);
3144edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner        return 0;
3145edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner    }
3146edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner
3147edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner    if (monitor_ctrl_mode(mon)) {
3148edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner        qerror_report(QERR_DEVICE_ENCRYPTED, bdrv_get_device_name(bs));
3149edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner        return -1;
31508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
31515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
31525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    monitor_printf(mon, "%s (%s) is encrypted.\n", bdrv_get_device_name(bs),
31535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                   bdrv_get_encrypted_filename(bs));
31545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
31555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    mon->password_completion_cb = completion_cb;
31565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    mon->password_opaque = opaque;
31575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
31585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    err = monitor_read_password(mon, bdrv_password_cb, bs);
31595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
31605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (err && completion_cb)
31615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        completion_cb(opaque, err);
3162edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner
3163edd33969474fd39ed2aa61f4b07b83ee3e586f9cDavid Turner    return err;
31648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3165