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(®, 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