diff options
Diffstat (limited to 'src/VBox/Debugger/DBGCBuiltInSymbols.cpp')
-rw-r--r-- | src/VBox/Debugger/DBGCBuiltInSymbols.cpp | 498 |
1 files changed, 3 insertions, 495 deletions
diff --git a/src/VBox/Debugger/DBGCBuiltInSymbols.cpp b/src/VBox/Debugger/DBGCBuiltInSymbols.cpp index 6a4e7075c..17abd3125 100644 --- a/src/VBox/Debugger/DBGCBuiltInSymbols.cpp +++ b/src/VBox/Debugger/DBGCBuiltInSymbols.cpp @@ -1,10 +1,10 @@ -/* $Id: DBGCBuiltInSymbols.cpp $ */ +/* $Id: DBGCBuiltInSymbols.cpp 37423 2011-06-12 18:37:56Z vboxsync $ */ /** @file * DBGC - Debugger Console, Built-In Symbols. */ /* - * Copyright (C) 2006-2010 Oracle Corporation + * Copyright (C) 2006-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -19,501 +19,13 @@ * Header Files * *******************************************************************************/ #define LOG_GROUP LOG_GROUP_DBGC -#include <VBox/dbg.h> -#include <VBox/vmm/dbgf.h> -#include <VBox/vmm/vm.h> -#include <VBox/vmm/vmm.h> -#include <VBox/vmm/mm.h> -#include <VBox/vmm/pgm.h> -#include <VBox/vmm/selm.h> -#include <VBox/dis.h> -#include <VBox/param.h> -#include <VBox/err.h> -#include <VBox/log.h> - -#include <iprt/alloc.h> -#include <iprt/alloca.h> -#include <iprt/string.h> -#include <iprt/assert.h> -#include <iprt/ctype.h> - -#include <stdlib.h> -#include <stdio.h> - #include "DBGCInternal.h" -/******************************************************************************* -* Internal Functions * -*******************************************************************************/ -static DECLCALLBACK(int) dbgcSymGetReg(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, DBGCVARTYPE enmType, PDBGCVAR pResult); -static DECLCALLBACK(int) dbgcSymSetReg(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, PCDBGCVAR pValue); - - -/******************************************************************************* -* Global Variables * -*******************************************************************************/ -/** Register symbol uUser value. - * @{ - */ -/** If set the register set is the hypervisor and not the guest one. */ -#define SYMREG_FLAGS_HYPER RT_BIT(20) -/** If set a far conversion of the value will use the high 16 bit for the selector. - * If clear the low 16 bit will be used. */ -#define SYMREG_FLAGS_HIGH_SEL RT_BIT(21) -/** The shift value to calc the size of a register symbol from the uUser value. */ -#define SYMREG_SIZE_SHIFT (24) -/** Get the offset */ -#define SYMREG_OFFSET(uUser) (uUser & ((1 << 20) - 1)) -/** Get the size. */ -#define SYMREG_SIZE(uUser) ((uUser >> SYMREG_SIZE_SHIFT) & 0xff) -/** 1 byte. */ -#define SYMREG_SIZE_1 ( 1 << SYMREG_SIZE_SHIFT) -/** 2 byte. */ -#define SYMREG_SIZE_2 ( 2 << SYMREG_SIZE_SHIFT) -/** 4 byte. */ -#define SYMREG_SIZE_4 ( 4 << SYMREG_SIZE_SHIFT) -/** 6 byte. */ -#define SYMREG_SIZE_6 ( 6 << SYMREG_SIZE_SHIFT) -/** 8 byte. */ -#define SYMREG_SIZE_8 ( 8 << SYMREG_SIZE_SHIFT) -/** 10 bytes. */ -#define SYMREG_SIZE_10 (10 << SYMREG_SIZE_SHIFT) -/** 12 byte. */ -#define SYMREG_SIZE_12 (12 << SYMREG_SIZE_SHIFT) -/** 16 byte. */ -#define SYMREG_SIZE_16 (16 << SYMREG_SIZE_SHIFT) -/** @} */ - -/** Builtin Symbols. - * ASSUMES little endian register representation! - */ -static const DBGCSYM g_aSyms[] = -{ - { "rax", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, rax) | SYMREG_SIZE_8 }, - { "eax", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eax) | SYMREG_SIZE_4 }, - { "ax", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eax) | SYMREG_SIZE_2 }, - { "al", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eax) | SYMREG_SIZE_1 }, - { "ah", dbgcSymGetReg, dbgcSymSetReg, (offsetof(CPUMCTX, eax) + 1)| SYMREG_SIZE_1 }, - - { "rbx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, rbx) | SYMREG_SIZE_8 }, - { "ebx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebx) | SYMREG_SIZE_4 }, - { "bx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebx) | SYMREG_SIZE_2 }, - { "bl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebx) | SYMREG_SIZE_1 }, - { "bh", dbgcSymGetReg, dbgcSymSetReg, (offsetof(CPUMCTX, ebx) + 1)| SYMREG_SIZE_1 }, - - { "rcx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ecx) | SYMREG_SIZE_8 }, - { "ecx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ecx) | SYMREG_SIZE_4 }, - { "cx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ecx) | SYMREG_SIZE_2 }, - { "cl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ecx) | SYMREG_SIZE_1 }, - { "ch", dbgcSymGetReg, dbgcSymSetReg, (offsetof(CPUMCTX, ecx) + 1)| SYMREG_SIZE_1 }, - - { "rdx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, rdx) | SYMREG_SIZE_8 }, - { "edx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edx) | SYMREG_SIZE_4 }, - { "dx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edx) | SYMREG_SIZE_2 }, - { "dl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edx) | SYMREG_SIZE_1 }, - { "dh", dbgcSymGetReg, dbgcSymSetReg, (offsetof(CPUMCTX, edx) + 1)| SYMREG_SIZE_1 }, - - { "rdi", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, rdi) | SYMREG_SIZE_8 }, - { "edi", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edi) | SYMREG_SIZE_4 }, - { "di", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edi) | SYMREG_SIZE_2 }, - { "dil", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edi) | SYMREG_SIZE_1 }, - - { "rsi", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, rsi) | SYMREG_SIZE_8 }, - { "esi", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esi) | SYMREG_SIZE_4 }, - { "si", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esi) | SYMREG_SIZE_2 }, - { "sil", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esi) | SYMREG_SIZE_1 }, - - { "rbp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, rbp) | SYMREG_SIZE_8 }, - { "ebp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebp) | SYMREG_SIZE_4 }, - { "bp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebp) | SYMREG_SIZE_2 }, - { "bpl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebp) | SYMREG_SIZE_1 }, - - { "rsp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, rsp) | SYMREG_SIZE_8 }, - { "esp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esp) | SYMREG_SIZE_4 }, - { "sp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esp) | SYMREG_SIZE_2 }, - { "spl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esp) | SYMREG_SIZE_1 }, - - { "r8", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r8) | SYMREG_SIZE_8 }, - { "r9", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r9) | SYMREG_SIZE_8 }, - { "r10", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r10) | SYMREG_SIZE_8 }, - { "r11", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r11) | SYMREG_SIZE_8 }, - { "r12", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r12) | SYMREG_SIZE_8 }, - { "r13", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r13) | SYMREG_SIZE_8 }, - { "r14", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r14) | SYMREG_SIZE_8 }, - { "r15", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r15) | SYMREG_SIZE_8 }, - - { "r8d", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r8) | SYMREG_SIZE_4 }, - { "r9d", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r9) | SYMREG_SIZE_4 }, - { "r10d", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r10) | SYMREG_SIZE_4 }, - { "r11d", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r11) | SYMREG_SIZE_4 }, - { "r12d", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r12) | SYMREG_SIZE_4 }, - { "r13d", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r13) | SYMREG_SIZE_4 }, - { "r14d", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r14) | SYMREG_SIZE_4 }, - { "r15d", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r15) | SYMREG_SIZE_4 }, - - { "r8w", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r8) | SYMREG_SIZE_2 }, - { "r9w", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r9) | SYMREG_SIZE_2 }, - { "r10w", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r10) | SYMREG_SIZE_2 }, - { "r11w", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r11) | SYMREG_SIZE_2 }, - { "r12w", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r12) | SYMREG_SIZE_2 }, - { "r13w", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r13) | SYMREG_SIZE_2 }, - { "r14w", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r14) | SYMREG_SIZE_2 }, - { "r15w", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r15) | SYMREG_SIZE_2 }, - - { "r8b", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r8) | SYMREG_SIZE_1 }, - { "r9b", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r9) | SYMREG_SIZE_1 }, - { "r10b", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r10) | SYMREG_SIZE_1 }, - { "r11b", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r11) | SYMREG_SIZE_1 }, - { "r12b", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r12) | SYMREG_SIZE_1 }, - { "r13b", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r13) | SYMREG_SIZE_1 }, - { "r14b", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r14) | SYMREG_SIZE_1 }, - { "r15b", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, r15) | SYMREG_SIZE_1 }, - - { "rip", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, rip) | SYMREG_SIZE_8 }, - { "eip", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eip) | SYMREG_SIZE_4 }, - { "ip", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eip) | SYMREG_SIZE_2 }, - - { "rfl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, rflags) | SYMREG_SIZE_8 }, - { "rflags", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, rflags) | SYMREG_SIZE_8 }, - { "efl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eflags) | SYMREG_SIZE_4 }, - { "eflags", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eflags) | SYMREG_SIZE_4 }, - { "fl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eflags) | SYMREG_SIZE_2 }, - { "flags", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eflags) | SYMREG_SIZE_2 }, - - { "cs", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cs) | SYMREG_SIZE_2 }, - { "ds", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ds) | SYMREG_SIZE_2 }, - { "es", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, es) | SYMREG_SIZE_2 }, - { "fs", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, fs) | SYMREG_SIZE_2 }, - { "gs", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, gs) | SYMREG_SIZE_2 }, - { "ss", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ss) | SYMREG_SIZE_2 }, - - { "cr0", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cr0) | SYMREG_SIZE_8 }, - { "cr2", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cr2) | SYMREG_SIZE_8 }, - { "cr3", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cr3) | SYMREG_SIZE_8 }, - { "cr4", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cr4) | SYMREG_SIZE_8 }, - - { "tr", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, tr) | SYMREG_SIZE_2 }, - { "ldtr", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ldtr) | SYMREG_SIZE_2 }, - - { "gdtr", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, gdtr) | SYMREG_SIZE_10 }, - { "gdtr.limit", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, gdtr.cbGdt)| SYMREG_SIZE_2 }, - { "gdtr.base", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, gdtr.pGdt)| SYMREG_SIZE_8 }, - - { "idtr", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, idtr) | SYMREG_SIZE_10 }, - { "idtr.limit", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, idtr.cbIdt)| SYMREG_SIZE_2 }, - { "idtr.base", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, idtr.pIdt)| SYMREG_SIZE_8 }, - - /* hypervisor */ - - {".eax", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eax) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER }, - {".ax", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eax) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - {".al", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eax) | SYMREG_SIZE_1 | SYMREG_FLAGS_HYPER }, - {".ah", dbgcSymGetReg, dbgcSymSetReg, (offsetof(CPUMCTX, eax) + 1)| SYMREG_SIZE_1 | SYMREG_FLAGS_HYPER }, - - {".ebx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebx) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER }, - {".bx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebx) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - {".bl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebx) | SYMREG_SIZE_1 | SYMREG_FLAGS_HYPER }, - {".bh", dbgcSymGetReg, dbgcSymSetReg, (offsetof(CPUMCTX, ebx) + 1)| SYMREG_SIZE_1 | SYMREG_FLAGS_HYPER }, - - {".ecx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ecx) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER }, - {".cx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ecx) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - {".cl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ecx) | SYMREG_SIZE_1 | SYMREG_FLAGS_HYPER }, - {".ch", dbgcSymGetReg, dbgcSymSetReg, (offsetof(CPUMCTX, ecx) + 1)| SYMREG_SIZE_1 | SYMREG_FLAGS_HYPER }, - - {".edx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edx) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER }, - {".dx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edx) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - {".dl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edx) | SYMREG_SIZE_1 | SYMREG_FLAGS_HYPER }, - {".dh", dbgcSymGetReg, dbgcSymSetReg, (offsetof(CPUMCTX, edx) + 1)| SYMREG_SIZE_1 | SYMREG_FLAGS_HYPER }, - - {".edi", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edi) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER }, - {".di", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edi) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - - {".esi", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esi) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER }, - {".si", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esi) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - - {".ebp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebp) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER }, - {".bp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebp) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - - {".esp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esp) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER }, - {".sp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esp) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - - {".eip", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eip) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER }, - {".ip", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eip) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - - {".efl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eflags) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER }, - {".eflags", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eflags) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER }, - {".fl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eflags) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - {".flags", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eflags) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - - {".cs", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cs) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - {".ds", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ds) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - {".es", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, es) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - {".fs", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, fs) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - {".gs", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, gs) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - {".ss", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ss) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - - {".cr0", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cr0) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER }, - {".cr2", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cr2) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER }, - {".cr3", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cr3) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER }, - {".cr4", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cr4) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER }, - - {".tr", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, tr) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - {".ldtr", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ldtr) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER }, - - {".gdtr", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, gdtr) | SYMREG_SIZE_10 | SYMREG_FLAGS_HYPER }, - {".gdtr.limit", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, gdtr.cbGdt)| SYMREG_SIZE_2| SYMREG_FLAGS_HYPER }, - {".gdtr.base", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, gdtr.pGdt)| SYMREG_SIZE_8 | SYMREG_FLAGS_HYPER }, - - {".idtr", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, idtr) | SYMREG_SIZE_10 | SYMREG_FLAGS_HYPER }, - {".idtr.limit", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, idtr.cbIdt)| SYMREG_SIZE_2| SYMREG_FLAGS_HYPER }, - {".idtr.base", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, idtr.pIdt)| SYMREG_SIZE_8 | SYMREG_FLAGS_HYPER }, - -}; - - - -/** - * Get builtin register symbol. - * - * The uUser is special for these symbol descriptors. See the SYMREG_* \#defines. - * - * @returns 0 on success. - * @returns VBox evaluation / parsing error code on failure. - * The caller does the bitching. - * @param pSymDesc Pointer to the symbol descriptor. - * @param pCmdHlp Pointer to the command callback structure. - * @param enmType The result type. - * @param pResult Where to store the result. - */ -static DECLCALLBACK(int) dbgcSymGetReg(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, DBGCVARTYPE enmType, PDBGCVAR pResult) -{ - LogFlow(("dbgcSymSetReg: pSymDesc->pszName=%d\n", pSymDesc->pszName)); - - /* - * pVM is required. - */ - PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp); - Assert(pDbgc->pVM); - - /* - * Get the right CPU context. - */ - PVMCPU pVCpu = VMMGetCpuById(pDbgc->pVM, pDbgc->idCpu); - PCPUMCTX pCtx; - int rc; - if (!(pSymDesc->uUser & SYMREG_FLAGS_HYPER)) - { - pCtx = CPUMQueryGuestCtxPtr(pVCpu); - rc = VINF_SUCCESS; - } - else - rc = CPUMQueryHyperCtxPtr(pVCpu, &pCtx); - if (RT_FAILURE(rc)) - return rc; - - /* - * Get the value. - */ - void *pvValue = (char *)pCtx + SYMREG_OFFSET(pSymDesc->uUser); - uint64_t u64; - switch (SYMREG_SIZE(pSymDesc->uUser)) - { - case 1: u64 = *(uint8_t *)pvValue; break; - case 2: u64 = *(uint16_t *)pvValue; break; - case 4: u64 = *(uint32_t *)pvValue; break; - case 6: u64 = *(uint32_t *)pvValue | ((uint64_t)*(uint16_t *)((char *)pvValue + sizeof(uint32_t)) << 32); break; - case 8: u64 = *(uint64_t *)pvValue; break; - default: - return VERR_PARSE_NOT_IMPLEMENTED; - } - - /* - * Construct the desired result. - */ - if (enmType == DBGCVAR_TYPE_ANY) - enmType = DBGCVAR_TYPE_NUMBER; - pResult->pDesc = NULL; - pResult->pNext = NULL; - pResult->enmType = enmType; - pResult->enmRangeType = DBGCVAR_RANGE_NONE; - pResult->u64Range = 0; - - switch (enmType) - { - case DBGCVAR_TYPE_GC_FLAT: - pResult->u.GCFlat = (RTGCPTR)u64; - break; - - case DBGCVAR_TYPE_GC_FAR: - switch (SYMREG_SIZE(pSymDesc->uUser)) - { - case 4: - if (!(pSymDesc->uUser & SYMREG_FLAGS_HIGH_SEL)) - { - pResult->u.GCFar.off = (uint16_t)u64; - pResult->u.GCFar.sel = (uint16_t)(u64 >> 16); - } - else - { - pResult->u.GCFar.sel = (uint16_t)u64; - pResult->u.GCFar.off = (uint16_t)(u64 >> 16); - } - break; - case 6: - if (!(pSymDesc->uUser & SYMREG_FLAGS_HIGH_SEL)) - { - pResult->u.GCFar.off = (uint32_t)u64; - pResult->u.GCFar.sel = (uint16_t)(u64 >> 32); - } - else - { - pResult->u.GCFar.sel = (uint32_t)u64; - pResult->u.GCFar.off = (uint16_t)(u64 >> 32); - } - break; - - default: - return VERR_PARSE_BAD_RESULT_TYPE; - } - break; - - case DBGCVAR_TYPE_GC_PHYS: - pResult->u.GCPhys = (RTGCPHYS)u64; - break; - - case DBGCVAR_TYPE_HC_FLAT: - pResult->u.pvHCFlat = (void *)(uintptr_t)u64; - break; - - case DBGCVAR_TYPE_HC_FAR: - switch (SYMREG_SIZE(pSymDesc->uUser)) - { - case 4: - if (!(pSymDesc->uUser & SYMREG_FLAGS_HIGH_SEL)) - { - pResult->u.HCFar.off = (uint16_t)u64; - pResult->u.HCFar.sel = (uint16_t)(u64 >> 16); - } - else - { - pResult->u.HCFar.sel = (uint16_t)u64; - pResult->u.HCFar.off = (uint16_t)(u64 >> 16); - } - break; - case 6: - if (!(pSymDesc->uUser & SYMREG_FLAGS_HIGH_SEL)) - { - pResult->u.HCFar.off = (uint32_t)u64; - pResult->u.HCFar.sel = (uint16_t)(u64 >> 32); - } - else - { - pResult->u.HCFar.sel = (uint32_t)u64; - pResult->u.HCFar.off = (uint16_t)(u64 >> 32); - } - break; - - default: - return VERR_PARSE_BAD_RESULT_TYPE; - } - break; - - case DBGCVAR_TYPE_HC_PHYS: - pResult->u.GCPhys = (RTGCPHYS)u64; - break; - - case DBGCVAR_TYPE_NUMBER: - pResult->u.u64Number = u64; - break; - - case DBGCVAR_TYPE_STRING: - case DBGCVAR_TYPE_UNKNOWN: - default: - return VERR_PARSE_BAD_RESULT_TYPE; - - } - - return 0; -} - - -/** - * Set builtin register symbol. - * - * The uUser is special for these symbol descriptors. See the SYMREG_* #defines. - * - * @returns 0 on success. - * @returns VBox evaluation / parsing error code on failure. - * The caller does the bitching. - * @param pSymDesc Pointer to the symbol descriptor. - * @param pCmdHlp Pointer to the command callback structure. - * @param pValue The value to assign the symbol. - */ -static DECLCALLBACK(int) dbgcSymSetReg(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, PCDBGCVAR pValue) -{ - LogFlow(("dbgcSymSetReg: pSymDesc->pszName=%d\n", pSymDesc->pszName)); - - /* - * pVM is required. - */ - PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp); - Assert(pDbgc->pVM); - - /* - * Get the right CPU context. - */ - PVMCPU pVCpu = VMMGetCpuById(pDbgc->pVM, pDbgc->idCpu); - PCPUMCTX pCtx; - int rc; - if (!(pSymDesc->uUser & SYMREG_FLAGS_HYPER)) - { - pCtx = CPUMQueryGuestCtxPtr(pVCpu); - rc = VINF_SUCCESS; - } - else - rc = CPUMQueryHyperCtxPtr(pVCpu, &pCtx); - if (RT_FAILURE(rc)) - return rc; - - /* - * Check the new value. - */ - if (pValue->enmType != DBGCVAR_TYPE_NUMBER) - return VERR_PARSE_ARGUMENT_TYPE_MISMATCH; - - /* - * Set the value. - */ - void *pvValue = (char *)pCtx + SYMREG_OFFSET(pSymDesc->uUser); - switch (SYMREG_SIZE(pSymDesc->uUser)) - { - case 1: - *(uint8_t *)pvValue = (uint8_t)pValue->u.u64Number; - break; - case 2: - *(uint16_t *)pvValue = (uint16_t)pValue->u.u64Number; - break; - case 4: - *(uint32_t *)pvValue = (uint32_t)pValue->u.u64Number; - break; - case 6: - *(uint32_t *)pvValue = (uint32_t)pValue->u.u64Number; - ((uint16_t *)pvValue)[3] = (uint16_t)(pValue->u.u64Number >> 32); - break; - case 8: - *(uint64_t *)pvValue = pValue->u.u64Number; - break; - default: - return VERR_PARSE_NOT_IMPLEMENTED; - } - - return VINF_SUCCESS; -} - /** * Finds a builtin symbol. + * * @returns Pointer to symbol descriptor on success. * @returns NULL on failure. * @param pDbgc The debug console instance. @@ -521,10 +33,6 @@ static DECLCALLBACK(int) dbgcSymSetReg(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, */ PCDBGCSYM dbgcLookupRegisterSymbol(PDBGC pDbgc, const char *pszSymbol) { - for (unsigned iSym = 0; iSym < RT_ELEMENTS(g_aSyms); iSym++) - if (!strcmp(pszSymbol, g_aSyms[iSym].pszName)) - return &g_aSyms[iSym]; - /** @todo externally registered symbols. */ NOREF(pDbgc); return NULL; |