Changeset 12600 in vbox
- Timestamp:
- Sep 19, 2008 1:07:44 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 36853
- Location:
- trunk
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/cpum.h
r12578 r12600 307 307 /** Debug registers. 308 308 * @{ */ 309 uint64_t dr0; 310 uint64_t dr1; 311 uint64_t dr2; 312 uint64_t dr3; 313 uint64_t dr4; /**< @todo remove dr4 and dr5. */ 314 uint64_t dr5; 315 uint64_t dr6; 316 uint64_t dr7; 309 uint64_t dr[8]; 317 310 /* DR8-15 are currently not supported */ 318 311 /** @} */ -
trunk/include/VBox/cpum.mac
r10648 r12600 164 164 .cr4 resq 1 165 165 166 .dr0 resq 1 167 .dr1 resq 1 168 .dr2 resq 1 169 .dr3 resq 1 170 .dr4 resq 1 171 .dr5 resq 1 172 .dr6 resq 1 173 .dr7 resq 1 166 .dr resq 8 174 167 175 168 .gdtr resb 10 ; GDT limit + linear address -
trunk/include/VBox/x86.h
r12578 r12600 721 721 #define X86_DR7_ENABLED_MASK (RT_BIT(0) | RT_BIT(1) | RT_BIT(2) | RT_BIT(3) | RT_BIT(4) | RT_BIT(5) | RT_BIT(6) | RT_BIT(7)) 722 722 723 /** Mask used to check if any io breakpoints are set. */ 724 #define X86_DR7_IO_ENABLED_MASK (X86_DR7_RW(0, X86_DR7_RW_IO) | X86_DR7_RW(1, X86_DR7_RW_IO) | X86_DR7_RW(2, X86_DR7_RW_IO) | X86_DR7_RW(3, X86_DR7_RW_IO)) 725 723 726 /** Value of DR7 after powerup/reset. */ 724 727 #define X86_DR7_INIT_VAL 0x400 -
trunk/src/VBox/VMM/CPUM.cpp
r12578 r12600 708 708 pCtx->trHid.Attr.n.u4Type = X86_SEL_TYPE_SYS_386_TSS_BUSY; 709 709 710 pCtx->dr 6= X86_DR6_INIT_VAL;711 pCtx->dr 7= X86_DR7_INIT_VAL;710 pCtx->dr[6] = X86_DR6_INIT_VAL; 711 pCtx->dr[7] = X86_DR7_INIT_VAL; 712 712 713 713 pCtx->fpu.FTW = 0xff; /* All tags are set, i.e. the regs are empty. */ … … 775 775 { 776 776 #define CPUMCTX16_LOADREG(regname) pVM->cpum.s.Guest.regname = pCpumctx16->regname; 777 778 #define CPUMCTX16_LOADDRXREG(regname) pVM->cpum.s.Guest.dr[regname] = pCpumctx16->dr##regname; 777 779 778 780 #define CPUMCTX16_LOADHIDREG(regname) \ … … 819 821 CPUMCTX16_LOADREG(cr4); 820 822 821 CPUMCTX16_LOAD REG(dr0);822 CPUMCTX16_LOAD REG(dr1);823 CPUMCTX16_LOAD REG(dr2);824 CPUMCTX16_LOAD REG(dr3);825 CPUMCTX16_LOAD REG(dr4);826 CPUMCTX16_LOAD REG(dr5);827 CPUMCTX16_LOAD REG(dr6);828 CPUMCTX16_LOAD REG(dr7);823 CPUMCTX16_LOADDRXREG(0); 824 CPUMCTX16_LOADDRXREG(1); 825 CPUMCTX16_LOADDRXREG(2); 826 CPUMCTX16_LOADDRXREG(3); 827 CPUMCTX16_LOADDRXREG(4); 828 CPUMCTX16_LOADDRXREG(5); 829 CPUMCTX16_LOADDRXREG(6); 830 CPUMCTX16_LOADDRXREG(7); 829 831 830 832 pVM->cpum.s.Guest.gdtr.cbGdt = pCpumctx16->gdtr.cbGdt; … … 1115 1117 "%sss={%04x base=%016RX64 limit=%08x flags=%08x}\n" 1116 1118 "%scr0=%016RX64 %scr2=%016RX64 %scr3=%016RX64 %scr4=%016RX64\n" 1117 "%sdr 0=%016RX64 %sdr1=%016RX64 %sdr2=%016RX64 %sdr3=%016RX64\n"1118 "%sdr4=%016RX64 %sdr5=%016RX64 %sdr 6=%016RX64 %sdr7=%016RX64\n"1119 "%sdr[0]=%016RX64 %sdr[1]=%016RX64 %sdr[2]=%016RX64 %sdr[3]=%016RX64\n" 1120 "%sdr4=%016RX64 %sdr5=%016RX64 %sdr[6]=%016RX64 %sdr[7]=%016RX64\n" 1119 1121 "%sgdtr=%016RX64:%04x %sidtr=%016RX64:%04x %seflags=%08x\n" 1120 1122 "%sldtr={%04x base=%08RX64 limit=%08x flags=%08x}\n" … … 1133 1135 pszPrefix, (RTSEL)pCtxCore->ss, pCtx->ssHid.u64Base, pCtx->ssHid.u32Limit, pCtx->ssHid.Attr.u, 1134 1136 pszPrefix, pCtx->cr0, pszPrefix, pCtx->cr2, pszPrefix, pCtx->cr3, pszPrefix, pCtx->cr4, 1135 pszPrefix, pCtx->dr 0, pszPrefix, pCtx->dr1, pszPrefix, pCtx->dr2, pszPrefix, pCtx->dr3,1136 pszPrefix, pCtx->dr 4, pszPrefix, pCtx->dr5, pszPrefix, pCtx->dr6, pszPrefix, pCtx->dr7,1137 pszPrefix, pCtx->dr[0], pszPrefix, pCtx->dr[1], pszPrefix, pCtx->dr[2], pszPrefix, pCtx->dr[3], 1138 pszPrefix, pCtx->dr[4], pszPrefix, pCtx->dr[5], pszPrefix, pCtx->dr[6], pszPrefix, pCtx->dr[7], 1137 1139 pszPrefix, pCtx->gdtr.pGdt, pCtx->gdtr.cbGdt, pszPrefix, pCtx->idtr.pIdt, pCtx->idtr.cbIdt, pszPrefix, efl, 1138 1140 pszPrefix, (RTSEL)pCtx->ldtr, pCtx->ldtrHid.u64Base, pCtx->ldtrHid.u32Limit, pCtx->ldtrHid.Attr.u, … … 1144 1146 "%seax=%08x %sebx=%08x %secx=%08x %sedx=%08x %sesi=%08x %sedi=%08x\n" 1145 1147 "%seip=%08x %sesp=%08x %sebp=%08x %siopl=%d %*s\n" 1146 "%scs={%04x base=%016RX64 limit=%08x flags=%08x} %sdr 0=%08RX64 %sdr1=%08RX64\n"1147 "%sds={%04x base=%016RX64 limit=%08x flags=%08x} %sdr 2=%08RX64 %sdr3=%08RX64\n"1148 "%scs={%04x base=%016RX64 limit=%08x flags=%08x} %sdr[0]=%08RX64 %sdr[1]=%08RX64\n" 1149 "%sds={%04x base=%016RX64 limit=%08x flags=%08x} %sdr[2]=%08RX64 %sdr[3]=%08RX64\n" 1148 1150 "%ses={%04x base=%016RX64 limit=%08x flags=%08x} %sdr4=%08RX64 %sdr5=%08RX64\n" 1149 "%sfs={%04x base=%016RX64 limit=%08x flags=%08x} %sdr 6=%08RX64 %sdr7=%08RX64\n"1151 "%sfs={%04x base=%016RX64 limit=%08x flags=%08x} %sdr[6]=%08RX64 %sdr[7]=%08RX64\n" 1150 1152 "%sgs={%04x base=%016RX64 limit=%08x flags=%08x} %scr0=%08RX64 %scr2=%08RX64\n" 1151 1153 "%sss={%04x base=%016RX64 limit=%08x flags=%08x} %scr3=%08RX64 %scr4=%08RX64\n" … … 1157 1159 pszPrefix, pCtxCore->eax, pszPrefix, pCtxCore->ebx, pszPrefix, pCtxCore->ecx, pszPrefix, pCtxCore->edx, pszPrefix, pCtxCore->esi, pszPrefix, pCtxCore->edi, 1158 1160 pszPrefix, pCtxCore->eip, pszPrefix, pCtxCore->esp, pszPrefix, pCtxCore->ebp, pszPrefix, X86_EFL_GET_IOPL(efl), *pszPrefix ? 33 : 31, szEFlags, 1159 pszPrefix, (RTSEL)pCtxCore->cs, pCtx->csHid.u64Base, pCtx->csHid.u32Limit, pCtx->csHid.Attr.u, pszPrefix, pCtx->dr 0, pszPrefix, pCtx->dr1,1160 pszPrefix, (RTSEL)pCtxCore->ds, pCtx->dsHid.u64Base, pCtx->dsHid.u32Limit, pCtx->dsHid.Attr.u, pszPrefix, pCtx->dr 2, pszPrefix, pCtx->dr3,1161 pszPrefix, (RTSEL)pCtxCore->es, pCtx->esHid.u64Base, pCtx->esHid.u32Limit, pCtx->esHid.Attr.u, pszPrefix, pCtx->dr 4, pszPrefix, pCtx->dr5,1162 pszPrefix, (RTSEL)pCtxCore->fs, pCtx->fsHid.u64Base, pCtx->fsHid.u32Limit, pCtx->fsHid.Attr.u, pszPrefix, pCtx->dr 6, pszPrefix, pCtx->dr7,1161 pszPrefix, (RTSEL)pCtxCore->cs, pCtx->csHid.u64Base, pCtx->csHid.u32Limit, pCtx->csHid.Attr.u, pszPrefix, pCtx->dr[0], pszPrefix, pCtx->dr[1], 1162 pszPrefix, (RTSEL)pCtxCore->ds, pCtx->dsHid.u64Base, pCtx->dsHid.u32Limit, pCtx->dsHid.Attr.u, pszPrefix, pCtx->dr[2], pszPrefix, pCtx->dr[3], 1163 pszPrefix, (RTSEL)pCtxCore->es, pCtx->esHid.u64Base, pCtx->esHid.u32Limit, pCtx->esHid.Attr.u, pszPrefix, pCtx->dr[4], pszPrefix, pCtx->dr[5], 1164 pszPrefix, (RTSEL)pCtxCore->fs, pCtx->fsHid.u64Base, pCtx->fsHid.u32Limit, pCtx->fsHid.Attr.u, pszPrefix, pCtx->dr[6], pszPrefix, pCtx->dr[7], 1163 1165 pszPrefix, (RTSEL)pCtxCore->gs, pCtx->gsHid.u64Base, pCtx->gsHid.u32Limit, pCtx->gsHid.Attr.u, pszPrefix, pCtx->cr0, pszPrefix, pCtx->cr2, 1164 1166 pszPrefix, (RTSEL)pCtxCore->ss, pCtx->ssHid.u64Base, pCtx->ssHid.u32Limit, pCtx->ssHid.Attr.u, pszPrefix, pCtx->cr3, pszPrefix, pCtx->cr4, … … 1348 1350 "cs=%04x ds=%04x es=%04x fs=%04x gs=%04x eflags=%08x\n" 1349 1351 "cr0=%08RX64 cr2=xxxxxxxx cr3=%08RX64 cr4=%08RX64 gdtr=%08x:%04x ldtr=%04x\n" 1350 "dr 0=%08RX64 dr1=%08RX64x dr2=%08RX64 dr3=%08RX64x dr6=%08RX64 dr7=%08RX64\n"1352 "dr[0]=%08RX64 dr[1]=%08RX64x dr[2]=%08RX64 dr[3]=%08RX64x dr[6]=%08RX64 dr[7]=%08RX64\n" 1351 1353 "SysEnter={cs=%04x eip=%08x esp=%08x}\n" 1352 1354 , … … 1376 1378 "cr0=%016RX64 cr2=xxxxxxxxxxxxxxxx cr3=%016RX64\n" 1377 1379 "cr4=%016RX64 ldtr=%04x tr=%04x\n" 1378 "dr 0=%016RX64 dr1=%016RX64 dr2=%016RX64\n"1379 "dr 3=%016RX64 dr6=%016RX64 dr7=%016RX64\n"1380 "dr[0]=%016RX64 dr[1]=%016RX64 dr[2]=%016RX64\n" 1381 "dr[3]=%016RX64 dr[6]=%016RX64 dr[7]=%016RX64\n" 1380 1382 "gdtr=%016RX64:%04x idtr=%016RX64:%04x\n" 1381 1383 "SysEnter={cs=%04x eip=%08x esp=%08x}\n" -
trunk/src/VBox/VMM/CPUMInternal.mac
r10687 r12600 235 235 .Hyper.cr4 resq 1 236 236 237 .Hyper.dr0 resq 1 238 .Hyper.dr1 resq 1 239 .Hyper.dr2 resq 1 240 .Hyper.dr3 resq 1 241 .Hyper.dr4 resq 1 242 .Hyper.dr5 resq 1 243 .Hyper.dr6 resq 1 244 .Hyper.dr7 resq 1 237 .Hyper.dr resq 8 245 238 246 239 .Hyper.gdtr resb 10 ; GDT limit + linear address … … 346 339 .Guest.cr4 resq 1 347 340 348 .Guest.dr0 resq 1 349 .Guest.dr1 resq 1 350 .Guest.dr2 resq 1 351 .Guest.dr3 resq 1 352 .Guest.dr4 resq 1 353 .Guest.dr5 resq 1 354 .Guest.dr6 resq 1 355 .Guest.dr7 resq 1 341 .Guest.dr resq 8 356 342 357 343 .Guest.gdtr resb 10 ; GDT limit + linear address -
trunk/src/VBox/VMM/PATM/PATMPatch.cpp
r12285 r12600 1190 1190 pPB[1] = MAKE_MODRM(mod, reg, rm); 1191 1191 1192 /// @todo: make this an array in the context structure 1193 switch (dbgreg) 1194 { 1195 case USE_REG_DR0: 1196 offset = RT_OFFSETOF(CPUMCTX, dr0); 1197 break; 1198 case USE_REG_DR1: 1199 offset = RT_OFFSETOF(CPUMCTX, dr1); 1200 break; 1201 case USE_REG_DR2: 1202 offset = RT_OFFSETOF(CPUMCTX, dr2); 1203 break; 1204 case USE_REG_DR3: 1205 offset = RT_OFFSETOF(CPUMCTX, dr3); 1206 break; 1207 case USE_REG_DR4: 1208 offset = RT_OFFSETOF(CPUMCTX, dr4); 1209 break; 1210 case USE_REG_DR5: 1211 offset = RT_OFFSETOF(CPUMCTX, dr5); 1212 break; 1213 case USE_REG_DR6: 1214 offset = RT_OFFSETOF(CPUMCTX, dr6); 1215 break; 1216 case USE_REG_DR7: 1217 offset = RT_OFFSETOF(CPUMCTX, dr7); 1218 break; 1219 default: /* Shut up compiler warning. */ 1220 AssertFailed(); 1221 offset = 0; 1222 break; 1223 } 1192 AssertReturn(dbgreg <= USE_REG_DR7, VERR_INVALID_PARAMETER); 1193 offset = RT_OFFSETOF(CPUMCTX, dr[dbgreg]); 1194 1224 1195 *(RTRCPTR *)&pPB[2] = pVM->patm.s.pCPUMCtxGC + offset; 1225 1196 patmPatchAddReloc32(pVM, pPatch, &pPB[2], FIXUP_ABSOLUTE); -
trunk/src/VBox/VMM/PATM/PATMSSM.cpp
r11985 r12600 753 753 if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr0)) 754 754 { 755 LogFlow(("Changing dr 0 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr0)));756 *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr 0);755 LogFlow(("Changing dr[0] offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr[0]))); 756 *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr[0]); 757 757 } 758 758 else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr1)) 759 759 { 760 LogFlow(("Changing dr 1 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr1)));761 *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr 1);760 LogFlow(("Changing dr[1] offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr[1]))); 761 *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr[1]); 762 762 } 763 763 else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr2)) 764 764 { 765 LogFlow(("Changing dr 2 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr2)));766 *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr 2);765 LogFlow(("Changing dr[2] offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr[2]))); 766 *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr[2]); 767 767 } 768 768 else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr3)) 769 769 { 770 LogFlow(("Changing dr 3 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr3)));771 *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr 3);770 LogFlow(("Changing dr[3] offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr[3]))); 771 *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr[3]); 772 772 } 773 773 else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr4)) 774 774 { 775 LogFlow(("Changing dr 4 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr4)));776 *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr 4);775 LogFlow(("Changing dr[4] offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr[4]))); 776 *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr[4]); 777 777 } 778 778 else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr5)) 779 779 { 780 LogFlow(("Changing dr 5 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr5)));781 *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr 5);780 LogFlow(("Changing dr[5] offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr[5]))); 781 *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr[5]); 782 782 } 783 783 else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr6)) 784 784 { 785 LogFlow(("Changing dr 6 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr6)));786 *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr 6);785 LogFlow(("Changing dr[6] offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr[6]))); 786 *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr[6]); 787 787 } 788 788 else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr7)) 789 789 { 790 LogFlow(("Changing dr 7 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr7)));791 *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr 7);790 LogFlow(("Changing dr[7] offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr[7]))); 791 *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr[7]); 792 792 } 793 793 else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, cr0)) -
trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp
r12578 r12600 182 182 CPUMDECL(void) CPUMSetHyperDR0(PVM pVM, RTGCUINTREG uDr0) 183 183 { 184 pVM->cpum.s.Hyper.dr 0= uDr0;184 pVM->cpum.s.Hyper.dr[0] = uDr0; 185 185 /** @todo in GC we must load it! */ 186 186 } … … 188 188 CPUMDECL(void) CPUMSetHyperDR1(PVM pVM, RTGCUINTREG uDr1) 189 189 { 190 pVM->cpum.s.Hyper.dr 1= uDr1;190 pVM->cpum.s.Hyper.dr[1] = uDr1; 191 191 /** @todo in GC we must load it! */ 192 192 } … … 194 194 CPUMDECL(void) CPUMSetHyperDR2(PVM pVM, RTGCUINTREG uDr2) 195 195 { 196 pVM->cpum.s.Hyper.dr 2= uDr2;196 pVM->cpum.s.Hyper.dr[2] = uDr2; 197 197 /** @todo in GC we must load it! */ 198 198 } … … 200 200 CPUMDECL(void) CPUMSetHyperDR3(PVM pVM, RTGCUINTREG uDr3) 201 201 { 202 pVM->cpum.s.Hyper.dr 3= uDr3;202 pVM->cpum.s.Hyper.dr[3] = uDr3; 203 203 /** @todo in GC we must load it! */ 204 204 } … … 206 206 CPUMDECL(void) CPUMSetHyperDR6(PVM pVM, RTGCUINTREG uDr6) 207 207 { 208 pVM->cpum.s.Hyper.dr 6= uDr6;208 pVM->cpum.s.Hyper.dr[6] = uDr6; 209 209 /** @todo in GC we must load it! */ 210 210 } … … 212 212 CPUMDECL(void) CPUMSetHyperDR7(PVM pVM, RTGCUINTREG uDr7) 213 213 { 214 pVM->cpum.s.Hyper.dr 7= uDr7;214 pVM->cpum.s.Hyper.dr[7] = uDr7; 215 215 /** @todo in GC we must load it! */ 216 216 } … … 347 347 CPUMDECL(RTGCUINTREG) CPUMGetHyperDR0(PVM pVM) 348 348 { 349 return pVM->cpum.s.Hyper.dr 0;349 return pVM->cpum.s.Hyper.dr[0]; 350 350 } 351 351 352 352 CPUMDECL(RTGCUINTREG) CPUMGetHyperDR1(PVM pVM) 353 353 { 354 return pVM->cpum.s.Hyper.dr 1;354 return pVM->cpum.s.Hyper.dr[1]; 355 355 } 356 356 357 357 CPUMDECL(RTGCUINTREG) CPUMGetHyperDR2(PVM pVM) 358 358 { 359 return pVM->cpum.s.Hyper.dr 2;359 return pVM->cpum.s.Hyper.dr[2]; 360 360 } 361 361 362 362 CPUMDECL(RTGCUINTREG) CPUMGetHyperDR3(PVM pVM) 363 363 { 364 return pVM->cpum.s.Hyper.dr 3;364 return pVM->cpum.s.Hyper.dr[3]; 365 365 } 366 366 367 367 CPUMDECL(RTGCUINTREG) CPUMGetHyperDR6(PVM pVM) 368 368 { 369 return pVM->cpum.s.Hyper.dr 6;369 return pVM->cpum.s.Hyper.dr[6]; 370 370 } 371 371 372 372 CPUMDECL(RTGCUINTREG) CPUMGetHyperDR7(PVM pVM) 373 373 { 374 return pVM->cpum.s.Hyper.dr 7;374 return pVM->cpum.s.Hyper.dr[7]; 375 375 } 376 376 … … 888 888 CPUMDECL(uint64_t) CPUMGetGuestDR0(PVM pVM) 889 889 { 890 return pVM->cpum.s.Guest.dr 0;890 return pVM->cpum.s.Guest.dr[0]; 891 891 } 892 892 893 893 CPUMDECL(uint64_t) CPUMGetGuestDR1(PVM pVM) 894 894 { 895 return pVM->cpum.s.Guest.dr 1;895 return pVM->cpum.s.Guest.dr[1]; 896 896 } 897 897 898 898 CPUMDECL(uint64_t) CPUMGetGuestDR2(PVM pVM) 899 899 { 900 return pVM->cpum.s.Guest.dr 2;900 return pVM->cpum.s.Guest.dr[2]; 901 901 } 902 902 903 903 CPUMDECL(uint64_t) CPUMGetGuestDR3(PVM pVM) 904 904 { 905 return pVM->cpum.s.Guest.dr 3;905 return pVM->cpum.s.Guest.dr[3]; 906 906 } 907 907 908 908 CPUMDECL(uint64_t) CPUMGetGuestDR6(PVM pVM) 909 909 { 910 return pVM->cpum.s.Guest.dr 6;910 return pVM->cpum.s.Guest.dr[6]; 911 911 } 912 912 913 913 CPUMDECL(uint64_t) CPUMGetGuestDR7(PVM pVM) 914 914 { 915 return pVM->cpum.s.Guest.dr7; 916 } 917 918 /** @todo drx should be an array */ 915 return pVM->cpum.s.Guest.dr[7]; 916 } 917 919 918 CPUMDECL(int) CPUMGetGuestDRx(PVM pVM, uint32_t iReg, uint64_t *pValue) 920 919 { 921 switch (iReg) 922 { 923 case USE_REG_DR0: 924 *pValue = pVM->cpum.s.Guest.dr0; 925 break; 926 case USE_REG_DR1: 927 *pValue = pVM->cpum.s.Guest.dr1; 928 break; 929 case USE_REG_DR2: 930 *pValue = pVM->cpum.s.Guest.dr2; 931 break; 932 case USE_REG_DR3: 933 *pValue = pVM->cpum.s.Guest.dr3; 934 break; 935 case USE_REG_DR4: 936 case USE_REG_DR6: 937 *pValue = pVM->cpum.s.Guest.dr6; 938 break; 939 case USE_REG_DR5: 940 case USE_REG_DR7: 941 *pValue = pVM->cpum.s.Guest.dr7; 942 break; 943 944 default: 945 return VERR_INVALID_PARAMETER; 946 } 920 AssertReturn(iReg <= USE_REG_DR7, VERR_INVALID_PARAMETER); 921 *pValue = pVM->cpum.s.Guest.dr[iReg]; 947 922 return VINF_SUCCESS; 948 923 } … … 1311 1286 CPUMDECL(int) CPUMSetGuestDR0(PVM pVM, uint64_t uDr0) 1312 1287 { 1313 pVM->cpum.s.Guest.dr 0= uDr0;1288 pVM->cpum.s.Guest.dr[0] = uDr0; 1314 1289 return CPUMRecalcHyperDRx(pVM); 1315 1290 } … … 1317 1292 CPUMDECL(int) CPUMSetGuestDR1(PVM pVM, uint64_t uDr1) 1318 1293 { 1319 pVM->cpum.s.Guest.dr 1= uDr1;1294 pVM->cpum.s.Guest.dr[1] = uDr1; 1320 1295 return CPUMRecalcHyperDRx(pVM); 1321 1296 } … … 1323 1298 CPUMDECL(int) CPUMSetGuestDR2(PVM pVM, uint64_t uDr2) 1324 1299 { 1325 pVM->cpum.s.Guest.dr 2= uDr2;1300 pVM->cpum.s.Guest.dr[2] = uDr2; 1326 1301 return CPUMRecalcHyperDRx(pVM); 1327 1302 } … … 1329 1304 CPUMDECL(int) CPUMSetGuestDR3(PVM pVM, uint64_t uDr3) 1330 1305 { 1331 pVM->cpum.s.Guest.dr 3= uDr3;1306 pVM->cpum.s.Guest.dr[3] = uDr3; 1332 1307 return CPUMRecalcHyperDRx(pVM); 1333 1308 } … … 1335 1310 CPUMDECL(int) CPUMSetGuestDR6(PVM pVM, uint64_t uDr6) 1336 1311 { 1337 pVM->cpum.s.Guest.dr 6= uDr6;1312 pVM->cpum.s.Guest.dr[6] = uDr6; 1338 1313 return CPUMRecalcHyperDRx(pVM); 1339 1314 } … … 1341 1316 CPUMDECL(int) CPUMSetGuestDR7(PVM pVM, uint64_t uDr7) 1342 1317 { 1343 pVM->cpum.s.Guest.dr 7= uDr7;1318 pVM->cpum.s.Guest.dr[7] = uDr7; 1344 1319 return CPUMRecalcHyperDRx(pVM); 1345 1320 } 1346 1321 1347 /** @todo drx should be an array */1348 1322 CPUMDECL(int) CPUMSetGuestDRx(PVM pVM, uint32_t iReg, uint64_t Value) 1349 1323 { 1350 switch (iReg) 1351 { 1352 case USE_REG_DR0: 1353 pVM->cpum.s.Guest.dr0 = Value; 1354 break; 1355 case USE_REG_DR1: 1356 pVM->cpum.s.Guest.dr1 = Value; 1357 break; 1358 case USE_REG_DR2: 1359 pVM->cpum.s.Guest.dr2 = Value; 1360 break; 1361 case USE_REG_DR3: 1362 pVM->cpum.s.Guest.dr3 = Value; 1363 break; 1364 case USE_REG_DR4: 1365 case USE_REG_DR6: 1366 pVM->cpum.s.Guest.dr6 = Value; 1367 break; 1368 case USE_REG_DR5: 1369 case USE_REG_DR7: 1370 pVM->cpum.s.Guest.dr7 = Value; 1371 break; 1372 1373 default: 1374 return VERR_INVALID_PARAMETER; 1375 } 1324 AssertReturn(iReg <= USE_REG_DR7, VERR_INVALID_PARAMETER); 1325 pVM->cpum.s.Guest.dr[iReg] = Value; 1376 1326 return CPUMRecalcHyperDRx(pVM); 1377 1327 } … … 1425 1375 } 1426 1376 else 1427 uNewDr0 = pVM->cpum.s.Hyper.dr 0;1377 uNewDr0 = pVM->cpum.s.Hyper.dr[0]; 1428 1378 1429 1379 /* bp 1 */ … … 1440 1390 } 1441 1391 else 1442 uNewDr1 = pVM->cpum.s.Hyper.dr 1;1392 uNewDr1 = pVM->cpum.s.Hyper.dr[1]; 1443 1393 1444 1394 /* bp 2 */ … … 1455 1405 } 1456 1406 else 1457 uNewDr2 = pVM->cpum.s.Hyper.dr 2;1407 uNewDr2 = pVM->cpum.s.Hyper.dr[2]; 1458 1408 1459 1409 /* bp 3 */ … … 1470 1420 } 1471 1421 else 1472 uNewDr3 = pVM->cpum.s.Hyper.dr 3;1422 uNewDr3 = pVM->cpum.s.Hyper.dr[3]; 1473 1423 1474 1424 /* … … 1482 1432 #endif 1483 1433 pVM->cpum.s.fUseFlags |= CPUM_USE_DEBUG_REGS; 1484 if (uNewDr3 != pVM->cpum.s.Hyper.dr 3)1434 if (uNewDr3 != pVM->cpum.s.Hyper.dr[3]) 1485 1435 CPUMSetHyperDR3(pVM, uNewDr3); 1486 if (uNewDr2 != pVM->cpum.s.Hyper.dr 2)1436 if (uNewDr2 != pVM->cpum.s.Hyper.dr[2]) 1487 1437 CPUMSetHyperDR2(pVM, uNewDr2); 1488 if (uNewDr1 != pVM->cpum.s.Hyper.dr 1)1438 if (uNewDr1 != pVM->cpum.s.Hyper.dr[1]) 1489 1439 CPUMSetHyperDR1(pVM, uNewDr1); 1490 if (uNewDr0 != pVM->cpum.s.Hyper.dr 0)1440 if (uNewDr0 != pVM->cpum.s.Hyper.dr[0]) 1491 1441 CPUMSetHyperDR0(pVM, uNewDr0); 1492 if (uNewDr7 != pVM->cpum.s.Hyper.dr 7)1442 if (uNewDr7 != pVM->cpum.s.Hyper.dr[7]) 1493 1443 CPUMSetHyperDR7(pVM, uNewDr7); 1494 1444 } … … 1504 1454 } 1505 1455 Log2(("CPUMRecalcHyperDRx: fUseFlags=%#x %RGr %RGr %RGr %RGr %RGr %RGr\n", 1506 pVM->cpum.s.fUseFlags, pVM->cpum.s.Hyper.dr 0, pVM->cpum.s.Hyper.dr1,1507 pVM->cpum.s.Hyper.dr 2, pVM->cpum.s.Hyper.dr3, pVM->cpum.s.Hyper.dr6,1508 pVM->cpum.s.Hyper.dr 7));1456 pVM->cpum.s.fUseFlags, pVM->cpum.s.Hyper.dr[0], pVM->cpum.s.Hyper.dr[1], 1457 pVM->cpum.s.Hyper.dr[2], pVM->cpum.s.Hyper.dr[3], pVM->cpum.s.Hyper.dr[6], 1458 pVM->cpum.s.Hyper.dr[7])); 1509 1459 1510 1460 return VINF_SUCCESS; -
trunk/src/VBox/VMM/VMMR0/CPUMR0.cpp
r12593 r12600 287 287 288 288 /* Save the guest's debug state. The caller is responsible for DR7. */ 289 pCtx->dr 0= ASMGetDR0();290 pCtx->dr 1= ASMGetDR1();291 pCtx->dr 2= ASMGetDR2();292 pCtx->dr 3= ASMGetDR3();289 pCtx->dr[0] = ASMGetDR0(); 290 pCtx->dr[1] = ASMGetDR1(); 291 pCtx->dr[2] = ASMGetDR2(); 292 pCtx->dr[3] = ASMGetDR3(); 293 293 if (fDR6) 294 pCtx->dr 6= ASMGetDR6();294 pCtx->dr[6] = ASMGetDR6(); 295 295 296 296 /* Restore the host's debug state. DR0-3, DR6 and only then DR7! … … 331 331 332 332 /* Activate the guest state DR0-3; DR7 is left to the caller. */ 333 ASMSetDR0(pCtx->dr 0);334 ASMSetDR1(pCtx->dr 1);335 ASMSetDR2(pCtx->dr 2);336 ASMSetDR3(pCtx->dr 3);333 ASMSetDR0(pCtx->dr[0]); 334 ASMSetDR1(pCtx->dr[1]); 335 ASMSetDR2(pCtx->dr[2]); 336 ASMSetDR3(pCtx->dr[3]); 337 337 if (fDR6) 338 ASMSetDR6(pCtx->dr 6);338 ASMSetDR6(pCtx->dr[6]); 339 339 340 340 pVM->cpum.s.fUseFlags |= CPUM_USE_DEBUG_REGS; -
trunk/src/VBox/VMM/VMMR0/HWACCMR0.cpp
r12578 r12600 1062 1062 (RTSEL)pCtx->ss, pCtx->ssHid.u64Base, pCtx->ssHid.u32Limit, pCtx->ssHid.Attr.u, 1063 1063 pCtx->cr0, pCtx->cr2, pCtx->cr3, pCtx->cr4, 1064 pCtx->dr 0, pCtx->dr1, pCtx->dr2, pCtx->dr3,1065 pCtx->dr 4, pCtx->dr5, pCtx->dr6, pCtx->dr7,1064 pCtx->dr[0], pCtx->dr[1], pCtx->dr[2], pCtx->dr[3], 1065 pCtx->dr[4], pCtx->dr[5], pCtx->dr[6], pCtx->dr[7], 1066 1066 pCtx->gdtr.pGdt, pCtx->gdtr.cbGdt, pCtx->idtr.pIdt, pCtx->idtr.cbIdt, efl, 1067 1067 (RTSEL)pCtx->ldtr, pCtx->ldtrHid.u64Base, pCtx->ldtrHid.u32Limit, pCtx->ldtrHid.Attr.u, … … 1085 1085 pCtx->eax, pCtx->ebx, pCtx->ecx, pCtx->edx, pCtx->esi, pCtx->edi, 1086 1086 pCtx->eip, pCtx->esp, pCtx->ebp, X86_EFL_GET_IOPL(efl), 31, szEFlags, 1087 (RTSEL)pCtx->cs, pCtx->csHid.u64Base, pCtx->csHid.u32Limit, pCtx->csHid.Attr.u, pCtx->dr 0, pCtx->dr1,1088 (RTSEL)pCtx->ds, pCtx->dsHid.u64Base, pCtx->dsHid.u32Limit, pCtx->dsHid.Attr.u, pCtx->dr 2, pCtx->dr3,1089 (RTSEL)pCtx->es, pCtx->esHid.u64Base, pCtx->esHid.u32Limit, pCtx->esHid.Attr.u, pCtx->dr 4, pCtx->dr5,1090 (RTSEL)pCtx->fs, pCtx->fsHid.u64Base, pCtx->fsHid.u32Limit, pCtx->fsHid.Attr.u, pCtx->dr 6, pCtx->dr7,1087 (RTSEL)pCtx->cs, pCtx->csHid.u64Base, pCtx->csHid.u32Limit, pCtx->csHid.Attr.u, pCtx->dr[0], pCtx->dr[1], 1088 (RTSEL)pCtx->ds, pCtx->dsHid.u64Base, pCtx->dsHid.u32Limit, pCtx->dsHid.Attr.u, pCtx->dr[2], pCtx->dr[3], 1089 (RTSEL)pCtx->es, pCtx->esHid.u64Base, pCtx->esHid.u32Limit, pCtx->esHid.Attr.u, pCtx->dr[4], pCtx->dr[5], 1090 (RTSEL)pCtx->fs, pCtx->fsHid.u64Base, pCtx->fsHid.u32Limit, pCtx->fsHid.Attr.u, pCtx->dr[6], pCtx->dr[7], 1091 1091 (RTSEL)pCtx->gs, pCtx->gsHid.u64Base, pCtx->gsHid.u32Limit, pCtx->gsHid.Attr.u, pCtx->cr0, pCtx->cr2, 1092 1092 (RTSEL)pCtx->ss, pCtx->ssHid.u64Base, pCtx->ssHid.u32Limit, pCtx->ssHid.Attr.u, pCtx->cr3, pCtx->cr4, -
trunk/src/VBox/VMM/VMMR0/HWSVMR0.cpp
r12578 r12600 686 686 if (pVM->hwaccm.s.fContextUseFlags & HWACCM_CHANGED_GUEST_DEBUG) 687 687 { 688 pCtx->dr 6|= X86_DR6_INIT_VAL; /* set all reserved bits to 1. */689 pCtx->dr 6&= ~RT_BIT(12); /* must be zero. */690 691 pCtx->dr 7&= 0xffffffff; /* upper 32 bits reserved */692 pCtx->dr 7&= ~(RT_BIT(11) | RT_BIT(12) | RT_BIT(14) | RT_BIT(15)); /* must be zero */693 pCtx->dr 7|= 0x400; /* must be one */694 695 pVMCB->guest.u64DR7 = pCtx->dr 7;696 pVMCB->guest.u64DR6 = pCtx->dr 6;688 pCtx->dr[6] |= X86_DR6_INIT_VAL; /* set all reserved bits to 1. */ 689 pCtx->dr[6] &= ~RT_BIT(12); /* must be zero. */ 690 691 pCtx->dr[7] &= 0xffffffff; /* upper 32 bits reserved */ 692 pCtx->dr[7] &= ~(RT_BIT(11) | RT_BIT(12) | RT_BIT(14) | RT_BIT(15)); /* must be zero */ 693 pCtx->dr[7] |= 0x400; /* must be one */ 694 695 pVMCB->guest.u64DR7 = pCtx->dr[7]; 696 pVMCB->guest.u64DR6 = pCtx->dr[6]; 697 697 698 698 /* Sync the debug state now if any breakpoint is armed. */ 699 if ( (pCtx->dr 7& (X86_DR7_ENABLED_MASK|X86_DR7_GD))699 if ( (pCtx->dr[7] & (X86_DR7_ENABLED_MASK|X86_DR7_GD)) 700 700 && !CPUMIsGuestDebugStateActive(pVM) 701 701 && !DBGFIsStepping(pVM)) … … 1217 1217 1218 1218 /* Sync back DR6 as it could have been changed by hitting breakpoints. */ 1219 pCtx->dr 6= pVMCB->guest.u64DR6;1219 pCtx->dr[6] = pVMCB->guest.u64DR6; 1220 1220 /* DR7.GD can be cleared by debug exceptions, so sync it back as well. */ 1221 pCtx->dr 7= pVMCB->guest.u64DR7;1221 pCtx->dr[7] = pVMCB->guest.u64DR7; 1222 1222 1223 1223 /* Check if an injected event was interrupted prematurely. */ … … 1287 1287 Assert(DBGFIsStepping(pVM)); 1288 1288 1289 rc = DBGFR0Trap01Handler(pVM, CPUMCTX2CORE(pCtx), pCtx->dr 6);1289 rc = DBGFR0Trap01Handler(pVM, CPUMCTX2CORE(pCtx), pCtx->dr[6]); 1290 1290 if (rc == VINF_EM_RAW_GUEST_TRAP) 1291 1291 { -
trunk/src/VBox/VMM/VMMR0/HWVMXR0.cpp
r12578 r12600 968 968 if (pVM->hwaccm.s.fContextUseFlags & HWACCM_CHANGED_GUEST_DEBUG) 969 969 { 970 pCtx->dr 6|= X86_DR6_INIT_VAL; /* set all reserved bits to 1. */971 pCtx->dr 6&= ~RT_BIT(12); /* must be zero. */972 973 pCtx->dr 7&= 0xffffffff; /* upper 32 bits reserved */974 pCtx->dr 7&= ~(RT_BIT(11) | RT_BIT(12) | RT_BIT(14) | RT_BIT(15)); /* must be zero */975 pCtx->dr 7|= 0x400; /* must be one */970 pCtx->dr[6] |= X86_DR6_INIT_VAL; /* set all reserved bits to 1. */ 971 pCtx->dr[6] &= ~RT_BIT(12); /* must be zero. */ 972 973 pCtx->dr[7] &= 0xffffffff; /* upper 32 bits reserved */ 974 pCtx->dr[7] &= ~(RT_BIT(11) | RT_BIT(12) | RT_BIT(14) | RT_BIT(15)); /* must be zero */ 975 pCtx->dr[7] |= 0x400; /* must be one */ 976 976 977 977 /* Resync DR7 */ 978 rc = VMXWriteVMCS(VMX_VMCS_GUEST_DR7, pCtx->dr 7);978 rc = VMXWriteVMCS(VMX_VMCS_GUEST_DR7, pCtx->dr[7]); 979 979 AssertRC(rc); 980 980 981 981 /* Sync the debug state now if any breakpoint is armed. */ 982 if ( (pCtx->dr 7& (X86_DR7_ENABLED_MASK|X86_DR7_GD))982 if ( (pCtx->dr[7] & (X86_DR7_ENABLED_MASK|X86_DR7_GD)) 983 983 && !CPUMIsGuestDebugStateActive(pVM) 984 984 && !DBGFIsStepping(pVM)) … … 1549 1549 /* Sync back DR7 here. */ 1550 1550 VMXReadVMCS(VMX_VMCS_GUEST_DR7, &val); 1551 pCtx->dr 7= val;1551 pCtx->dr[7] = val; 1552 1552 1553 1553 /* Guest CPU context: ES, CS, SS, DS, FS, GS. */ … … 1780 1780 { 1781 1781 /* Update DR6 here. */ 1782 pCtx->dr 6= uDR6;1782 pCtx->dr[6] = uDR6; 1783 1783 1784 1784 /* X86_DR7_GD will be cleared if drx accesses should be trapped inside the guest. */ 1785 pCtx->dr 7&= ~X86_DR7_GD;1785 pCtx->dr[7] &= ~X86_DR7_GD; 1786 1786 1787 1787 /* Paranoia. */ 1788 pCtx->dr 7&= 0xffffffff; /* upper 32 bits reserved */1789 pCtx->dr 7&= ~(RT_BIT(11) | RT_BIT(12) | RT_BIT(14) | RT_BIT(15)); /* must be zero */1790 pCtx->dr 7|= 0x400; /* must be one */1788 pCtx->dr[7] &= 0xffffffff; /* upper 32 bits reserved */ 1789 pCtx->dr[7] &= ~(RT_BIT(11) | RT_BIT(12) | RT_BIT(14) | RT_BIT(15)); /* must be zero */ 1790 pCtx->dr[7] |= 0x400; /* must be one */ 1791 1791 1792 1792 /* Resync DR7 */ 1793 rc = VMXWriteVMCS(VMX_VMCS_GUEST_DR7, pCtx->dr 7);1793 rc = VMXWriteVMCS(VMX_VMCS_GUEST_DR7, pCtx->dr[7]); 1794 1794 AssertRC(rc); 1795 1795 … … 2063 2063 VMX_EXIT_QUALIFICATION_DRX_GENREG(exitQualification)); 2064 2064 pVM->hwaccm.s.fContextUseFlags |= HWACCM_CHANGED_GUEST_DEBUG; 2065 Log2(("DR7=%08x\n", pCtx->dr 7));2065 Log2(("DR7=%08x\n", pCtx->dr[7])); 2066 2066 } 2067 2067 else … … 2107 2107 rc = fIOWrite ? VINF_IOM_HC_IOPORT_WRITE : VINF_IOM_HC_IOPORT_READ; 2108 2108 break; 2109 } 2110 2111 /* If any IO breakpoints are armed, then we should check if a debug trap needs to be generated. */ 2112 if ( (pCtx->dr[7] & (X86_DR7_ENABLED_MASK|X86_DR7_IO_ENABLED_MASK)) & X86_DR7_IO_ENABLED_MASK) 2113 { 2114 if ( (pCtx->dr[7] & (X86_DR7_L0|X86_DR7_G0)) 2115 && (pCtx->dr[7] & X86_DR7_RW(0, X86_DR7_RW_IO)) 2116 && pCtx->dr[0] == uPort) 2117 { 2118 } 2109 2119 } 2110 2120 -
trunk/src/VBox/VMM/VMMSwitcher/AMD64ToPAE.asm
r9411 r12600 518 518 DEBUG_S_CHAR('x') 519 519 ; load hyper DR0-7 520 mov ebx, [edx + CPUM.Hyper.dr 0]520 mov ebx, [edx + CPUM.Hyper.dr] 521 521 mov dr0, ebx 522 mov ecx, [edx + CPUM.Hyper.dr 1]522 mov ecx, [edx + CPUM.Hyper.dr + 4*1] 523 523 mov dr1, ecx 524 mov eax, [edx + CPUM.Hyper.dr 2]524 mov eax, [edx + CPUM.Hyper.dr + 4*2] 525 525 mov dr2, eax 526 mov ebx, [edx + CPUM.Hyper.dr 3]526 mov ebx, [edx + CPUM.Hyper.dr + 4*3] 527 527 mov dr3, ebx 528 ;mov eax, [edx + CPUM.Hyper.dr 6]528 ;mov eax, [edx + CPUM.Hyper.dr + 4*6] 529 529 mov ecx, 0ffff0ff0h 530 530 mov dr6, ecx 531 mov eax, [edx + CPUM.Hyper.dr 7]531 mov eax, [edx + CPUM.Hyper.dr + 4*7] 532 532 mov dr7, eax 533 533 jmp htg_debug_regs_guest_no -
trunk/src/VBox/VMM/VMMSwitcher/PAEand32Bit.mac
r9669 r12600 414 414 mov [edx + CPUM.Host.dr3], eax 415 415 ; load hyper DR0-7 416 mov ebx, [edx + CPUM.Hyper.dr 0]416 mov ebx, [edx + CPUM.Hyper.dr] 417 417 mov dr0, ebx 418 mov ecx, [edx + CPUM.Hyper.dr 1]418 mov ecx, [edx + CPUM.Hyper.dr + 4*1] 419 419 mov dr1, ecx 420 mov eax, [edx + CPUM.Hyper.dr 2]420 mov eax, [edx + CPUM.Hyper.dr + 4*2] 421 421 mov dr2, eax 422 mov ebx, [edx + CPUM.Hyper.dr 3]422 mov ebx, [edx + CPUM.Hyper.dr + 4*3] 423 423 mov dr3, ebx 424 ;mov eax, [edx + CPUM.Hyper.dr 6]424 ;mov eax, [edx + CPUM.Hyper.dr + 4*6] 425 425 mov ecx, 0ffff0ff0h 426 426 mov dr6, ecx 427 mov eax, [edx + CPUM.Hyper.dr 7]427 mov eax, [edx + CPUM.Hyper.dr + 4*7] 428 428 mov dr7, eax 429 429 jmp htg_debug_regs_guest_no -
trunk/src/recompiler/VBoxRecompiler.c
r12549 r12600 1612 1612 register unsigned fFlags; 1613 1613 bool fHiddenSelRegsValid = CPUMAreHiddenSelRegsValid(pVM); 1614 unsigned i; 1614 1615 1615 1616 Assert(!pVM->rem.s.fInREM); … … 1680 1681 1681 1682 /** @todo we could probably benefit from using a CPUM_CHANGED_DRx flag too! */ 1682 pVM->rem.s.Env.dr[0] = pCtx->dr0; 1683 pVM->rem.s.Env.dr[1] = pCtx->dr1; 1684 pVM->rem.s.Env.dr[2] = pCtx->dr2; 1685 pVM->rem.s.Env.dr[3] = pCtx->dr3; 1686 pVM->rem.s.Env.dr[4] = pCtx->dr4; 1687 pVM->rem.s.Env.dr[5] = pCtx->dr5; 1688 pVM->rem.s.Env.dr[6] = pCtx->dr6; 1689 pVM->rem.s.Env.dr[7] = pCtx->dr7; 1683 for (i=0;i<8;i++) 1684 pVM->rem.s.Env.dr[i] = pCtx->dr[i]; 1690 1685 1691 1686 /* … … 2064 2059 STAM_PROFILE_START(&pVM->rem.s.StatsStateBack, a); 2065 2060 register PCPUMCTX pCtx = pVM->rem.s.pCtx; 2061 unsigned i; 2066 2062 2067 2063 /* … … 2162 2158 pCtx->cr4 = pVM->rem.s.Env.cr[4]; 2163 2159 2164 pCtx->dr0 = pVM->rem.s.Env.dr[0]; 2165 pCtx->dr1 = pVM->rem.s.Env.dr[1]; 2166 pCtx->dr2 = pVM->rem.s.Env.dr[2]; 2167 pCtx->dr3 = pVM->rem.s.Env.dr[3]; 2168 pCtx->dr4 = pVM->rem.s.Env.dr[4]; 2169 pCtx->dr5 = pVM->rem.s.Env.dr[5]; 2170 pCtx->dr6 = pVM->rem.s.Env.dr[6]; 2171 pCtx->dr7 = pVM->rem.s.Env.dr[7]; 2160 for (i=0;i<8;i++) 2161 pCtx->dr[i] = pVM->rem.s.Env.dr[i]; 2172 2162 2173 2163 pCtx->gdtr.cbGdt = pVM->rem.s.Env.gdt.limit; … … 2292 2282 Assert(pVM->rem.s.fInREM); 2293 2283 register PCPUMCTX pCtx = pVM->rem.s.pCtx; 2284 unsigned i; 2294 2285 2295 2286 /* … … 2362 2353 pCtx->cr4 = pVM->rem.s.Env.cr[4]; 2363 2354 2364 pCtx->dr0 = pVM->rem.s.Env.dr[0]; 2365 pCtx->dr1 = pVM->rem.s.Env.dr[1]; 2366 pCtx->dr2 = pVM->rem.s.Env.dr[2]; 2367 pCtx->dr3 = pVM->rem.s.Env.dr[3]; 2368 pCtx->dr4 = pVM->rem.s.Env.dr[4]; 2369 pCtx->dr5 = pVM->rem.s.Env.dr[5]; 2370 pCtx->dr6 = pVM->rem.s.Env.dr[6]; 2371 pCtx->dr7 = pVM->rem.s.Env.dr[7]; 2355 for (i=0;i<8;i++) 2356 pCtx->dr[i] = pVM->rem.s.Env.dr[i]; 2372 2357 2373 2358 pCtx->gdtr.cbGdt = pVM->rem.s.Env.gdt.limit;
Note:
See TracChangeset
for help on using the changeset viewer.