CPUMDbg.cpp revision 6ca8a1595bddf29de7894958ae74c255eb2693be
f1c89cb4f5c72c54bb67dc48cd6f2b332eab9e92Automatic Updater * CPUM - CPU Monitor / Manager, Debugger & Debugging APIs.
f1c89cb4f5c72c54bb67dc48cd6f2b332eab9e92Automatic Updater * Copyright (C) 2010 Oracle Corporation
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt * This file is part of VirtualBox Open Source Edition (OSE), as
83a28ca274521e15086fc39febde507bcc4e145eMark Andrews * available from http://www.virtualbox.org. This file is free software;
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrews * you can redistribute it and/or modify it under the terms of the GNU
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt * General Public License (GPL) as published by the Free Software
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrews * Foundation, in version 2 as it comes in the "COPYING" file of the
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Hunt * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrews/*******************************************************************************
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Hunt* Header Files *
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Hunt*******************************************************************************/
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntstatic DECLCALLBACK(int) dbgfR3RegSet_seg(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask)
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Huntstatic DECLCALLBACK(int) dbgfR3RegGet_crX(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue)
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntstatic DECLCALLBACK(int) dbgfR3RegSet_crX(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask)
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntstatic DECLCALLBACK(int) dbgfR3RegGet_drX(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue)
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrewsstatic DECLCALLBACK(int) dbgfR3RegSet_drX(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask)
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Huntstatic DECLCALLBACK(int) dbgfR3RegGet_msr(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue)
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntstatic DECLCALLBACK(int) dbgfR3RegSet_msr(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask)
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntstatic DECLCALLBACK(int) dbgfR3RegGet_gdtr(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue)
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Huntstatic DECLCALLBACK(int) dbgfR3RegSet_gdtr(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask)
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntstatic DECLCALLBACK(int) dbgfR3RegGet_idtr(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue)
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrewsstatic DECLCALLBACK(int) dbgfR3RegSet_idtr(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask)
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrewsstatic DECLCALLBACK(int) dbgfR3RegGet_ftw(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue)
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Huntstatic DECLCALLBACK(int) dbgfR3RegSet_ftw(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask)
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Huntstatic DECLCALLBACK(int) dbgfR3RegGet_stN(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue)
79ce3a9e82384cc31fd6b86be8f3d1474fcfd9f4Evan Huntstatic DECLCALLBACK(int) dbgfR3RegSet_stN(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask)
79ce3a9e82384cc31fd6b86be8f3d1474fcfd9f4Evan Hunt * Set up aliases.
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrews#define DBGFREGALIAS_STD(Name, psz32, psz16, psz8) \
c6f4972c745f8903aba6dcca41f17a44c473db66Mark Andrews static DBGFREGALIAS const g_aDbgfRegAliases_##Name[] = \
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark AndrewsDBGFREGALIAS_STD(rflags, "eflags", "flags", NULL);
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Huntstatic DBGFREGALIAS const g_aDbgfRegAliases_fpuip[] =
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Huntstatic DBGFREGALIAS const g_aDbgfRegAliases_fpudp[] =
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Huntstatic DBGFREGALIAS const g_aDbgfRegAliases_cr0[] =
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Hunt * Sub fields.
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Hunt/** Sub-fields for the (hidden) segment attribute register. */
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Huntstatic DBGFREGSUBFIELD const g_aDbgfRegFields_seg[] =
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Hunt { NULL, 0, 0, 0 }
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Hunt/** Sub-fields for the flags register. */
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Huntstatic DBGFREGSUBFIELD const g_aDbgfRegFields_rflags[] =
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Hunt { NULL, 0, 0, 0 }
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Hunt/** Sub-fields for the FPU control word register. */
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Huntstatic DBGFREGSUBFIELD const g_aDbgfRegFields_fcw[] =
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt { NULL, 0, 0, 0 }
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrews/** Sub-fields for the FPU status word register. */
c6f4972c745f8903aba6dcca41f17a44c473db66Mark Andrewsstatic DBGFREGSUBFIELD const g_aDbgfRegFields_fsw[] =
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Hunt { NULL, 0, 0, 0 }
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrews/** Sub-fields for the FPU tag word register. */
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntstatic DBGFREGSUBFIELD const g_aDbgfRegFields_ftw[] =
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Hunt { NULL, 0, 0, 0 }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt/** Sub-fields for the Multimedia Extensions Control and Status Register. */
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrewsstatic DBGFREGSUBFIELD const g_aDbgfRegFields_mxcsr[] =
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt { NULL, 0, 0, 0 }
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Hunt/** Sub-fields for the FPU tag word register. */
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Huntstatic DBGFREGSUBFIELD const g_aDbgfRegFields_stN[] =
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Hunt { NULL, 0, 0, 0 }
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrews/** Sub-fields for the MMX registers. */
0b24b2d3c423560a0a4cd9a4476b9a2dcafb7ea3Evan Huntstatic DBGFREGSUBFIELD const g_aDbgfRegFields_mmN[] =
{ NULL, 0, 0, 0 }
{ NULL, 0, 0, 0 }
{ NULL, 0, 0, 0 }
{ NULL, 0, 0, 0 }
{ NULL, 0, 0, 0 }
{ NULL, 0, 0, 0 }
{ NULL, 0, 0, 0 }
{ NULL, 0, 0, 0 }
{ NULL, 0, 0, 0 }
{ NULL, 0, 0, 0 }
{ NULL, 0, 0, 0 }
{ NULL, 0, 0, 0 }
{ NULL, 0, 0, 0 }
{ NULL, 0, 0, 0 }
{ NULL, 0, 0, 0 }
{ #LName, DBGFREG_##UName, DBGFREGVALTYPE_U64, RT_OFFSETOF(CPUMCTX, LName), NULL, NULL, g_aDbgfRegAliases_##LName, NULL }
{ #LName, DBGFREG_##UName, DBGFREGVALTYPE_U16, RT_OFFSETOF(CPUMCTX, LName), NULL, dbgfR3RegSet_seg, NULL, NULL }, \
{ #LName "_attr", DBGFREG_##UName##_ATTR, DBGFREGVALTYPE_U32, RT_OFFSETOF(CPUMCTX, LName##Hid.Attr.u), NULL, NULL, NULL, g_aDbgfRegFields_seg }, \
{ #LName "_base", DBGFREG_##UName##_ATTR, DBGFREGVALTYPE_U64, RT_OFFSETOF(CPUMCTX, LName##Hid.u64Base), NULL, NULL, NULL, NULL }, \
{ #LName "_lim", DBGFREG_##UName##_ATTR, DBGFREGVALTYPE_U32, RT_OFFSETOF(CPUMCTX, LName##Hid.u32Limit), NULL, NULL, NULL, NULL }
{ "rflags", DBGFREG_RFLAGS, DBGFREGVALTYPE_U64, RT_OFFSETOF(CPUMCTX, rflags), NULL, NULL, g_aDbgfRegAliases_rflags, g_aDbgfRegFields_rflags },
{ "fcw", DBGFREG_FCW, DBGFREGVALTYPE_U16, RT_OFFSETOF(CPUMCTX, fpu.FCW), NULL, NULL, NULL, g_aDbgfRegFields_fcw },
{ "fsw", DBGFREG_FSW, DBGFREGVALTYPE_U16, RT_OFFSETOF(CPUMCTX, fpu.FSW), NULL, NULL, NULL, g_aDbgfRegFields_fsw },
{ "ftw", DBGFREG_FTW, DBGFREGVALTYPE_U16, RT_OFFSETOF(CPUMCTX, fpu.FTW), dbgfR3RegGet_ftw, dbgfR3RegSet_ftw, NULL, g_aDbgfRegFields_ftw },
{ "fpuip", DBGFREG_FPUIP, DBGFREGVALTYPE_U32, RT_OFFSETOF(CPUMCTX, fpu.FPUIP), NULL, NULL, g_aDbgfRegAliases_fpuip, NULL },
{ "fpucs", DBGFREG_FPUCS, DBGFREGVALTYPE_U16, RT_OFFSETOF(CPUMCTX, fpu.CS), NULL, NULL, NULL, NULL },
{ "fpudp", DBGFREG_FPUDP, DBGFREGVALTYPE_U32, RT_OFFSETOF(CPUMCTX, fpu.FPUDP), NULL, NULL, g_aDbgfRegAliases_fpudp, NULL },
{ "fpuds", DBGFREG_FPUDS, DBGFREGVALTYPE_U16, RT_OFFSETOF(CPUMCTX, fpu.DS), NULL, NULL, NULL, NULL },
{ "mxcsr", DBGFREG_MXCSR, DBGFREGVALTYPE_U32, RT_OFFSETOF(CPUMCTX, fpu.MXCSR), NULL, NULL, NULL, g_aDbgfRegFields_mxcsr },
{ "mxcsr_mask", DBGFREG_MXCSR_MASK, DBGFREGVALTYPE_U32, RT_OFFSETOF(CPUMCTX, fpu.MXCSR_MASK), NULL, NULL, NULL, g_aDbgfRegFields_mxcsr },
#define DBGFREGDESC_ST(n) \
{ "st" #n, DBGFREG_ST##n, DBGFREGVALTYPE_80, ~(size_t)0, dbgfR3RegGet_stN, dbgfR3RegSet_stN, NULL, g_aDbgfRegFields_stN }
DBGFREGDESC_ST(0),
#define DBGFREGDESC_MM(n) \
{ "mm" #n, DBGFREG_MM##n, DBGFREGVALTYPE_U64, RT_OFFSETOF(CPUMCTX, fpu.aRegs[n].mmx), NULL, NULL, NULL, g_aDbgfRegFields_mmN }
DBGFREGDESC_MM(0),
#define DBGFREGDESC_XMM(n) \
{ "xmm" #n, DBGFREG_XMM##n, DBGFREGVALTYPE_U128, RT_OFFSETOF(CPUMCTX, fpu.aXMM[n].xmm), NULL, NULL, NULL, g_aDbgfRegFields_xmmN }
DBGFREGDESC_XMM(0),
{ "gdtr_base", DBGFREG_GDTR_BASE, DBGFREGVALTYPE_U64, RT_OFFSETOF(CPUMCTX, gdtr.pGdt), NULL, NULL, NULL, NULL },
{ "gdtr_limit", DBGFREG_GDTR_LIMIT, DBGFREGVALTYPE_U16, RT_OFFSETOF(CPUMCTX, gdtr.cbGdt), NULL, NULL, NULL, NULL },
{ "idtr_base", DBGFREG_IDTR_BASE, DBGFREGVALTYPE_U64, RT_OFFSETOF(CPUMCTX, idtr.pIdt), NULL, NULL, NULL, NULL },
{ "idtr_limit", DBGFREG_IDTR_LIMIT, DBGFREGVALTYPE_U16, RT_OFFSETOF(CPUMCTX, idtr.cbIdt), NULL, NULL, NULL, NULL },
{ "cr0", DBGFREG_CR0, DBGFREGVALTYPE_U32, 0, dbgfR3RegGet_crX, dbgfR3RegSet_crX, g_aDbgfRegAliases_cr0, g_aDbgfRegFields_cr0 },
{ "cr3", DBGFREG_CR3, DBGFREGVALTYPE_U64, 3, dbgfR3RegGet_crX, dbgfR3RegSet_crX, NULL, g_aDbgfRegFields_cr3 },
{ "cr4", DBGFREG_CR4, DBGFREGVALTYPE_U32, 4, dbgfR3RegGet_crX, dbgfR3RegSet_crX, NULL, g_aDbgfRegFields_cr4 },
{ "dr6", DBGFREG_DR6, DBGFREGVALTYPE_U32, 6, dbgfR3RegGet_drX, dbgfR3RegSet_drX, NULL, g_aDbgfRegFields_dr6 },
{ "dr7", DBGFREG_DR7, DBGFREGVALTYPE_U32, 7, dbgfR3RegGet_drX, dbgfR3RegSet_drX, NULL, g_aDbgfRegFields_dr7 },
{ "apic_base", DBGFREG_MSR_IA32_APICBASE, DBGFREGVALTYPE_U32, MSR_IA32_APICBASE, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, g_aDbgfRegFields_apic_base },
{ "pat", DBGFREG_MSR_IA32_CR_PAT, DBGFREGVALTYPE_U64, MSR_IA32_CR_PAT, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, g_aDbgfRegFields_cr_pat },
{ "perf_status", DBGFREG_MSR_IA32_PERF_STATUS, DBGFREGVALTYPE_U64, MSR_IA32_PERF_STATUS, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, g_aDbgfRegFields_perf_status },
{ "sysenter_cs", DBGFREG_MSR_IA32_SYSENTER_CS, DBGFREGVALTYPE_U16, MSR_IA32_SYSENTER_CS, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, NULL },
{ "sysenter_eip", DBGFREG_MSR_IA32_SYSENTER_EIP, DBGFREGVALTYPE_U32, MSR_IA32_SYSENTER_EIP, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, NULL },
{ "sysenter_esp", DBGFREG_MSR_IA32_SYSENTER_ESP, DBGFREGVALTYPE_U32, MSR_IA32_SYSENTER_ESP, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, NULL },
{ "tsc", DBGFREG_MSR_IA32_TSC, DBGFREGVALTYPE_U32, MSR_IA32_TSC, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, NULL },
{ "efer", DBGFREG_MSR_K6_EFER, DBGFREGVALTYPE_U32, MSR_K6_EFER, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, g_aDbgfRegFields_efer },
{ "star", DBGFREG_MSR_K6_STAR, DBGFREGVALTYPE_U64, MSR_K6_STAR, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, g_aDbgfRegFields_star },
{ "cstar", DBGFREG_MSR_K8_CSTAR, DBGFREGVALTYPE_U64, MSR_K8_CSTAR, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, g_aDbgfRegFields_cstar },
{ "msr_fs_base", DBGFREG_MSR_K8_FS_BASE, DBGFREGVALTYPE_U64, MSR_K8_FS_BASE, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, NULL },
{ "msr_gs_base", DBGFREG_MSR_K8_GS_BASE, DBGFREGVALTYPE_U64, MSR_K8_GS_BASE, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, NULL },
{ "krnl_gs_base", DBGFREG_MSR_K8_KERNEL_GS_BASE, DBGFREGVALTYPE_U64, MSR_K8_KERNEL_GS_BASE, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, NULL },
{ "lstar", DBGFREG_MSR_K8_LSTAR, DBGFREGVALTYPE_U64, MSR_K8_LSTAR, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, g_aDbgfRegFields_lstar },
{ "tsc_aux", DBGFREG_MSR_K8_TSC_AUX, DBGFREGVALTYPE_U64, MSR_K8_TSC_AUX, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, NULL },
{ "gdtr", DBGFREG_GDTR, DBGFREGVALTYPE_DTR, ~(size_t)0, dbgfR3RegGet_gdtr, dbgfR3RegSet_gdtr, NULL, NULL },
{ "idtr", DBGFREG_IDTR, DBGFREGVALTYPE_DTR, ~(size_t)0, dbgfR3RegGet_idtr, dbgfR3RegSet_idtr, NULL, NULL },