Changeset 35468 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Jan 10, 2011 5:16:11 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 69339
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/Makefile.kmk
r35380 r35468 78 78 VMMR3/CFGM.cpp \ 79 79 VMMR3/CPUM.cpp \ 80 VMMR3/CPUMDbg.cpp \ 80 81 VMMR3/DBGF.cpp \ 81 82 VMMR3/DBGFAddr.cpp \ -
trunk/src/VBox/VMM/VMMR3/CPUMDbg.cpp
r35410 r35468 5 5 6 6 /* 7 * Copyright (C) 2010 Oracle Corporation7 * Copyright (C) 2010-2011 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 21 21 *******************************************************************************/ 22 22 #define LOG_GROUP LOG_GROUP_DBGF 23 #include <VBox/vmm/cpum.h> 23 24 #include <VBox/vmm/dbgf.h> 24 #include " DBGFInternal.h"25 #include "CPUMInternal.h" 25 26 #include <VBox/vmm/vm.h> 26 27 #include <VBox/param.h> 27 28 #include <VBox/err.h> 28 29 #include <VBox/log.h> 29 30 31 static DECLCALLBACK(int) dbgfR3RegSet_seg(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask) 32 { 33 return VERR_NOT_IMPLEMENTED; 34 } 35 36 static DECLCALLBACK(int) dbgfR3RegGet_crX(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue) 37 { 38 return VERR_NOT_IMPLEMENTED; 39 } 40 41 static DECLCALLBACK(int) dbgfR3RegSet_crX(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask) 42 { 43 return VERR_NOT_IMPLEMENTED; 44 } 45 46 static DECLCALLBACK(int) dbgfR3RegGet_drX(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue) 47 { 48 return VERR_NOT_IMPLEMENTED; 49 } 50 51 static DECLCALLBACK(int) dbgfR3RegSet_drX(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask) 52 { 53 return VERR_NOT_IMPLEMENTED; 54 } 55 56 static DECLCALLBACK(int) dbgfR3RegGet_msr(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue) 57 { 58 return VERR_NOT_IMPLEMENTED; 59 } 60 61 static DECLCALLBACK(int) dbgfR3RegSet_msr(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask) 62 { 63 return VERR_NOT_IMPLEMENTED; 64 } 65 66 static DECLCALLBACK(int) dbgfR3RegGet_gdtr(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue) 67 { 68 return VERR_NOT_IMPLEMENTED; 69 } 70 71 static DECLCALLBACK(int) dbgfR3RegSet_gdtr(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask) 72 { 73 return VERR_NOT_IMPLEMENTED; 74 } 75 76 static DECLCALLBACK(int) dbgfR3RegGet_idtr(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue) 77 { 78 return VERR_NOT_IMPLEMENTED; 79 } 80 81 static DECLCALLBACK(int) dbgfR3RegSet_idtr(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask) 82 { 83 return VERR_NOT_IMPLEMENTED; 84 } 85 86 static DECLCALLBACK(int) dbgfR3RegGet_ftw(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue) 87 { 88 return VERR_NOT_IMPLEMENTED; 89 } 90 91 static DECLCALLBACK(int) dbgfR3RegSet_ftw(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask) 92 { 93 return VERR_NOT_IMPLEMENTED; 94 } 95 96 static DECLCALLBACK(int) dbgfR3RegGet_stN(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue) 97 { 98 return VERR_NOT_IMPLEMENTED; 99 } 100 101 static DECLCALLBACK(int) dbgfR3RegSet_stN(PVMCPU pVCpu, struct DBGFREGDESC const *pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask) 102 { 103 return VERR_NOT_IMPLEMENTED; 104 } 105 30 #include <iprt/thread.h> 31 32 33 #if 0 34 /** 35 * @interface_method_impl{DBGFREGDESC, pfnGet} 36 */ 37 static DECLCALLBACK(int) cpumR3RegGet_Generic(void *pvUser, PCDBGFREGDESC pDesc, PDBGFREGVAL pValue) 38 { 39 PVMCPU pVCpu = (PVMCPU)pvUser; 40 void const *pv = (uint8_t const *)&pVCpu->cpum.s.Guest + pDesc->offRegister; 41 42 VMCPU_ASSERT_EMT(pVCpu); 43 44 switch (pDesc->enmType) 45 { 46 case DBGFREGVALTYPE_U8: pValue->u8 = *(uint8_t const *)pv; return VINF_SUCCESS; 47 case DBGFREGVALTYPE_U16: pValue->u16 = *(uint16_t const *)pv; return VINF_SUCCESS; 48 case DBGFREGVALTYPE_U32: pValue->u32 = *(uint32_t const *)pv; return VINF_SUCCESS; 49 case DBGFREGVALTYPE_U64: pValue->u64 = *(uint64_t const *)pv; return VINF_SUCCESS; 50 case DBGFREGVALTYPE_U128: pValue->u128 = *(PCRTUINT128U )pv; return VINF_SUCCESS; 51 default: 52 AssertMsgFailedReturn(("%d %s\n", pDesc->enmType, pDesc->pszName), VERR_INTERNAL_ERROR_3); 53 } 54 } 55 56 57 /** 58 * @interface_method_impl{DBGFREGDESC, pfnGet} 59 */ 60 static DECLCALLBACK(int) cpumR3RegSet_Generic(void *pvUser, PCDBGFREGDESC pDesc, PCDBGFREGVAL pValue, PCDBGFREGVAL pfMask) 61 { 62 PVMCPU pVCpu = (PVMCPU)pvUser; 63 void *pv = (uint8_t *)&pVCpu->cpum.s.Guest + pDesc->offRegister; 64 65 VMCPU_ASSERT_EMT(pVCpu); 66 67 switch (pDesc->enmType) 68 { 69 case DBGFREGVALTYPE_U8: 70 *(uint8_t *)pv &= ~pfMask->u8; 71 *(uint8_t *)pv |= pValue->u8 & pfMask->u8; 72 return VINF_SUCCESS; 73 74 case DBGFREGVALTYPE_U16: 75 *(uint16_t *)pv &= ~pfMask->u16; 76 *(uint16_t *)pv |= pValue->u16 & pfMask->u16; 77 return VINF_SUCCESS; 78 79 case DBGFREGVALTYPE_U32: 80 *(uint32_t *)pv &= ~pfMask->u32; 81 *(uint32_t *)pv |= pValue->u32 & pfMask->u32; 82 return VINF_SUCCESS; 83 84 case DBGFREGVALTYPE_U64: 85 *(uint64_t *)pv &= ~pfMask->u64; 86 *(uint64_t *)pv |= pValue->u64 & pfMask->u64; 87 return VINF_SUCCESS; 88 89 case DBGFREGVALTYPE_U128: 90 ((PRTUINT128U)pv)->s.Hi &= ~pfMask->u128.s.Hi; 91 ((PRTUINT128U)pv)->s.Lo &= ~pfMask->u128.s.Lo; 92 ((PRTUINT128U)pv)->s.Hi |= pValue->u128.s.Hi & pfMask->u128.s.Hi; 93 ((PRTUINT128U)pv)->s.Lo |= pValue->u128.s.Lo & pfMask->u128.s.Lo; 94 return VINF_SUCCESS; 95 96 default: 97 AssertMsgFailedReturn(("%d %s\n", pDesc->enmType, pDesc->pszName), VERR_INTERNAL_ERROR_3); 98 } 99 } 100 101 102 /** 103 * @interface_method_impl{DBGFREGDESC, pfnGet} 104 */ 105 static DECLCALLBACK(int) cpumR3RegSet_seg(void *pvUser, PCDBGFREGDESC pDesc, PCDBGFREGVAL pValue, PCDBGFREGVAL pfMask) 106 { 107 /** @todo perform a selector load, updating hidden selectors and stuff. */ 108 return VERR_NOT_IMPLEMENTED; 109 } 110 111 112 static DECLCALLBACK(int) cpumR3RegGet_crX(PVMCPU pVCpu, PCDBGFREGDESC pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue) 113 { 114 return VERR_NOT_IMPLEMENTED; 115 } 116 117 static DECLCALLBACK(int) cpumR3RegSet_crX(PVMCPU pVCpu, PCDBGFREGDESC pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask) 118 { 119 return VERR_NOT_IMPLEMENTED; 120 } 121 122 static DECLCALLBACK(int) cpumR3RegGet_drX(PVMCPU pVCpu, PCDBGFREGDESC pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue) 123 { 124 return VERR_NOT_IMPLEMENTED; 125 } 126 127 static DECLCALLBACK(int) cpumR3RegSet_drX(PVMCPU pVCpu, PCDBGFREGDESC pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask) 128 { 129 return VERR_NOT_IMPLEMENTED; 130 } 131 132 static DECLCALLBACK(int) cpumR3RegGet_msr(PVMCPU pVCpu, PCDBGFREGDESC pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue) 133 { 134 return VERR_NOT_IMPLEMENTED; 135 } 136 137 static DECLCALLBACK(int) cpumR3RegSet_msr(PVMCPU pVCpu, PCDBGFREGDESC pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask) 138 { 139 return VERR_NOT_IMPLEMENTED; 140 } 141 142 static DECLCALLBACK(int) cpumR3RegGet_gdtr(PVMCPU pVCpu, PCDBGFREGDESC pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue) 143 { 144 return VERR_NOT_IMPLEMENTED; 145 } 146 147 static DECLCALLBACK(int) cpumR3RegSet_gdtr(PVMCPU pVCpu, PCDBGFREGDESC pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask) 148 { 149 return VERR_NOT_IMPLEMENTED; 150 } 151 152 static DECLCALLBACK(int) cpumR3RegGet_idtr(PVMCPU pVCpu, PCDBGFREGDESC pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue) 153 { 154 return VERR_NOT_IMPLEMENTED; 155 } 156 157 static DECLCALLBACK(int) cpumR3RegSet_idtr(PVMCPU pVCpu, PCDBGFREGDESC pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask) 158 { 159 return VERR_NOT_IMPLEMENTED; 160 } 161 162 static DECLCALLBACK(int) cpumR3RegGet_ftw(PVMCPU pVCpu, PCDBGFREGDESC pDesc, PCCPUMCTX pCtx, PRTUINT128U puValue) 163 { 164 return VERR_NOT_IMPLEMENTED; 165 } 166 167 static DECLCALLBACK(int) cpumR3RegSet_ftw(PVMCPU pVCpu, PCDBGFREGDESC pDesc, PCPUMCTX pCtx, RTUINT128U uValue, RTUINT128U fMask) 168 { 169 return VERR_NOT_IMPLEMENTED; 170 } 171 172 /** 173 * @interface_method_impl{DBGFREGDESC, pfnGet} 174 */ 175 static DECLCALLBACK(int) cpumR3RegGet_stN(void *pvUser, PCDBGFREGDESC pDesc, PCDBGFREGVAL pValue, PCDBGFREGVAL pfMask) 176 { 177 return VERR_NOT_IMPLEMENTED; 178 } 179 180 /** 181 * @interface_method_impl{DBGFREGDESC, pfnGet} 182 */ 183 static DECLCALLBACK(int) cpumR3RegSet_stN(void *pvUser, PCDBGFREGDESC pDesc, PCDBGFREGVAL pValue, PCDBGFREGVAL pfMask) 184 { 185 return VERR_NOT_IMPLEMENTED; 186 } 106 187 107 188 … … 109 190 * Set up aliases. 110 191 */ 111 #define DBGFREGALIAS_STD(Name, psz32, psz16, psz8) \112 static DBGFREGALIAS const g_a DbgfRegAliases_##Name[] = \192 #define CPUMREGALIAS_STD(Name, psz32, psz16, psz8) \ 193 static DBGFREGALIAS const g_aCpumRegAliases_##Name[] = \ 113 194 { \ 114 { psz32, DBGFREGVALTYPE_U32 }, \115 { psz16, DBGFREGVALTYPE_U16 }, \116 { psz8, DBGFREGVALTYPE_U8 }, \117 { NULL, DBGFREGVALTYPE_INVALID } \195 { psz32, DBGFREGVALTYPE_U32 }, \ 196 { psz16, DBGFREGVALTYPE_U16 }, \ 197 { psz8, DBGFREGVALTYPE_U8 }, \ 198 { NULL, DBGFREGVALTYPE_INVALID } \ 118 199 } 119 DBGFREGALIAS_STD(rax, "eax", "ax", "al");120 DBGFREGALIAS_STD(rcx, "ecx", "cx", "cl");121 DBGFREGALIAS_STD(rdx, "edx", "dx", "dl");122 DBGFREGALIAS_STD(rbx, "ebx", "bx", "bl");123 DBGFREGALIAS_STD(rsp, "esp", "sp", NULL);124 DBGFREGALIAS_STD(rbp, "ebp", "bp", NULL);125 DBGFREGALIAS_STD(rsi, "esi", "si", "sil");126 DBGFREGALIAS_STD(rdi, "edi", "di", "dil");127 DBGFREGALIAS_STD(r8, "r8d", "r8w", "r8b");128 DBGFREGALIAS_STD(r9, "r9d", "r9w", "r9b");129 DBGFREGALIAS_STD(r10, "r10d", "r10w", "r10b");130 DBGFREGALIAS_STD(r11, "r11d", "r11w", "r11b");131 DBGFREGALIAS_STD(r12, "r12d", "r12w", "r12b");132 DBGFREGALIAS_STD(r13, "r13d", "r13w", "r13b");133 DBGFREGALIAS_STD(r14, "r14d", "r14w", "r14b");134 DBGFREGALIAS_STD(r15, "r15d", "r15w", "r15b");135 DBGFREGALIAS_STD(rip, "eip", "ip", NULL);136 DBGFREGALIAS_STD(rflags, "eflags", "flags", NULL);137 #undef DBGFREGALIAS_STD138 139 static DBGFREGALIAS const g_a DbgfRegAliases_fpuip[] =200 CPUMREGALIAS_STD(rax, "eax", "ax", "al"); 201 CPUMREGALIAS_STD(rcx, "ecx", "cx", "cl"); 202 CPUMREGALIAS_STD(rdx, "edx", "dx", "dl"); 203 CPUMREGALIAS_STD(rbx, "ebx", "bx", "bl"); 204 CPUMREGALIAS_STD(rsp, "esp", "sp", NULL); 205 CPUMREGALIAS_STD(rbp, "ebp", "bp", NULL); 206 CPUMREGALIAS_STD(rsi, "esi", "si", "sil"); 207 CPUMREGALIAS_STD(rdi, "edi", "di", "dil"); 208 CPUMREGALIAS_STD(r8, "r8d", "r8w", "r8b"); 209 CPUMREGALIAS_STD(r9, "r9d", "r9w", "r9b"); 210 CPUMREGALIAS_STD(r10, "r10d", "r10w", "r10b"); 211 CPUMREGALIAS_STD(r11, "r11d", "r11w", "r11b"); 212 CPUMREGALIAS_STD(r12, "r12d", "r12w", "r12b"); 213 CPUMREGALIAS_STD(r13, "r13d", "r13w", "r13b"); 214 CPUMREGALIAS_STD(r14, "r14d", "r14w", "r14b"); 215 CPUMREGALIAS_STD(r15, "r15d", "r15w", "r15b"); 216 CPUMREGALIAS_STD(rip, "eip", "ip", NULL); 217 CPUMREGALIAS_STD(rflags, "eflags", "flags", NULL); 218 #undef CPUMREGALIAS_STD 219 220 static DBGFREGALIAS const g_aCpumRegAliases_fpuip[] = 140 221 { 141 222 { "fpuip", DBGFREGVALTYPE_U16 }, … … 143 224 }; 144 225 145 static DBGFREGALIAS const g_a DbgfRegAliases_fpudp[] =226 static DBGFREGALIAS const g_aCpumRegAliases_fpudp[] = 146 227 { 147 228 { "fpudp", DBGFREGVALTYPE_U16 }, … … 149 230 }; 150 231 151 static DBGFREGALIAS const g_a DbgfRegAliases_cr0[] =232 static DBGFREGALIAS const g_aCpumRegAliases_cr0[] = 152 233 { 153 234 { "msw", DBGFREGVALTYPE_U16 }, … … 159 240 */ 160 241 /** Sub-fields for the (hidden) segment attribute register. */ 161 static DBGFREGSUBFIELD const g_a DbgfRegFields_seg[] =162 { 163 { "type", 0, 4, 0 },164 { "s", 4, 1, 0 },165 { "dpl", 5, 2, 0 },166 { "p", 7, 1, 0 },167 { "avl", 12, 1, 0 },168 { "l", 13, 1, 0 },169 { "d", 14, 1, 0 },170 { "g", 15, 1, 0 },171 { NULL, 0, 0, 0 }242 static DBGFREGSUBFIELD const g_aCpumRegFields_seg[] = 243 { 244 DBGFREGSUBFIELD_RW("type", 0, 4, 0), 245 DBGFREGSUBFIELD_RW("s", 4, 1, 0), 246 DBGFREGSUBFIELD_RW("dpl", 5, 2, 0), 247 DBGFREGSUBFIELD_RW("p", 7, 1, 0), 248 DBGFREGSUBFIELD_RW("avl", 12, 1, 0), 249 DBGFREGSUBFIELD_RW("l", 13, 1, 0), 250 DBGFREGSUBFIELD_RW("d", 14, 1, 0), 251 DBGFREGSUBFIELD_RW("g", 15, 1, 0), 252 DBGFREGSUBFIELD_TERMINATOR() 172 253 }; 173 254 174 255 /** Sub-fields for the flags register. */ 175 static DBGFREGSUBFIELD const g_a DbgfRegFields_rflags[] =176 { 177 { "cf", 0, 1, 0 },178 { "pf", 2, 1, 0 },179 { "af", 4, 1, 0 },180 { "zf", 6, 1, 0 },181 { "sf", 7, 1, 0 },182 { "tf", 8, 1, 0 },183 { "if", 9, 1, 0 },184 { "df", 10, 1, 0 },185 { "of", 11, 1, 0 },186 { "iopl", 12, 2, 0 },187 { "nt", 14, 1, 0 },188 { "rf", 16, 1, 0 },189 { "vm", 17, 1, 0 },190 { "ac", 18, 1, 0 },191 { "vif", 19, 1, 0 },192 { "vip", 20, 1, 0 },193 { "id", 21, 1, 0 },194 { NULL, 0, 0, 0 }256 static DBGFREGSUBFIELD const g_aCpumRegFields_rflags[] = 257 { 258 DBGFREGSUBFIELD_RW("cf", 0, 1, 0), 259 DBGFREGSUBFIELD_RW("pf", 2, 1, 0), 260 DBGFREGSUBFIELD_RW("af", 4, 1, 0), 261 DBGFREGSUBFIELD_RW("zf", 6, 1, 0), 262 DBGFREGSUBFIELD_RW("sf", 7, 1, 0), 263 DBGFREGSUBFIELD_RW("tf", 8, 1, 0), 264 DBGFREGSUBFIELD_RW("if", 9, 1, 0), 265 DBGFREGSUBFIELD_RW("df", 10, 1, 0), 266 DBGFREGSUBFIELD_RW("of", 11, 1, 0), 267 DBGFREGSUBFIELD_RW("iopl", 12, 2, 0), 268 DBGFREGSUBFIELD_RW("nt", 14, 1, 0), 269 DBGFREGSUBFIELD_RW("rf", 16, 1, 0), 270 DBGFREGSUBFIELD_RW("vm", 17, 1, 0), 271 DBGFREGSUBFIELD_RW("ac", 18, 1, 0), 272 DBGFREGSUBFIELD_RW("vif", 19, 1, 0), 273 DBGFREGSUBFIELD_RW("vip", 20, 1, 0), 274 DBGFREGSUBFIELD_RW("id", 21, 1, 0), 275 DBGFREGSUBFIELD_TERMINATOR() 195 276 }; 196 277 197 278 /** Sub-fields for the FPU control word register. */ 198 static DBGFREGSUBFIELD const g_a DbgfRegFields_fcw[] =199 { 200 { "im", 1, 1, 0 },201 { "dm", 2, 1, 0 },202 { "zm", 3, 1, 0 },203 { "om", 4, 1, 0 },204 { "um", 5, 1, 0 },205 { "pm", 6, 1, 0 },206 { "pc", 8, 2, 0 },207 { "rc", 10, 2, 0 },208 { "x", 12, 1, 0 },209 { NULL, 0, 0, 0 }279 static DBGFREGSUBFIELD const g_aCpumRegFields_fcw[] = 280 { 281 DBGFREGSUBFIELD_RW("im", 1, 1, 0), 282 DBGFREGSUBFIELD_RW("dm", 2, 1, 0), 283 DBGFREGSUBFIELD_RW("zm", 3, 1, 0), 284 DBGFREGSUBFIELD_RW("om", 4, 1, 0), 285 DBGFREGSUBFIELD_RW("um", 5, 1, 0), 286 DBGFREGSUBFIELD_RW("pm", 6, 1, 0), 287 DBGFREGSUBFIELD_RW("pc", 8, 2, 0), 288 DBGFREGSUBFIELD_RW("rc", 10, 2, 0), 289 DBGFREGSUBFIELD_RW("x", 12, 1, 0), 290 DBGFREGSUBFIELD_TERMINATOR() 210 291 }; 211 292 212 293 /** Sub-fields for the FPU status word register. */ 213 static DBGFREGSUBFIELD const g_a DbgfRegFields_fsw[] =214 { 215 { "ie", 0, 1, 0 },216 { "de", 1, 1, 0 },217 { "ze", 2, 1, 0 },218 { "oe", 3, 1, 0 },219 { "ue", 4, 1, 0 },220 { "pe", 5, 1, 0 },221 { "se", 6, 1, 0 },222 { "es", 7, 1, 0 },223 { "c0", 8, 1, 0 },224 { "c1", 9, 1, 0 },225 { "c2", 10, 1, 0 },226 { "top", 11, 3, 0 },227 { "c3", 14, 1, 0 },228 { "b", 15, 1, 0 },229 { NULL, 0, 0, 0 }294 static DBGFREGSUBFIELD const g_aCpumRegFields_fsw[] = 295 { 296 DBGFREGSUBFIELD_RW("ie", 0, 1, 0), 297 DBGFREGSUBFIELD_RW("de", 1, 1, 0), 298 DBGFREGSUBFIELD_RW("ze", 2, 1, 0), 299 DBGFREGSUBFIELD_RW("oe", 3, 1, 0), 300 DBGFREGSUBFIELD_RW("ue", 4, 1, 0), 301 DBGFREGSUBFIELD_RW("pe", 5, 1, 0), 302 DBGFREGSUBFIELD_RW("se", 6, 1, 0), 303 DBGFREGSUBFIELD_RW("es", 7, 1, 0), 304 DBGFREGSUBFIELD_RW("c0", 8, 1, 0), 305 DBGFREGSUBFIELD_RW("c1", 9, 1, 0), 306 DBGFREGSUBFIELD_RW("c2", 10, 1, 0), 307 DBGFREGSUBFIELD_RW("top", 11, 3, 0), 308 DBGFREGSUBFIELD_RW("c3", 14, 1, 0), 309 DBGFREGSUBFIELD_RW("b", 15, 1, 0), 310 DBGFREGSUBFIELD_TERMINATOR() 230 311 }; 231 312 232 313 /** Sub-fields for the FPU tag word register. */ 233 static DBGFREGSUBFIELD const g_a DbgfRegFields_ftw[] =234 { 235 { "tag0", 0, 2, 0 },236 { "tag1", 2, 2, 0 },237 { "tag2", 4, 2, 0 },238 { "tag3", 6, 2, 0 },239 { "tag4", 8, 2, 0 },240 { "tag5", 10, 2, 0 },241 { "tag6", 12, 2, 0 },242 { "tag7", 14, 2, 0 },243 { NULL, 0, 0, 0 }314 static DBGFREGSUBFIELD const g_aCpumRegFields_ftw[] = 315 { 316 DBGFREGSUBFIELD_RW("tag0", 0, 2, 0), 317 DBGFREGSUBFIELD_RW("tag1", 2, 2, 0), 318 DBGFREGSUBFIELD_RW("tag2", 4, 2, 0), 319 DBGFREGSUBFIELD_RW("tag3", 6, 2, 0), 320 DBGFREGSUBFIELD_RW("tag4", 8, 2, 0), 321 DBGFREGSUBFIELD_RW("tag5", 10, 2, 0), 322 DBGFREGSUBFIELD_RW("tag6", 12, 2, 0), 323 DBGFREGSUBFIELD_RW("tag7", 14, 2, 0), 324 DBGFREGSUBFIELD_TERMINATOR() 244 325 }; 245 326 246 327 /** Sub-fields for the Multimedia Extensions Control and Status Register. */ 247 static DBGFREGSUBFIELD const g_a DbgfRegFields_mxcsr[] =248 { 249 { "ie", 0, 1, 0 },250 { "de", 1, 1, 0 },251 { "ze", 2, 1, 0 },252 { "oe", 3, 1, 0 },253 { "ue", 4, 1, 0 },254 { "pe", 5, 1, 0 },255 { "daz", 6, 1, 0 },256 { "im", 7, 1, 0 },257 { "dm", 8, 1, 0 },258 { "zm", 9, 1, 0 },259 { "om", 10, 1, 0 },260 { "um", 11, 1, 0 },261 { "pm", 12, 1, 0 },262 { "rc", 13, 2, 0 },263 { "fz", 14, 1, 0 },264 { NULL, 0, 0, 0 }328 static DBGFREGSUBFIELD const g_aCpumRegFields_mxcsr[] = 329 { 330 DBGFREGSUBFIELD_RW("ie", 0, 1, 0), 331 DBGFREGSUBFIELD_RW("de", 1, 1, 0), 332 DBGFREGSUBFIELD_RW("ze", 2, 1, 0), 333 DBGFREGSUBFIELD_RW("oe", 3, 1, 0), 334 DBGFREGSUBFIELD_RW("ue", 4, 1, 0), 335 DBGFREGSUBFIELD_RW("pe", 5, 1, 0), 336 DBGFREGSUBFIELD_RW("daz", 6, 1, 0), 337 DBGFREGSUBFIELD_RW("im", 7, 1, 0), 338 DBGFREGSUBFIELD_RW("dm", 8, 1, 0), 339 DBGFREGSUBFIELD_RW("zm", 9, 1, 0), 340 DBGFREGSUBFIELD_RW("om", 10, 1, 0), 341 DBGFREGSUBFIELD_RW("um", 11, 1, 0), 342 DBGFREGSUBFIELD_RW("pm", 12, 1, 0), 343 DBGFREGSUBFIELD_RW("rc", 13, 2, 0), 344 DBGFREGSUBFIELD_RW("fz", 14, 1, 0), 345 DBGFREGSUBFIELD_TERMINATOR() 265 346 }; 266 347 267 348 /** Sub-fields for the FPU tag word register. */ 268 static DBGFREGSUBFIELD const g_a DbgfRegFields_stN[] =269 { 270 { "man", 0, 64, 0 },271 { "exp", 64, 15, 0 },272 { "sig", 79, 1, 0 },273 { NULL, 0, 0, 0 }349 static DBGFREGSUBFIELD const g_aCpumRegFields_stN[] = 350 { 351 DBGFREGSUBFIELD_RW("man", 0, 64, 0), 352 DBGFREGSUBFIELD_RW("exp", 64, 15, 0), 353 DBGFREGSUBFIELD_RW("sig", 79, 1, 0), 354 DBGFREGSUBFIELD_TERMINATOR() 274 355 }; 275 356 276 357 /** Sub-fields for the MMX registers. */ 277 static DBGFREGSUBFIELD const g_a DbgfRegFields_mmN[] =278 { 279 { "dw0", 0, 32, 0 },280 { "dw1", 32, 32, 0 },281 { "w0", 0, 16, 0 },282 { "w1", 16, 16, 0 },283 { "w2", 32, 16, 0 },284 { "w3", 48, 16, 0 },285 { "b0", 0, 8, 0 },286 { "b1", 8, 8, 0 },287 { "b2", 16, 8, 0 },288 { "b3", 24, 8, 0 },289 { "b4", 32, 8, 0 },290 { "b5", 40, 8, 0 },291 { "b6", 48, 8, 0 },292 { "b7", 56, 8, 0 },293 { NULL, 0, 0, 0 }358 static DBGFREGSUBFIELD const g_aCpumRegFields_mmN[] = 359 { 360 DBGFREGSUBFIELD_RW("dw0", 0, 32, 0), 361 DBGFREGSUBFIELD_RW("dw1", 32, 32, 0), 362 DBGFREGSUBFIELD_RW("w0", 0, 16, 0), 363 DBGFREGSUBFIELD_RW("w1", 16, 16, 0), 364 DBGFREGSUBFIELD_RW("w2", 32, 16, 0), 365 DBGFREGSUBFIELD_RW("w3", 48, 16, 0), 366 DBGFREGSUBFIELD_RW("b0", 0, 8, 0), 367 DBGFREGSUBFIELD_RW("b1", 8, 8, 0), 368 DBGFREGSUBFIELD_RW("b2", 16, 8, 0), 369 DBGFREGSUBFIELD_RW("b3", 24, 8, 0), 370 DBGFREGSUBFIELD_RW("b4", 32, 8, 0), 371 DBGFREGSUBFIELD_RW("b5", 40, 8, 0), 372 DBGFREGSUBFIELD_RW("b6", 48, 8, 0), 373 DBGFREGSUBFIELD_RW("b7", 56, 8, 0), 374 DBGFREGSUBFIELD_TERMINATOR() 294 375 }; 295 376 296 377 /** Sub-fields for the XMM registers. */ 297 static DBGFREGSUBFIELD const g_a DbgfRegFields_xmmN[] =298 { 299 { "r0", 0, 32, 0 },300 { "r0.man", 0+ 0, 23, 0 },301 { "r0.exp", 0+23, 8, 0 },302 { "r0.sig", 0+31, 1, 0 },303 { "r1", 32, 32, 0 },304 { "r1.man", 32+ 0, 23, 0 },305 { "r1.exp", 32+23, 8, 0 },306 { "r1.sig", 32+31, 1, 0 },307 { "r2", 64, 32, 0 },308 { "r2.man", 64+ 0, 23, 0 },309 { "r2.exp", 64+23, 8, 0 },310 { "r2.sig", 64+31, 1, 0 },311 { "r3", 96, 32, 0 },312 { "r3.man", 96+ 0, 23, 0 },313 { "r3.exp", 96+23, 8, 0 },314 { "r3.sig", 96+31, 1, 0 },315 { NULL, 0, 0, 0 }378 static DBGFREGSUBFIELD const g_aCpumRegFields_xmmN[] = 379 { 380 DBGFREGSUBFIELD_RW("r0", 0, 32, 0), 381 DBGFREGSUBFIELD_RW("r0.man", 0+ 0, 23, 0), 382 DBGFREGSUBFIELD_RW("r0.exp", 0+23, 8, 0), 383 DBGFREGSUBFIELD_RW("r0.sig", 0+31, 1, 0), 384 DBGFREGSUBFIELD_RW("r1", 32, 32, 0), 385 DBGFREGSUBFIELD_RW("r1.man", 32+ 0, 23, 0), 386 DBGFREGSUBFIELD_RW("r1.exp", 32+23, 8, 0), 387 DBGFREGSUBFIELD_RW("r1.sig", 32+31, 1, 0), 388 DBGFREGSUBFIELD_RW("r2", 64, 32, 0), 389 DBGFREGSUBFIELD_RW("r2.man", 64+ 0, 23, 0), 390 DBGFREGSUBFIELD_RW("r2.exp", 64+23, 8, 0), 391 DBGFREGSUBFIELD_RW("r2.sig", 64+31, 1, 0), 392 DBGFREGSUBFIELD_RW("r3", 96, 32, 0), 393 DBGFREGSUBFIELD_RW("r3.man", 96+ 0, 23, 0), 394 DBGFREGSUBFIELD_RW("r3.exp", 96+23, 8, 0), 395 DBGFREGSUBFIELD_RW("r3.sig", 96+31, 1, 0), 396 DBGFREGSUBFIELD_TERMINATOR() 316 397 }; 317 398 318 399 /** Sub-fields for the CR0 register. */ 319 static DBGFREGSUBFIELD const g_a DbgfRegFields_cr0[] =320 { 321 /** @todo */ 322 { NULL, 0, 0, 0 }400 static DBGFREGSUBFIELD const g_aCpumRegFields_cr0[] = 401 { 402 /** @todo */ 403 DBGFREGSUBFIELD_TERMINATOR() 323 404 }; 324 405 325 406 /** Sub-fields for the CR3 register. */ 326 static DBGFREGSUBFIELD const g_a DbgfRegFields_cr3[] =327 { 328 /** @todo */ 329 { NULL, 0, 0, 0 }407 static DBGFREGSUBFIELD const g_aCpumRegFields_cr3[] = 408 { 409 /** @todo */ 410 DBGFREGSUBFIELD_TERMINATOR() 330 411 }; 331 412 332 413 /** Sub-fields for the CR4 register. */ 333 static DBGFREGSUBFIELD const g_a DbgfRegFields_cr4[] =334 { 335 /** @todo */ 336 { NULL, 0, 0, 0 }414 static DBGFREGSUBFIELD const g_aCpumRegFields_cr4[] = 415 { 416 /** @todo */ 417 DBGFREGSUBFIELD_TERMINATOR() 337 418 }; 338 419 339 420 /** Sub-fields for the DR6 register. */ 340 static DBGFREGSUBFIELD const g_a DbgfRegFields_dr6[] =341 { 342 /** @todo */ 343 { NULL, 0, 0, 0 }421 static DBGFREGSUBFIELD const g_aCpumRegFields_dr6[] = 422 { 423 /** @todo */ 424 DBGFREGSUBFIELD_TERMINATOR() 344 425 }; 345 426 346 427 /** Sub-fields for the DR7 register. */ 347 static DBGFREGSUBFIELD const g_a DbgfRegFields_dr7[] =348 { 349 /** @todo */ 350 { NULL, 0, 0, 0 }428 static DBGFREGSUBFIELD const g_aCpumRegFields_dr7[] = 429 { 430 /** @todo */ 431 DBGFREGSUBFIELD_TERMINATOR() 351 432 }; 352 433 353 434 /** Sub-fields for the CR_PAT MSR. */ 354 static DBGFREGSUBFIELD const g_a DbgfRegFields_apic_base[] =355 { 356 { "bsp", 8, 1, 0 },357 { "ge", 9, 1, 0 },358 { "base", 12, 20, 12 },359 { NULL, 0, 0, 0 }435 static DBGFREGSUBFIELD const g_aCpumRegFields_apic_base[] = 436 { 437 DBGFREGSUBFIELD_RW("bsp", 8, 1, 0), 438 DBGFREGSUBFIELD_RW("ge", 9, 1, 0), 439 DBGFREGSUBFIELD_RW("base", 12, 20, 12), 440 DBGFREGSUBFIELD_TERMINATOR() 360 441 }; 361 442 362 443 /** Sub-fields for the CR_PAT MSR. */ 363 static DBGFREGSUBFIELD const g_a DbgfRegFields_cr_pat[] =364 { 365 /** @todo */ 366 { NULL, 0, 0, 0 }444 static DBGFREGSUBFIELD const g_aCpumRegFields_cr_pat[] = 445 { 446 /** @todo */ 447 DBGFREGSUBFIELD_TERMINATOR() 367 448 }; 368 449 369 450 /** Sub-fields for the PERF_STATUS MSR. */ 370 static DBGFREGSUBFIELD const g_a DbgfRegFields_perf_status[] =371 { 372 /** @todo */ 373 { NULL, 0, 0, 0 }451 static DBGFREGSUBFIELD const g_aCpumRegFields_perf_status[] = 452 { 453 /** @todo */ 454 DBGFREGSUBFIELD_TERMINATOR() 374 455 }; 375 456 376 457 /** Sub-fields for the EFER MSR. */ 377 static DBGFREGSUBFIELD const g_a DbgfRegFields_efer[] =378 { 379 /** @todo */ 380 { NULL, 0, 0, 0 }458 static DBGFREGSUBFIELD const g_aCpumRegFields_efer[] = 459 { 460 /** @todo */ 461 DBGFREGSUBFIELD_TERMINATOR() 381 462 }; 382 463 383 464 /** Sub-fields for the STAR MSR. */ 384 static DBGFREGSUBFIELD const g_a DbgfRegFields_star[] =385 { 386 /** @todo */ 387 { NULL, 0, 0, 0 }465 static DBGFREGSUBFIELD const g_aCpumRegFields_star[] = 466 { 467 /** @todo */ 468 DBGFREGSUBFIELD_TERMINATOR() 388 469 }; 389 470 390 471 /** Sub-fields for the CSTAR MSR. */ 391 static DBGFREGSUBFIELD const g_a DbgfRegFields_cstar[] =392 { 393 /** @todo */ 394 { NULL, 0, 0, 0 }472 static DBGFREGSUBFIELD const g_aCpumRegFields_cstar[] = 473 { 474 /** @todo */ 475 DBGFREGSUBFIELD_TERMINATOR() 395 476 }; 396 477 397 478 /** Sub-fields for the LSTAR MSR. */ 398 static DBGFREGSUBFIELD const g_a DbgfRegFields_lstar[] =399 { 400 /** @todo */ 401 { NULL, 0, 0, 0 }479 static DBGFREGSUBFIELD const g_aCpumRegFields_lstar[] = 480 { 481 /** @todo */ 482 DBGFREGSUBFIELD_TERMINATOR() 402 483 }; 403 484 404 485 /** Sub-fields for the SF_MASK MSR. */ 405 static DBGFREGSUBFIELD const g_a DbgfRegFields_sf_mask[] =406 { 407 /** @todo */ 408 { NULL, 0, 0, 0 }486 static DBGFREGSUBFIELD const g_aCpumRegFields_sf_mask[] = 487 { 488 /** @todo */ 489 DBGFREGSUBFIELD_TERMINATOR() 409 490 }; 410 491 … … 414 495 * The register descriptors. 415 496 */ 416 static DBGFREGDESC const g_aDbgfRegDescs[] = 417 { 418 #define DBGFREGDESC_REG(UName, LName) \ 419 { #LName, DBGFREG_##UName, DBGFREGVALTYPE_U64, RT_OFFSETOF(CPUMCTX, LName), NULL, NULL, g_aDbgfRegAliases_##LName, NULL } 420 DBGFREGDESC_REG(RAX, rax), 421 DBGFREGDESC_REG(RCX, rcx), 422 DBGFREGDESC_REG(RDX, rdx), 423 DBGFREGDESC_REG(RSP, rsp), 424 DBGFREGDESC_REG(RBP, rbp), 425 DBGFREGDESC_REG(RSI, rsi), 426 DBGFREGDESC_REG(RDI, rdi), 427 DBGFREGDESC_REG(R8, r8), 428 DBGFREGDESC_REG(R9, r9), 429 DBGFREGDESC_REG(R10, r10), 430 DBGFREGDESC_REG(R11, r11), 431 DBGFREGDESC_REG(R12, r12), 432 DBGFREGDESC_REG(R13, r13), 433 DBGFREGDESC_REG(R14, r14), 434 DBGFREGDESC_REG(R15, r15), 435 #define DBGFREGDESC_SEG(UName, LName) \ 436 { #LName, DBGFREG_##UName, DBGFREGVALTYPE_U16, RT_OFFSETOF(CPUMCTX, LName), NULL, dbgfR3RegSet_seg, NULL, NULL }, \ 437 { #LName "_attr", DBGFREG_##UName##_ATTR, DBGFREGVALTYPE_U32, RT_OFFSETOF(CPUMCTX, LName##Hid.Attr.u), NULL, NULL, NULL, g_aDbgfRegFields_seg }, \ 438 { #LName "_base", DBGFREG_##UName##_ATTR, DBGFREGVALTYPE_U64, RT_OFFSETOF(CPUMCTX, LName##Hid.u64Base), NULL, NULL, NULL, NULL }, \ 439 { #LName "_lim", DBGFREG_##UName##_ATTR, DBGFREGVALTYPE_U32, RT_OFFSETOF(CPUMCTX, LName##Hid.u32Limit), NULL, NULL, NULL, NULL } 440 DBGFREGDESC_SEG(CS, cs), 441 DBGFREGDESC_SEG(DS, ds), 442 DBGFREGDESC_SEG(ES, es), 443 DBGFREGDESC_SEG(FS, fs), 444 DBGFREGDESC_SEG(GS, gs), 445 DBGFREGDESC_SEG(SS, ss), 446 DBGFREGDESC_REG(RIP, rip), 447 { "rflags", DBGFREG_RFLAGS, DBGFREGVALTYPE_U64, RT_OFFSETOF(CPUMCTX, rflags), NULL, NULL, g_aDbgfRegAliases_rflags, g_aDbgfRegFields_rflags }, 448 { "fcw", DBGFREG_FCW, DBGFREGVALTYPE_U16, RT_OFFSETOF(CPUMCTX, fpu.FCW), NULL, NULL, NULL, g_aDbgfRegFields_fcw }, 449 { "fsw", DBGFREG_FSW, DBGFREGVALTYPE_U16, RT_OFFSETOF(CPUMCTX, fpu.FSW), NULL, NULL, NULL, g_aDbgfRegFields_fsw }, 450 { "ftw", DBGFREG_FTW, DBGFREGVALTYPE_U16, RT_OFFSETOF(CPUMCTX, fpu.FTW), dbgfR3RegGet_ftw, dbgfR3RegSet_ftw, NULL, g_aDbgfRegFields_ftw }, 451 { "fop", DBGFREG_FOP, DBGFREGVALTYPE_U16, RT_OFFSETOF(CPUMCTX, fpu.FOP), NULL, NULL, NULL, NULL }, 452 { "fpuip", DBGFREG_FPUIP, DBGFREGVALTYPE_U32, RT_OFFSETOF(CPUMCTX, fpu.FPUIP), NULL, NULL, g_aDbgfRegAliases_fpuip, NULL }, 453 { "fpucs", DBGFREG_FPUCS, DBGFREGVALTYPE_U16, RT_OFFSETOF(CPUMCTX, fpu.CS), NULL, NULL, NULL, NULL }, 454 { "fpudp", DBGFREG_FPUDP, DBGFREGVALTYPE_U32, RT_OFFSETOF(CPUMCTX, fpu.FPUDP), NULL, NULL, g_aDbgfRegAliases_fpudp, NULL }, 455 { "fpuds", DBGFREG_FPUDS, DBGFREGVALTYPE_U16, RT_OFFSETOF(CPUMCTX, fpu.DS), NULL, NULL, NULL, NULL }, 456 { "mxcsr", DBGFREG_MXCSR, DBGFREGVALTYPE_U32, RT_OFFSETOF(CPUMCTX, fpu.MXCSR), NULL, NULL, NULL, g_aDbgfRegFields_mxcsr }, 457 { "mxcsr_mask", DBGFREG_MXCSR_MASK, DBGFREGVALTYPE_U32, RT_OFFSETOF(CPUMCTX, fpu.MXCSR_MASK), NULL, NULL, NULL, g_aDbgfRegFields_mxcsr }, 458 #define DBGFREGDESC_ST(n) \ 459 { "st" #n, DBGFREG_ST##n, DBGFREGVALTYPE_80, ~(size_t)0, dbgfR3RegGet_stN, dbgfR3RegSet_stN, NULL, g_aDbgfRegFields_stN } 460 DBGFREGDESC_ST(0), 461 DBGFREGDESC_ST(1), 462 DBGFREGDESC_ST(2), 463 DBGFREGDESC_ST(3), 464 DBGFREGDESC_ST(4), 465 DBGFREGDESC_ST(5), 466 DBGFREGDESC_ST(6), 467 DBGFREGDESC_ST(7), 468 #define DBGFREGDESC_MM(n) \ 469 { "mm" #n, DBGFREG_MM##n, DBGFREGVALTYPE_U64, RT_OFFSETOF(CPUMCTX, fpu.aRegs[n].mmx), NULL, NULL, NULL, g_aDbgfRegFields_mmN } 470 DBGFREGDESC_MM(0), 471 DBGFREGDESC_MM(1), 472 DBGFREGDESC_MM(2), 473 DBGFREGDESC_MM(3), 474 DBGFREGDESC_MM(4), 475 DBGFREGDESC_MM(5), 476 DBGFREGDESC_MM(6), 477 DBGFREGDESC_MM(7), 478 #define DBGFREGDESC_XMM(n) \ 479 { "xmm" #n, DBGFREG_XMM##n, DBGFREGVALTYPE_U128, RT_OFFSETOF(CPUMCTX, fpu.aXMM[n].xmm), NULL, NULL, NULL, g_aDbgfRegFields_xmmN } 480 DBGFREGDESC_XMM(0), 481 DBGFREGDESC_XMM(1), 482 DBGFREGDESC_XMM(2), 483 DBGFREGDESC_XMM(3), 484 DBGFREGDESC_XMM(4), 485 DBGFREGDESC_XMM(5), 486 DBGFREGDESC_XMM(6), 487 DBGFREGDESC_XMM(7), 488 DBGFREGDESC_XMM(8), 489 DBGFREGDESC_XMM(9), 490 DBGFREGDESC_XMM(10), 491 DBGFREGDESC_XMM(11), 492 DBGFREGDESC_XMM(12), 493 DBGFREGDESC_XMM(13), 494 DBGFREGDESC_XMM(14), 495 DBGFREGDESC_XMM(15), 496 { "gdtr_base", DBGFREG_GDTR_BASE, DBGFREGVALTYPE_U64, RT_OFFSETOF(CPUMCTX, gdtr.pGdt), NULL, NULL, NULL, NULL }, 497 { "gdtr_limit", DBGFREG_GDTR_LIMIT, DBGFREGVALTYPE_U16, RT_OFFSETOF(CPUMCTX, gdtr.cbGdt), NULL, NULL, NULL, NULL }, 498 { "idtr_base", DBGFREG_IDTR_BASE, DBGFREGVALTYPE_U64, RT_OFFSETOF(CPUMCTX, idtr.pIdt), NULL, NULL, NULL, NULL }, 499 { "idtr_limit", DBGFREG_IDTR_LIMIT, DBGFREGVALTYPE_U16, RT_OFFSETOF(CPUMCTX, idtr.cbIdt), NULL, NULL, NULL, NULL }, 500 DBGFREGDESC_SEG(LDTR, ldtr), 501 DBGFREGDESC_SEG(TR, tr), 502 { "cr0", DBGFREG_CR0, DBGFREGVALTYPE_U32, 0, dbgfR3RegGet_crX, dbgfR3RegSet_crX, g_aDbgfRegAliases_cr0, g_aDbgfRegFields_cr0 }, 503 { "cr2", DBGFREG_CR2, DBGFREGVALTYPE_U64, 2, dbgfR3RegGet_crX, dbgfR3RegSet_crX, NULL, NULL }, 504 { "cr3", DBGFREG_CR3, DBGFREGVALTYPE_U64, 3, dbgfR3RegGet_crX, dbgfR3RegSet_crX, NULL, g_aDbgfRegFields_cr3 }, 505 { "cr4", DBGFREG_CR4, DBGFREGVALTYPE_U32, 4, dbgfR3RegGet_crX, dbgfR3RegSet_crX, NULL, g_aDbgfRegFields_cr4 }, 506 { "cr8", DBGFREG_CR8, DBGFREGVALTYPE_U32, 8, dbgfR3RegGet_crX, dbgfR3RegSet_crX, NULL, NULL }, 507 { "dr0", DBGFREG_DR0, DBGFREGVALTYPE_U64, 0, dbgfR3RegGet_drX, dbgfR3RegSet_drX, NULL, NULL }, 508 { "dr1", DBGFREG_DR1, DBGFREGVALTYPE_U64, 1, dbgfR3RegGet_drX, dbgfR3RegSet_drX, NULL, NULL }, 509 { "dr2", DBGFREG_DR2, DBGFREGVALTYPE_U64, 2, dbgfR3RegGet_drX, dbgfR3RegSet_drX, NULL, NULL }, 510 { "dr3", DBGFREG_DR3, DBGFREGVALTYPE_U64, 3, dbgfR3RegGet_drX, dbgfR3RegSet_drX, NULL, NULL }, 511 { "dr6", DBGFREG_DR6, DBGFREGVALTYPE_U32, 6, dbgfR3RegGet_drX, dbgfR3RegSet_drX, NULL, g_aDbgfRegFields_dr6 }, 512 { "dr7", DBGFREG_DR7, DBGFREGVALTYPE_U32, 7, dbgfR3RegGet_drX, dbgfR3RegSet_drX, NULL, g_aDbgfRegFields_dr7 }, 513 { "apic_base", DBGFREG_MSR_IA32_APICBASE, DBGFREGVALTYPE_U32, MSR_IA32_APICBASE, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, g_aDbgfRegFields_apic_base }, 514 { "pat", DBGFREG_MSR_IA32_CR_PAT, DBGFREGVALTYPE_U64, MSR_IA32_CR_PAT, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, g_aDbgfRegFields_cr_pat }, 515 { "perf_status", DBGFREG_MSR_IA32_PERF_STATUS, DBGFREGVALTYPE_U64, MSR_IA32_PERF_STATUS, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, g_aDbgfRegFields_perf_status }, 516 { "sysenter_cs", DBGFREG_MSR_IA32_SYSENTER_CS, DBGFREGVALTYPE_U16, MSR_IA32_SYSENTER_CS, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, NULL }, 517 { "sysenter_eip", DBGFREG_MSR_IA32_SYSENTER_EIP, DBGFREGVALTYPE_U32, MSR_IA32_SYSENTER_EIP, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, NULL }, 518 { "sysenter_esp", DBGFREG_MSR_IA32_SYSENTER_ESP, DBGFREGVALTYPE_U32, MSR_IA32_SYSENTER_ESP, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, NULL }, 519 { "tsc", DBGFREG_MSR_IA32_TSC, DBGFREGVALTYPE_U32, MSR_IA32_TSC, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, NULL }, 520 { "efer", DBGFREG_MSR_K6_EFER, DBGFREGVALTYPE_U32, MSR_K6_EFER, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, g_aDbgfRegFields_efer }, 521 { "star", DBGFREG_MSR_K6_STAR, DBGFREGVALTYPE_U64, MSR_K6_STAR, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, g_aDbgfRegFields_star }, 522 { "cstar", DBGFREG_MSR_K8_CSTAR, DBGFREGVALTYPE_U64, MSR_K8_CSTAR, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, g_aDbgfRegFields_cstar }, 523 { "msr_fs_base", DBGFREG_MSR_K8_FS_BASE, DBGFREGVALTYPE_U64, MSR_K8_FS_BASE, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, NULL }, 524 { "msr_gs_base", DBGFREG_MSR_K8_GS_BASE, DBGFREGVALTYPE_U64, MSR_K8_GS_BASE, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, NULL }, 525 { "krnl_gs_base", DBGFREG_MSR_K8_KERNEL_GS_BASE, DBGFREGVALTYPE_U64, MSR_K8_KERNEL_GS_BASE, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, NULL }, 526 { "lstar", DBGFREG_MSR_K8_LSTAR, DBGFREGVALTYPE_U64, MSR_K8_LSTAR, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, g_aDbgfRegFields_lstar }, 527 { "tsc_aux", DBGFREG_MSR_K8_TSC_AUX, DBGFREGVALTYPE_U64, MSR_K8_TSC_AUX, dbgfR3RegGet_msr, dbgfR3RegSet_msr, NULL, NULL }, 528 { "ah", DBGFREG_AH, DBGFREGVALTYPE_U8, RT_OFFSETOF(CPUMCTX, rax) + 1, NULL, NULL, NULL, NULL }, 529 { "ch", DBGFREG_CH, DBGFREGVALTYPE_U8, RT_OFFSETOF(CPUMCTX, rcx) + 1, NULL, NULL, NULL, NULL }, 530 { "dh", DBGFREG_DH, DBGFREGVALTYPE_U8, RT_OFFSETOF(CPUMCTX, rdx) + 1, NULL, NULL, NULL, NULL }, 531 { "bh", DBGFREG_BH, DBGFREGVALTYPE_U8, RT_OFFSETOF(CPUMCTX, rbx) + 1, NULL, NULL, NULL, NULL }, 532 { "gdtr", DBGFREG_GDTR, DBGFREGVALTYPE_DTR, ~(size_t)0, dbgfR3RegGet_gdtr, dbgfR3RegSet_gdtr, NULL, NULL }, 533 { "idtr", DBGFREG_IDTR, DBGFREGVALTYPE_DTR, ~(size_t)0, dbgfR3RegGet_idtr, dbgfR3RegSet_idtr, NULL, NULL }, 534 #undef DBGFREGDESC_REG 535 #undef DBGFREGDESC_SEG 536 #undef DBGFREGDESC_ST 537 #undef DBGFREGDESC_MM 538 #undef DBGFREGDESC_XMM 539 }; 540 497 static DBGFREGDESC const g_aCpumRegDescs[] = 498 { 499 #define CPUMREGDESC_REG(UName, LName) \ 500 { #LName, DBGFREG_##UName, DBGFREGVALTYPE_U64, 0, RT_OFFSETOF(CPUMCTX, LName), cpumR3RegGet_Generic, cpumR3RegSet_Generic, g_aCpumRegAliases_##LName, NULL } 501 CPUMREGDESC_REG(RAX, rax), 502 CPUMREGDESC_REG(RCX, rcx), 503 CPUMREGDESC_REG(RDX, rdx), 504 CPUMREGDESC_REG(RSP, rsp), 505 CPUMREGDESC_REG(RBP, rbp), 506 CPUMREGDESC_REG(RSI, rsi), 507 CPUMREGDESC_REG(RDI, rdi), 508 CPUMREGDESC_REG(R8, r8), 509 CPUMREGDESC_REG(R9, r9), 510 CPUMREGDESC_REG(R10, r10), 511 CPUMREGDESC_REG(R11, r11), 512 CPUMREGDESC_REG(R12, r12), 513 CPUMREGDESC_REG(R13, r13), 514 CPUMREGDESC_REG(R14, r14), 515 CPUMREGDESC_REG(R15, r15), 516 #define CPUMREGDESC_SEG(UName, LName) \ 517 { #LName, DBGFREG_##UName, DBGFREGVALTYPE_U16, 0, RT_OFFSETOF(CPUMCTX, LName), cpumR3RegGet_Generic, cpumR3RegSet_seg, NULL, NULL }, \ 518 { #LName "_attr", DBGFREG_##UName##_ATTR, DBGFREGVALTYPE_U32, 0, RT_OFFSETOF(CPUMCTX, LName##Hid.Attr.u), cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_seg }, \ 519 { #LName "_base", DBGFREG_##UName##_ATTR, DBGFREGVALTYPE_U64, 0, RT_OFFSETOF(CPUMCTX, LName##Hid.u64Base), cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL }, \ 520 { #LName "_lim", DBGFREG_##UName##_ATTR, DBGFREGVALTYPE_U32, 0, RT_OFFSETOF(CPUMCTX, LName##Hid.u32Limit), cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL } 521 CPUMREGDESC_SEG(CS, cs), 522 CPUMREGDESC_SEG(DS, ds), 523 CPUMREGDESC_SEG(ES, es), 524 CPUMREGDESC_SEG(FS, fs), 525 CPUMREGDESC_SEG(GS, gs), 526 CPUMREGDESC_SEG(SS, ss), 527 CPUMREGDESC_REG(RIP, rip), 528 { "rflags", DBGFREG_RFLAGS, DBGFREGVALTYPE_U64, 0, RT_OFFSETOF(CPUMCTX, rflags), cpumR3RegGet_Generic, cpumR3RegSet_Generic, g_aCpumRegAliases_rflags, g_aCpumRegFields_rflags }, 529 { "fcw", DBGFREG_FCW, DBGFREGVALTYPE_U16, 0, RT_OFFSETOF(CPUMCTX, fpu.FCW), cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_fcw }, 530 { "fsw", DBGFREG_FSW, DBGFREGVALTYPE_U16, 0, RT_OFFSETOF(CPUMCTX, fpu.FSW), cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_fsw }, 531 { "ftw", DBGFREG_FTW, DBGFREGVALTYPE_U16, 0, RT_OFFSETOF(CPUMCTX, fpu.FTW), cpumR3RegGet_ftw, cpumR3RegSet_ftw, NULL, g_aCpumRegFields_ftw }, 532 { "fop", DBGFREG_FOP, DBGFREGVALTYPE_U16, 0, RT_OFFSETOF(CPUMCTX, fpu.FOP), cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL }, 533 { "fpuip", DBGFREG_FPUIP, DBGFREGVALTYPE_U32, 0, RT_OFFSETOF(CPUMCTX, fpu.FPUIP), cpumR3RegGet_Generic, cpumR3RegSet_Generic, g_aCpumRegAliases_fpuip, NULL }, 534 { "fpucs", DBGFREG_FPUCS, DBGFREGVALTYPE_U16, 0, RT_OFFSETOF(CPUMCTX, fpu.CS), cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL }, 535 { "fpudp", DBGFREG_FPUDP, DBGFREGVALTYPE_U32, 0, RT_OFFSETOF(CPUMCTX, fpu.FPUDP), cpumR3RegGet_Generic, cpumR3RegSet_Generic, g_aCpumRegAliases_fpudp, NULL }, 536 { "fpuds", DBGFREG_FPUDS, DBGFREGVALTYPE_U16, 0, RT_OFFSETOF(CPUMCTX, fpu.DS), cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL }, 537 { "mxcsr", DBGFREG_MXCSR, DBGFREGVALTYPE_U32, 0, RT_OFFSETOF(CPUMCTX, fpu.MXCSR), cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_mxcsr }, 538 { "mxcsr_mask", DBGFREG_MXCSR_MASK, DBGFREGVALTYPE_U32, 0, RT_OFFSETOF(CPUMCTX, fpu.MXCSR_MASK), cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_mxcsr }, 539 #define CPUMREGDESC_ST(n) \ 540 { "st" #n, DBGFREG_ST##n, DBGFREGVALTYPE_LRD, 0, ~(size_t)0, cpumR3RegGet_stN, cpumR3RegSet_stN, NULL, g_aCpumRegFields_stN } 541 CPUMREGDESC_ST(0), 542 CPUMREGDESC_ST(1), 543 CPUMREGDESC_ST(2), 544 CPUMREGDESC_ST(3), 545 CPUMREGDESC_ST(4), 546 CPUMREGDESC_ST(5), 547 CPUMREGDESC_ST(6), 548 CPUMREGDESC_ST(7), 549 #define CPUMREGDESC_MM(n) \ 550 { "mm" #n, DBGFREG_MM##n, DBGFREGVALTYPE_U64, 0, RT_OFFSETOF(CPUMCTX, fpu.aRegs[n].mmx), cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_mmN } 551 CPUMREGDESC_MM(0), 552 CPUMREGDESC_MM(1), 553 CPUMREGDESC_MM(2), 554 CPUMREGDESC_MM(3), 555 CPUMREGDESC_MM(4), 556 CPUMREGDESC_MM(5), 557 CPUMREGDESC_MM(6), 558 CPUMREGDESC_MM(7), 559 #define CPUMREGDESC_XMM(n) \ 560 { "xmm" #n, DBGFREG_XMM##n, DBGFREGVALTYPE_U128, 0, RT_OFFSETOF(CPUMCTX, fpu.aXMM[n].xmm), cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_xmmN } 561 CPUMREGDESC_XMM(0), 562 CPUMREGDESC_XMM(1), 563 CPUMREGDESC_XMM(2), 564 CPUMREGDESC_XMM(3), 565 CPUMREGDESC_XMM(4), 566 CPUMREGDESC_XMM(5), 567 CPUMREGDESC_XMM(6), 568 CPUMREGDESC_XMM(7), 569 CPUMREGDESC_XMM(8), 570 CPUMREGDESC_XMM(9), 571 CPUMREGDESC_XMM(10), 572 CPUMREGDESC_XMM(11), 573 CPUMREGDESC_XMM(12), 574 CPUMREGDESC_XMM(13), 575 CPUMREGDESC_XMM(14), 576 CPUMREGDESC_XMM(15), 577 { "gdtr_base", DBGFREG_GDTR_BASE, DBGFREGVALTYPE_U64, 0, RT_OFFSETOF(CPUMCTX, gdtr.pGdt), cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL }, 578 { "gdtr_limit", DBGFREG_GDTR_LIMIT, DBGFREGVALTYPE_U16, 0, RT_OFFSETOF(CPUMCTX, gdtr.cbGdt), cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL }, 579 { "idtr_base", DBGFREG_IDTR_BASE, DBGFREGVALTYPE_U64, 0, RT_OFFSETOF(CPUMCTX, idtr.pIdt), cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL }, 580 { "idtr_limit", DBGFREG_IDTR_LIMIT, DBGFREGVALTYPE_U16, 0, RT_OFFSETOF(CPUMCTX, idtr.cbIdt), cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL }, 581 CPUMREGDESC_SEG(LDTR, ldtr), 582 CPUMREGDESC_SEG(TR, tr), 583 { "cr0", DBGFREG_CR0, DBGFREGVALTYPE_U32, 0, 0, cpumR3RegGet_crX, cpumR3RegSet_crX, g_aCpumRegAliases_cr0, g_aCpumRegFields_cr0 }, 584 { "cr2", DBGFREG_CR2, DBGFREGVALTYPE_U64, 0, 2, cpumR3RegGet_crX, cpumR3RegSet_crX, NULL, NULL }, 585 { "cr3", DBGFREG_CR3, DBGFREGVALTYPE_U64, 0, 3, cpumR3RegGet_crX, cpumR3RegSet_crX, NULL, g_aCpumRegFields_cr3 }, 586 { "cr4", DBGFREG_CR4, DBGFREGVALTYPE_U32, 0, 4, cpumR3RegGet_crX, cpumR3RegSet_crX, NULL, g_aCpumRegFields_cr4 }, 587 { "cr8", DBGFREG_CR8, DBGFREGVALTYPE_U32, 0, 8, cpumR3RegGet_crX, cpumR3RegSet_crX, NULL, NULL }, 588 { "dr0", DBGFREG_DR0, DBGFREGVALTYPE_U64, 0, 0, cpumR3RegGet_drX, cpumR3RegSet_drX, NULL, NULL }, 589 { "dr1", DBGFREG_DR1, DBGFREGVALTYPE_U64, 0, 1, cpumR3RegGet_drX, cpumR3RegSet_drX, NULL, NULL }, 590 { "dr2", DBGFREG_DR2, DBGFREGVALTYPE_U64, 0, 2, cpumR3RegGet_drX, cpumR3RegSet_drX, NULL, NULL }, 591 { "dr3", DBGFREG_DR3, DBGFREGVALTYPE_U64, 0, 3, cpumR3RegGet_drX, cpumR3RegSet_drX, NULL, NULL }, 592 { "dr6", DBGFREG_DR6, DBGFREGVALTYPE_U32, 0, 6, cpumR3RegGet_drX, cpumR3RegSet_drX, NULL, g_aCpumRegFields_dr6 }, 593 { "dr7", DBGFREG_DR7, DBGFREGVALTYPE_U32, 0, 7, cpumR3RegGet_drX, cpumR3RegSet_drX, NULL, g_aCpumRegFields_dr7 }, 594 { "apic_base", DBGFREG_MSR_IA32_APICBASE, DBGFREGVALTYPE_U32, 0, MSR_IA32_APICBASE, cpumR3RegGet_msr, cpumR3RegSet_msr, NULL, g_aCpumRegFields_apic_base }, 595 { "pat", DBGFREG_MSR_IA32_CR_PAT, DBGFREGVALTYPE_U64, 0, MSR_IA32_CR_PAT, cpumR3RegGet_msr, cpumR3RegSet_msr, NULL, g_aCpumRegFields_cr_pat }, 596 { "perf_status", DBGFREG_MSR_IA32_PERF_STATUS, DBGFREGVALTYPE_U64, 0, MSR_IA32_PERF_STATUS, cpumR3RegGet_msr, cpumR3RegSet_msr, NULL, g_aCpumRegFields_perf_status }, 597 { "sysenter_cs", DBGFREG_MSR_IA32_SYSENTER_CS, DBGFREGVALTYPE_U16, 0, MSR_IA32_SYSENTER_CS, cpumR3RegGet_msr, cpumR3RegSet_msr, NULL, NULL }, 598 { "sysenter_eip", DBGFREG_MSR_IA32_SYSENTER_EIP, DBGFREGVALTYPE_U32, 0, MSR_IA32_SYSENTER_EIP, cpumR3RegGet_msr, cpumR3RegSet_msr, NULL, NULL }, 599 { "sysenter_esp", DBGFREG_MSR_IA32_SYSENTER_ESP, DBGFREGVALTYPE_U32, 0, MSR_IA32_SYSENTER_ESP, cpumR3RegGet_msr, cpumR3RegSet_msr, NULL, NULL }, 600 { "tsc", DBGFREG_MSR_IA32_TSC, DBGFREGVALTYPE_U32, 0, MSR_IA32_TSC, cpumR3RegGet_msr, cpumR3RegSet_msr, NULL, NULL }, 601 { "efer", DBGFREG_MSR_K6_EFER, DBGFREGVALTYPE_U32, 0, MSR_K6_EFER, cpumR3RegGet_msr, cpumR3RegSet_msr, NULL, g_aCpumRegFields_efer }, 602 { "star", DBGFREG_MSR_K6_STAR, DBGFREGVALTYPE_U64, 0, MSR_K6_STAR, cpumR3RegGet_msr, cpumR3RegSet_msr, NULL, g_aCpumRegFields_star }, 603 { "cstar", DBGFREG_MSR_K8_CSTAR, DBGFREGVALTYPE_U64, 0, MSR_K8_CSTAR, cpumR3RegGet_msr, cpumR3RegSet_msr, NULL, g_aCpumRegFields_cstar }, 604 { "msr_fs_base", DBGFREG_MSR_K8_FS_BASE, DBGFREGVALTYPE_U64, 0, MSR_K8_FS_BASE, cpumR3RegGet_msr, cpumR3RegSet_msr, NULL, NULL }, 605 { "msr_gs_base", DBGFREG_MSR_K8_GS_BASE, DBGFREGVALTYPE_U64, 0, MSR_K8_GS_BASE, cpumR3RegGet_msr, cpumR3RegSet_msr, NULL, NULL }, 606 { "krnl_gs_base", DBGFREG_MSR_K8_KERNEL_GS_BASE, DBGFREGVALTYPE_U64, 0, MSR_K8_KERNEL_GS_BASE, cpumR3RegGet_msr, cpumR3RegSet_msr, NULL, NULL }, 607 { "lstar", DBGFREG_MSR_K8_LSTAR, DBGFREGVALTYPE_U64, 0, MSR_K8_LSTAR, cpumR3RegGet_msr, cpumR3RegSet_msr, NULL, g_aCpumRegFields_lstar }, 608 { "tsc_aux", DBGFREG_MSR_K8_TSC_AUX, DBGFREGVALTYPE_U64, 0, MSR_K8_TSC_AUX, cpumR3RegGet_msr, cpumR3RegSet_msr, NULL, NULL }, 609 { "ah", DBGFREG_AH, DBGFREGVALTYPE_U8, 0, RT_OFFSETOF(CPUMCTX, rax) + 1, NULL, NULL, NULL, NULL }, 610 { "ch", DBGFREG_CH, DBGFREGVALTYPE_U8, 0, RT_OFFSETOF(CPUMCTX, rcx) + 1, NULL, NULL, NULL, NULL }, 611 { "dh", DBGFREG_DH, DBGFREGVALTYPE_U8, 0, RT_OFFSETOF(CPUMCTX, rdx) + 1, NULL, NULL, NULL, NULL }, 612 { "bh", DBGFREG_BH, DBGFREGVALTYPE_U8, 0, RT_OFFSETOF(CPUMCTX, rbx) + 1, NULL, NULL, NULL, NULL }, 613 { "gdtr", DBGFREG_GDTR, DBGFREGVALTYPE_DTR, 0, ~(size_t)0, cpumR3RegGet_gdtr, cpumR3RegSet_gdtr, NULL, NULL }, 614 { "idtr", DBGFREG_IDTR, DBGFREGVALTYPE_DTR, 0, ~(size_t)0, cpumR3RegGet_idtr, cpumR3RegSet_idtr, NULL, NULL }, 615 #undef CPUMREGDESC_REG 616 #undef CPUMREGDESC_SEG 617 #undef CPUMREGDESC_ST 618 #undef CPUMREGDESC_MM 619 #undef CPUMREGDESC_XMM 620 }; 621 622 #endif -
trunk/src/VBox/VMM/VMMR3/DBGFReg.cpp
r35466 r35468 5 5 6 6 /* 7 * Copyright (C) 2010 Oracle Corporation7 * Copyright (C) 2010-2011 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as
Note:
See TracChangeset
for help on using the changeset viewer.