VirtualBox

Changeset 12600 in vbox


Ignore:
Timestamp:
Sep 19, 2008 1:07:44 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
36853
Message:

Turned dr0..dr7 into an array.

Location:
trunk
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/cpum.h

    r12578 r12600  
    307307    /** Debug registers.
    308308     * @{ */
    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];
    317310    /* DR8-15 are currently not supported */
    318311    /** @} */
  • trunk/include/VBox/cpum.mac

    r10648 r12600  
    164164    .cr4            resq    1
    165165
    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
    174167
    175168    .gdtr           resb    10          ; GDT limit + linear address
  • trunk/include/VBox/x86.h

    r12578 r12600  
    721721#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))
    722722
     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
    723726/** Value of DR7 after powerup/reset. */
    724727#define X86_DR7_INIT_VAL                    0x400
  • trunk/src/VBox/VMM/CPUM.cpp

    r12578 r12600  
    708708    pCtx->trHid.Attr.n.u4Type       = X86_SEL_TYPE_SYS_386_TSS_BUSY;
    709709
    710     pCtx->dr                     = X86_DR6_INIT_VAL;
    711     pCtx->dr                     = X86_DR7_INIT_VAL;
     710    pCtx->dr[6]                     = X86_DR6_INIT_VAL;
     711    pCtx->dr[7]                     = X86_DR7_INIT_VAL;
    712712
    713713    pCtx->fpu.FTW                   = 0xff;         /* All tags are set, i.e. the regs are empty. */
     
    775775{
    776776#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;
    777779
    778780#define CPUMCTX16_LOADHIDREG(regname)                                                   \
     
    819821    CPUMCTX16_LOADREG(cr4);
    820822
    821     CPUMCTX16_LOADREG(dr0);
    822     CPUMCTX16_LOADREG(dr1);
    823     CPUMCTX16_LOADREG(dr2);
    824     CPUMCTX16_LOADREG(dr3);
    825     CPUMCTX16_LOADREG(dr4);
    826     CPUMCTX16_LOADREG(dr5);
    827     CPUMCTX16_LOADREG(dr6);
    828     CPUMCTX16_LOADREG(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);
    829831
    830832    pVM->cpum.s.Guest.gdtr.cbGdt   = pCpumctx16->gdtr.cbGdt;
     
    11151117                    "%sss={%04x base=%016RX64 limit=%08x flags=%08x}\n"
    11161118                    "%scr0=%016RX64 %scr2=%016RX64 %scr3=%016RX64 %scr4=%016RX64\n"
    1117                     "%sdr0=%016RX64 %sdr1=%016RX64 %sdr2=%016RX64 %sdr3=%016RX64\n"
    1118                     "%sdr4=%016RX64 %sdr5=%016RX64 %sdr6=%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"
    11191121                    "%sgdtr=%016RX64:%04x  %sidtr=%016RX64:%04x  %seflags=%08x\n"
    11201122                    "%sldtr={%04x base=%08RX64 limit=%08x flags=%08x}\n"
     
    11331135                    pszPrefix, (RTSEL)pCtxCore->ss, pCtx->ssHid.u64Base, pCtx->ssHid.u32Limit, pCtx->ssHid.Attr.u,
    11341136                    pszPrefix, pCtx->cr0,  pszPrefix, pCtx->cr2, pszPrefix, pCtx->cr3,  pszPrefix, pCtx->cr4,
    1135                     pszPrefix, pCtx->dr0,  pszPrefix, pCtx->dr1, pszPrefix, pCtx->dr2,  pszPrefix, pCtx->dr3,
    1136                     pszPrefix, pCtx->dr4,  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],
    11371139                    pszPrefix, pCtx->gdtr.pGdt, pCtx->gdtr.cbGdt, pszPrefix, pCtx->idtr.pIdt, pCtx->idtr.cbIdt, pszPrefix, efl,
    11381140                    pszPrefix, (RTSEL)pCtx->ldtr, pCtx->ldtrHid.u64Base, pCtx->ldtrHid.u32Limit, pCtx->ldtrHid.Attr.u,
     
    11441146                    "%seax=%08x %sebx=%08x %secx=%08x %sedx=%08x %sesi=%08x %sedi=%08x\n"
    11451147                    "%seip=%08x %sesp=%08x %sebp=%08x %siopl=%d %*s\n"
    1146                     "%scs={%04x base=%016RX64 limit=%08x flags=%08x} %sdr0=%08RX64 %sdr1=%08RX64\n"
    1147                     "%sds={%04x base=%016RX64 limit=%08x flags=%08x} %sdr2=%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"
    11481150                    "%ses={%04x base=%016RX64 limit=%08x flags=%08x} %sdr4=%08RX64 %sdr5=%08RX64\n"
    1149                     "%sfs={%04x base=%016RX64 limit=%08x flags=%08x} %sdr6=%08RX64 %sdr7=%08RX64\n"
     1151                    "%sfs={%04x base=%016RX64 limit=%08x flags=%08x} %sdr[6]=%08RX64 %sdr[7]=%08RX64\n"
    11501152                    "%sgs={%04x base=%016RX64 limit=%08x flags=%08x} %scr0=%08RX64 %scr2=%08RX64\n"
    11511153                    "%sss={%04x base=%016RX64 limit=%08x flags=%08x} %scr3=%08RX64 %scr4=%08RX64\n"
     
    11571159                    pszPrefix, pCtxCore->eax, pszPrefix, pCtxCore->ebx, pszPrefix, pCtxCore->ecx, pszPrefix, pCtxCore->edx, pszPrefix, pCtxCore->esi, pszPrefix, pCtxCore->edi,
    11581160                    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->dr0,  pszPrefix, pCtx->dr1,
    1160                     pszPrefix, (RTSEL)pCtxCore->ds, pCtx->dsHid.u64Base, pCtx->dsHid.u32Limit, pCtx->dsHid.Attr.u, pszPrefix, pCtx->dr2,  pszPrefix, pCtx->dr3,
    1161                     pszPrefix, (RTSEL)pCtxCore->es, pCtx->esHid.u64Base, pCtx->esHid.u32Limit, pCtx->esHid.Attr.u, pszPrefix, pCtx->dr4,  pszPrefix, pCtx->dr5,
    1162                     pszPrefix, (RTSEL)pCtxCore->fs, pCtx->fsHid.u64Base, pCtx->fsHid.u32Limit, pCtx->fsHid.Attr.u, pszPrefix, pCtx->dr6,  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],
    11631165                    pszPrefix, (RTSEL)pCtxCore->gs, pCtx->gsHid.u64Base, pCtx->gsHid.u32Limit, pCtx->gsHid.Attr.u, pszPrefix, pCtx->cr0,  pszPrefix, pCtx->cr2,
    11641166                    pszPrefix, (RTSEL)pCtxCore->ss, pCtx->ssHid.u64Base, pCtx->ssHid.u32Limit, pCtx->ssHid.Attr.u, pszPrefix, pCtx->cr3,  pszPrefix, pCtx->cr4,
     
    13481350            "cs=%04x ds=%04x es=%04x fs=%04x gs=%04x                       eflags=%08x\n"
    13491351            "cr0=%08RX64 cr2=xxxxxxxx cr3=%08RX64 cr4=%08RX64 gdtr=%08x:%04x ldtr=%04x\n"
    1350             "dr0=%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"
    13511353            "SysEnter={cs=%04x eip=%08x esp=%08x}\n"
    13521354            ,
     
    13761378            "cr0=%016RX64 cr2=xxxxxxxxxxxxxxxx cr3=%016RX64\n"
    13771379            "cr4=%016RX64 ldtr=%04x tr=%04x\n"
    1378             "dr0=%016RX64 dr1=%016RX64 dr2=%016RX64\n"
    1379             "dr3=%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"
    13801382            "gdtr=%016RX64:%04x  idtr=%016RX64:%04x\n"
    13811383            "SysEnter={cs=%04x eip=%08x esp=%08x}\n"
  • trunk/src/VBox/VMM/CPUMInternal.mac

    r10687 r12600  
    235235    .Hyper.cr4            resq    1
    236236
    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
    245238
    246239    .Hyper.gdtr           resb    10          ; GDT limit + linear address
     
    346339    .Guest.cr4            resq    1
    347340
    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
    356342
    357343    .Guest.gdtr           resb    10          ; GDT limit + linear address
  • trunk/src/VBox/VMM/PATM/PATMPatch.cpp

    r12285 r12600  
    11901190    pPB[1] = MAKE_MODRM(mod, reg, rm);
    11911191
    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
    12241195    *(RTRCPTR *)&pPB[2] = pVM->patm.s.pCPUMCtxGC + offset;
    12251196    patmPatchAddReloc32(pVM, pPatch, &pPB[2], FIXUP_ABSOLUTE);
  • trunk/src/VBox/VMM/PATM/PATMSSM.cpp

    r11985 r12600  
    753753                if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr0))
    754754                {
    755                     LogFlow(("Changing dr0 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr0)));
    756                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr0);
     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]);
    757757                }
    758758                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr1))
    759759                {
    760                     LogFlow(("Changing dr1 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr1)));
    761                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr1);
     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]);
    762762                }
    763763                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr2))
    764764                {
    765                     LogFlow(("Changing dr2 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr2)));
    766                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr2);
     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]);
    767767                }
    768768                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr3))
    769769                {
    770                     LogFlow(("Changing dr3 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr3)));
    771                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr3);
     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]);
    772772                }
    773773                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr4))
    774774                {
    775                     LogFlow(("Changing dr4 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr4)));
    776                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr4);
     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]);
    777777                }
    778778                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr5))
    779779                {
    780                     LogFlow(("Changing dr5 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr5)));
    781                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr5);
     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]);
    782782                }
    783783                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr6))
    784784                {
    785                     LogFlow(("Changing dr6 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr6)));
    786                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr6);
     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]);
    787787                }
    788788                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr7))
    789789                {
    790                     LogFlow(("Changing dr7 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr7)));
    791                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr7);
     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]);
    792792                }
    793793                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, cr0))
  • trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp

    r12578 r12600  
    182182CPUMDECL(void) CPUMSetHyperDR0(PVM pVM, RTGCUINTREG uDr0)
    183183{
    184     pVM->cpum.s.Hyper.dr0 = uDr0;
     184    pVM->cpum.s.Hyper.dr[0] = uDr0;
    185185    /** @todo in GC we must load it! */
    186186}
     
    188188CPUMDECL(void) CPUMSetHyperDR1(PVM pVM, RTGCUINTREG uDr1)
    189189{
    190     pVM->cpum.s.Hyper.dr1 = uDr1;
     190    pVM->cpum.s.Hyper.dr[1] = uDr1;
    191191    /** @todo in GC we must load it! */
    192192}
     
    194194CPUMDECL(void) CPUMSetHyperDR2(PVM pVM, RTGCUINTREG uDr2)
    195195{
    196     pVM->cpum.s.Hyper.dr2 = uDr2;
     196    pVM->cpum.s.Hyper.dr[2] = uDr2;
    197197    /** @todo in GC we must load it! */
    198198}
     
    200200CPUMDECL(void) CPUMSetHyperDR3(PVM pVM, RTGCUINTREG uDr3)
    201201{
    202     pVM->cpum.s.Hyper.dr3 = uDr3;
     202    pVM->cpum.s.Hyper.dr[3] = uDr3;
    203203    /** @todo in GC we must load it! */
    204204}
     
    206206CPUMDECL(void) CPUMSetHyperDR6(PVM pVM, RTGCUINTREG uDr6)
    207207{
    208     pVM->cpum.s.Hyper.dr6 = uDr6;
     208    pVM->cpum.s.Hyper.dr[6] = uDr6;
    209209    /** @todo in GC we must load it! */
    210210}
     
    212212CPUMDECL(void) CPUMSetHyperDR7(PVM pVM, RTGCUINTREG uDr7)
    213213{
    214     pVM->cpum.s.Hyper.dr7 = uDr7;
     214    pVM->cpum.s.Hyper.dr[7] = uDr7;
    215215    /** @todo in GC we must load it! */
    216216}
     
    347347CPUMDECL(RTGCUINTREG) CPUMGetHyperDR0(PVM pVM)
    348348{
    349     return pVM->cpum.s.Hyper.dr0;
     349    return pVM->cpum.s.Hyper.dr[0];
    350350}
    351351
    352352CPUMDECL(RTGCUINTREG) CPUMGetHyperDR1(PVM pVM)
    353353{
    354     return pVM->cpum.s.Hyper.dr1;
     354    return pVM->cpum.s.Hyper.dr[1];
    355355}
    356356
    357357CPUMDECL(RTGCUINTREG) CPUMGetHyperDR2(PVM pVM)
    358358{
    359     return pVM->cpum.s.Hyper.dr2;
     359    return pVM->cpum.s.Hyper.dr[2];
    360360}
    361361
    362362CPUMDECL(RTGCUINTREG) CPUMGetHyperDR3(PVM pVM)
    363363{
    364     return pVM->cpum.s.Hyper.dr3;
     364    return pVM->cpum.s.Hyper.dr[3];
    365365}
    366366
    367367CPUMDECL(RTGCUINTREG) CPUMGetHyperDR6(PVM pVM)
    368368{
    369     return pVM->cpum.s.Hyper.dr6;
     369    return pVM->cpum.s.Hyper.dr[6];
    370370}
    371371
    372372CPUMDECL(RTGCUINTREG) CPUMGetHyperDR7(PVM pVM)
    373373{
    374     return pVM->cpum.s.Hyper.dr7;
     374    return pVM->cpum.s.Hyper.dr[7];
    375375}
    376376
     
    888888CPUMDECL(uint64_t) CPUMGetGuestDR0(PVM pVM)
    889889{
    890     return pVM->cpum.s.Guest.dr0;
     890    return pVM->cpum.s.Guest.dr[0];
    891891}
    892892
    893893CPUMDECL(uint64_t) CPUMGetGuestDR1(PVM pVM)
    894894{
    895     return pVM->cpum.s.Guest.dr1;
     895    return pVM->cpum.s.Guest.dr[1];
    896896}
    897897
    898898CPUMDECL(uint64_t) CPUMGetGuestDR2(PVM pVM)
    899899{
    900     return pVM->cpum.s.Guest.dr2;
     900    return pVM->cpum.s.Guest.dr[2];
    901901}
    902902
    903903CPUMDECL(uint64_t) CPUMGetGuestDR3(PVM pVM)
    904904{
    905     return pVM->cpum.s.Guest.dr3;
     905    return pVM->cpum.s.Guest.dr[3];
    906906}
    907907
    908908CPUMDECL(uint64_t) CPUMGetGuestDR6(PVM pVM)
    909909{
    910     return pVM->cpum.s.Guest.dr6;
     910    return pVM->cpum.s.Guest.dr[6];
    911911}
    912912
    913913CPUMDECL(uint64_t) CPUMGetGuestDR7(PVM pVM)
    914914{
    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
    919918CPUMDECL(int) CPUMGetGuestDRx(PVM pVM, uint32_t iReg, uint64_t *pValue)
    920919{
    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];
    947922    return VINF_SUCCESS;
    948923}
     
    13111286CPUMDECL(int) CPUMSetGuestDR0(PVM pVM, uint64_t uDr0)
    13121287{
    1313     pVM->cpum.s.Guest.dr0 = uDr0;
     1288    pVM->cpum.s.Guest.dr[0] = uDr0;
    13141289    return CPUMRecalcHyperDRx(pVM);
    13151290}
     
    13171292CPUMDECL(int) CPUMSetGuestDR1(PVM pVM, uint64_t uDr1)
    13181293{
    1319     pVM->cpum.s.Guest.dr1 = uDr1;
     1294    pVM->cpum.s.Guest.dr[1] = uDr1;
    13201295    return CPUMRecalcHyperDRx(pVM);
    13211296}
     
    13231298CPUMDECL(int) CPUMSetGuestDR2(PVM pVM, uint64_t uDr2)
    13241299{
    1325     pVM->cpum.s.Guest.dr2 = uDr2;
     1300    pVM->cpum.s.Guest.dr[2] = uDr2;
    13261301    return CPUMRecalcHyperDRx(pVM);
    13271302}
     
    13291304CPUMDECL(int) CPUMSetGuestDR3(PVM pVM, uint64_t uDr3)
    13301305{
    1331     pVM->cpum.s.Guest.dr3 = uDr3;
     1306    pVM->cpum.s.Guest.dr[3] = uDr3;
    13321307    return CPUMRecalcHyperDRx(pVM);
    13331308}
     
    13351310CPUMDECL(int) CPUMSetGuestDR6(PVM pVM, uint64_t uDr6)
    13361311{
    1337     pVM->cpum.s.Guest.dr6 = uDr6;
     1312    pVM->cpum.s.Guest.dr[6] = uDr6;
    13381313    return CPUMRecalcHyperDRx(pVM);
    13391314}
     
    13411316CPUMDECL(int) CPUMSetGuestDR7(PVM pVM, uint64_t uDr7)
    13421317{
    1343     pVM->cpum.s.Guest.dr7 = uDr7;
     1318    pVM->cpum.s.Guest.dr[7] = uDr7;
    13441319    return CPUMRecalcHyperDRx(pVM);
    13451320}
    13461321
    1347 /** @todo drx should be an array */
    13481322CPUMDECL(int) CPUMSetGuestDRx(PVM pVM, uint32_t iReg, uint64_t Value)
    13491323{
    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;
    13761326    return CPUMRecalcHyperDRx(pVM);
    13771327}
     
    14251375        }
    14261376        else
    1427             uNewDr0 = pVM->cpum.s.Hyper.dr0;
     1377            uNewDr0 = pVM->cpum.s.Hyper.dr[0];
    14281378
    14291379        /* bp 1 */
     
    14401390        }
    14411391        else
    1442             uNewDr1 = pVM->cpum.s.Hyper.dr1;
     1392            uNewDr1 = pVM->cpum.s.Hyper.dr[1];
    14431393
    14441394        /* bp 2 */
     
    14551405        }
    14561406        else
    1457             uNewDr2 = pVM->cpum.s.Hyper.dr2;
     1407            uNewDr2 = pVM->cpum.s.Hyper.dr[2];
    14581408
    14591409        /* bp 3 */
     
    14701420        }
    14711421        else
    1472             uNewDr3 = pVM->cpum.s.Hyper.dr3;
     1422            uNewDr3 = pVM->cpum.s.Hyper.dr[3];
    14731423
    14741424        /*
     
    14821432#endif
    14831433        pVM->cpum.s.fUseFlags |= CPUM_USE_DEBUG_REGS;
    1484         if (uNewDr3 != pVM->cpum.s.Hyper.dr3)
     1434        if (uNewDr3 != pVM->cpum.s.Hyper.dr[3])
    14851435            CPUMSetHyperDR3(pVM, uNewDr3);
    1486         if (uNewDr2 != pVM->cpum.s.Hyper.dr2)
     1436        if (uNewDr2 != pVM->cpum.s.Hyper.dr[2])
    14871437            CPUMSetHyperDR2(pVM, uNewDr2);
    1488         if (uNewDr1 != pVM->cpum.s.Hyper.dr1)
     1438        if (uNewDr1 != pVM->cpum.s.Hyper.dr[1])
    14891439            CPUMSetHyperDR1(pVM, uNewDr1);
    1490         if (uNewDr0 != pVM->cpum.s.Hyper.dr0)
     1440        if (uNewDr0 != pVM->cpum.s.Hyper.dr[0])
    14911441            CPUMSetHyperDR0(pVM, uNewDr0);
    1492         if (uNewDr7 != pVM->cpum.s.Hyper.dr7)
     1442        if (uNewDr7 != pVM->cpum.s.Hyper.dr[7])
    14931443            CPUMSetHyperDR7(pVM, uNewDr7);
    14941444    }
     
    15041454    }
    15051455    Log2(("CPUMRecalcHyperDRx: fUseFlags=%#x %RGr %RGr %RGr %RGr  %RGr %RGr\n",
    1506           pVM->cpum.s.fUseFlags, pVM->cpum.s.Hyper.dr0, pVM->cpum.s.Hyper.dr1,
    1507          pVM->cpum.s.Hyper.dr2, pVM->cpum.s.Hyper.dr3, pVM->cpum.s.Hyper.dr6,
    1508          pVM->cpum.s.Hyper.dr7));
     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]));
    15091459
    15101460    return VINF_SUCCESS;
  • trunk/src/VBox/VMM/VMMR0/CPUMR0.cpp

    r12593 r12600  
    287287
    288288    /* Save the guest's debug state. The caller is responsible for DR7. */
    289     pCtx->dr0 = ASMGetDR0();
    290     pCtx->dr1 = ASMGetDR1();
    291     pCtx->dr2 = ASMGetDR2();
    292     pCtx->dr3 = ASMGetDR3();
     289    pCtx->dr[0] = ASMGetDR0();
     290    pCtx->dr[1] = ASMGetDR1();
     291    pCtx->dr[2] = ASMGetDR2();
     292    pCtx->dr[3] = ASMGetDR3();
    293293    if (fDR6)
    294         pCtx->dr6 = ASMGetDR6();
     294        pCtx->dr[6] = ASMGetDR6();
    295295
    296296    /* Restore the host's debug state. DR0-3, DR6 and only then DR7!
     
    331331
    332332    /* Activate the guest state DR0-3; DR7 is left to the caller. */
    333     ASMSetDR0(pCtx->dr0);
    334     ASMSetDR1(pCtx->dr1);
    335     ASMSetDR2(pCtx->dr2);
    336     ASMSetDR3(pCtx->dr3);
     333    ASMSetDR0(pCtx->dr[0]);
     334    ASMSetDR1(pCtx->dr[1]);
     335    ASMSetDR2(pCtx->dr[2]);
     336    ASMSetDR3(pCtx->dr[3]);
    337337    if (fDR6)
    338         ASMSetDR6(pCtx->dr6);
     338        ASMSetDR6(pCtx->dr[6]);
    339339
    340340    pVM->cpum.s.fUseFlags |= CPUM_USE_DEBUG_REGS;
  • trunk/src/VBox/VMM/VMMR0/HWACCMR0.cpp

    r12578 r12600  
    10621062            (RTSEL)pCtx->ss, pCtx->ssHid.u64Base, pCtx->ssHid.u32Limit, pCtx->ssHid.Attr.u,
    10631063            pCtx->cr0,  pCtx->cr2, pCtx->cr3,  pCtx->cr4,
    1064             pCtx->dr0,  pCtx->dr1, pCtx->dr2,  pCtx->dr3,
    1065             pCtx->dr4,  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],
    10661066            pCtx->gdtr.pGdt, pCtx->gdtr.cbGdt, pCtx->idtr.pIdt, pCtx->idtr.cbIdt, efl,
    10671067            (RTSEL)pCtx->ldtr, pCtx->ldtrHid.u64Base, pCtx->ldtrHid.u32Limit, pCtx->ldtrHid.Attr.u,
     
    10851085            pCtx->eax, pCtx->ebx, pCtx->ecx, pCtx->edx, pCtx->esi, pCtx->edi,
    10861086            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->dr0,  pCtx->dr1,
    1088             (RTSEL)pCtx->ds, pCtx->dsHid.u64Base, pCtx->dsHid.u32Limit, pCtx->dsHid.Attr.u, pCtx->dr2,  pCtx->dr3,
    1089             (RTSEL)pCtx->es, pCtx->esHid.u64Base, pCtx->esHid.u32Limit, pCtx->esHid.Attr.u, pCtx->dr4,  pCtx->dr5,
    1090             (RTSEL)pCtx->fs, pCtx->fsHid.u64Base, pCtx->fsHid.u32Limit, pCtx->fsHid.Attr.u, pCtx->dr6,  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],
    10911091            (RTSEL)pCtx->gs, pCtx->gsHid.u64Base, pCtx->gsHid.u32Limit, pCtx->gsHid.Attr.u, pCtx->cr0,  pCtx->cr2,
    10921092            (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  
    686686    if (pVM->hwaccm.s.fContextUseFlags & HWACCM_CHANGED_GUEST_DEBUG)
    687687    {
    688         pCtx->dr6 |= X86_DR6_INIT_VAL;                                          /* set all reserved bits to 1. */
    689         pCtx->dr6 &= ~RT_BIT(12);                                               /* must be zero. */
    690 
    691         pCtx->dr7 &= 0xffffffff;                                                /* upper 32 bits reserved */
    692         pCtx->dr7 &= ~(RT_BIT(11) | RT_BIT(12) | RT_BIT(14) | RT_BIT(15));      /* must be zero */
    693         pCtx->dr7 |= 0x400;                                                     /* must be one */
    694 
    695         pVMCB->guest.u64DR7 = pCtx->dr7;
    696         pVMCB->guest.u64DR6 = pCtx->dr6;
     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];
    697697
    698698        /* Sync the debug state now if any breakpoint is armed. */
    699         if (    (pCtx->dr7 & (X86_DR7_ENABLED_MASK|X86_DR7_GD))
     699        if (    (pCtx->dr[7] & (X86_DR7_ENABLED_MASK|X86_DR7_GD))
    700700            &&  !CPUMIsGuestDebugStateActive(pVM)
    701701            &&  !DBGFIsStepping(pVM))
     
    12171217
    12181218    /* Sync back DR6 as it could have been changed by hitting breakpoints. */
    1219     pCtx->dr6 = pVMCB->guest.u64DR6;
     1219    pCtx->dr[6] = pVMCB->guest.u64DR6;
    12201220    /* DR7.GD can be cleared by debug exceptions, so sync it back as well. */
    1221     pCtx->dr7 = pVMCB->guest.u64DR7;
     1221    pCtx->dr[7] = pVMCB->guest.u64DR7;
    12221222
    12231223    /* Check if an injected event was interrupted prematurely. */
     
    12871287            Assert(DBGFIsStepping(pVM));
    12881288
    1289             rc = DBGFR0Trap01Handler(pVM, CPUMCTX2CORE(pCtx), pCtx->dr6);
     1289            rc = DBGFR0Trap01Handler(pVM, CPUMCTX2CORE(pCtx), pCtx->dr[6]);
    12901290            if (rc == VINF_EM_RAW_GUEST_TRAP)
    12911291            {
  • trunk/src/VBox/VMM/VMMR0/HWVMXR0.cpp

    r12578 r12600  
    968968    if (pVM->hwaccm.s.fContextUseFlags & HWACCM_CHANGED_GUEST_DEBUG)
    969969    {
    970         pCtx->dr6 |= X86_DR6_INIT_VAL;                                          /* set all reserved bits to 1. */
    971         pCtx->dr6 &= ~RT_BIT(12);                                               /* must be zero. */
    972 
    973         pCtx->dr7 &= 0xffffffff;                                                /* upper 32 bits reserved */
    974         pCtx->dr7 &= ~(RT_BIT(11) | RT_BIT(12) | RT_BIT(14) | RT_BIT(15));      /* must be zero */
    975         pCtx->dr7 |= 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 */
    976976
    977977        /* Resync DR7 */
    978         rc = VMXWriteVMCS(VMX_VMCS_GUEST_DR7, pCtx->dr7);
     978        rc = VMXWriteVMCS(VMX_VMCS_GUEST_DR7, pCtx->dr[7]);
    979979        AssertRC(rc);
    980980
    981981        /* Sync the debug state now if any breakpoint is armed. */
    982         if (    (pCtx->dr7 & (X86_DR7_ENABLED_MASK|X86_DR7_GD))
     982        if (    (pCtx->dr[7] & (X86_DR7_ENABLED_MASK|X86_DR7_GD))
    983983            &&  !CPUMIsGuestDebugStateActive(pVM)
    984984            &&  !DBGFIsStepping(pVM))
     
    15491549    /* Sync back DR7 here. */
    15501550    VMXReadVMCS(VMX_VMCS_GUEST_DR7, &val);
    1551     pCtx->dr7 = val;
     1551    pCtx->dr[7] = val;
    15521552
    15531553    /* Guest CPU context: ES, CS, SS, DS, FS, GS. */
     
    17801780                {
    17811781                    /* Update DR6 here. */
    1782                     pCtx->dr6  = uDR6;
     1782                    pCtx->dr[6]  = uDR6;
    17831783
    17841784                    /* X86_DR7_GD will be cleared if drx accesses should be trapped inside the guest. */
    1785                     pCtx->dr7 &= ~X86_DR7_GD;
     1785                    pCtx->dr[7] &= ~X86_DR7_GD;
    17861786
    17871787                    /* Paranoia. */
    1788                     pCtx->dr7 &= 0xffffffff;                                              /* upper 32 bits reserved */
    1789                     pCtx->dr7 &= ~(RT_BIT(11) | RT_BIT(12) | RT_BIT(14) | RT_BIT(15));    /* must be zero */
    1790                     pCtx->dr7 |= 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 */
    17911791
    17921792                    /* Resync DR7 */
    1793                     rc = VMXWriteVMCS(VMX_VMCS_GUEST_DR7, pCtx->dr7);
     1793                    rc = VMXWriteVMCS(VMX_VMCS_GUEST_DR7, pCtx->dr[7]);
    17941794                    AssertRC(rc);
    17951795
     
    20632063                                     VMX_EXIT_QUALIFICATION_DRX_GENREG(exitQualification));
    20642064            pVM->hwaccm.s.fContextUseFlags |= HWACCM_CHANGED_GUEST_DEBUG;
    2065             Log2(("DR7=%08x\n", pCtx->dr7));
     2065            Log2(("DR7=%08x\n", pCtx->dr[7]));
    20662066        }
    20672067        else
     
    21072107            rc = fIOWrite ? VINF_IOM_HC_IOPORT_WRITE : VINF_IOM_HC_IOPORT_READ;
    21082108            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            }
    21092119        }
    21102120
  • trunk/src/VBox/VMM/VMMSwitcher/AMD64ToPAE.asm

    r9411 r12600  
    518518    DEBUG_S_CHAR('x')
    519519    ; load hyper DR0-7
    520     mov     ebx, [edx + CPUM.Hyper.dr0]
     520    mov     ebx, [edx + CPUM.Hyper.dr]
    521521    mov     dr0, ebx
    522     mov     ecx, [edx + CPUM.Hyper.dr1]
     522    mov     ecx, [edx + CPUM.Hyper.dr + 4*1]
    523523    mov     dr1, ecx
    524     mov     eax, [edx + CPUM.Hyper.dr2]
     524    mov     eax, [edx + CPUM.Hyper.dr + 4*2]
    525525    mov     dr2, eax
    526     mov     ebx, [edx + CPUM.Hyper.dr3]
     526    mov     ebx, [edx + CPUM.Hyper.dr + 4*3]
    527527    mov     dr3, ebx
    528     ;mov     eax, [edx + CPUM.Hyper.dr6]
     528    ;mov     eax, [edx + CPUM.Hyper.dr + 4*6]
    529529    mov     ecx, 0ffff0ff0h
    530530    mov     dr6, ecx
    531     mov     eax, [edx + CPUM.Hyper.dr7]
     531    mov     eax, [edx + CPUM.Hyper.dr + 4*7]
    532532    mov     dr7, eax
    533533    jmp     htg_debug_regs_guest_no
  • trunk/src/VBox/VMM/VMMSwitcher/PAEand32Bit.mac

    r9669 r12600  
    414414    mov     [edx + CPUM.Host.dr3], eax
    415415    ; load hyper DR0-7
    416     mov     ebx, [edx + CPUM.Hyper.dr0]
     416    mov     ebx, [edx + CPUM.Hyper.dr]
    417417    mov     dr0, ebx
    418     mov     ecx, [edx + CPUM.Hyper.dr1]
     418    mov     ecx, [edx + CPUM.Hyper.dr + 4*1]
    419419    mov     dr1, ecx
    420     mov     eax, [edx + CPUM.Hyper.dr2]
     420    mov     eax, [edx + CPUM.Hyper.dr + 4*2]
    421421    mov     dr2, eax
    422     mov     ebx, [edx + CPUM.Hyper.dr3]
     422    mov     ebx, [edx + CPUM.Hyper.dr + 4*3]
    423423    mov     dr3, ebx
    424     ;mov     eax, [edx + CPUM.Hyper.dr6]
     424    ;mov     eax, [edx + CPUM.Hyper.dr + 4*6]
    425425    mov     ecx, 0ffff0ff0h
    426426    mov     dr6, ecx
    427     mov     eax, [edx + CPUM.Hyper.dr7]
     427    mov     eax, [edx + CPUM.Hyper.dr + 4*7]
    428428    mov     dr7, eax
    429429    jmp     htg_debug_regs_guest_no
  • trunk/src/recompiler/VBoxRecompiler.c

    r12549 r12600  
    16121612    register unsigned       fFlags;
    16131613    bool                    fHiddenSelRegsValid = CPUMAreHiddenSelRegsValid(pVM);
     1614    unsigned                i;
    16141615
    16151616    Assert(!pVM->rem.s.fInREM);
     
    16801681
    16811682    /** @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];
    16901685
    16911686    /*
     
    20642059    STAM_PROFILE_START(&pVM->rem.s.StatsStateBack, a);
    20652060    register PCPUMCTX pCtx = pVM->rem.s.pCtx;
     2061    unsigned          i;
    20662062
    20672063    /*
     
    21622158    pCtx->cr4           = pVM->rem.s.Env.cr[4];
    21632159
    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];
    21722162
    21732163    pCtx->gdtr.cbGdt    = pVM->rem.s.Env.gdt.limit;
     
    22922282    Assert(pVM->rem.s.fInREM);
    22932283    register PCPUMCTX pCtx = pVM->rem.s.pCtx;
     2284    unsigned          i;
    22942285
    22952286    /*
     
    23622353    pCtx->cr4           = pVM->rem.s.Env.cr[4];
    23632354
    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];
    23722357
    23732358    pCtx->gdtr.cbGdt    = pVM->rem.s.Env.gdt.limit;
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette