VirtualBox

Changeset 47328 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Jul 22, 2013 10:50:49 PM (12 years ago)
Author:
vboxsync
Message:

CPUM,++: Fix DR6 and DR7 read-as-1 (RA1) and read-as-zero (RAZ) values on load since REM didn't set them right for years. Introduced constants for these values.

Location:
trunk/src/VBox/VMM/VMMAll
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp

    r47242 r47328  
    22022202         * Straight forward code, not optimized/minimized in any way.
    22032203         */
    2204         RTGCUINTREG uNewDr7 = X86_DR7_GE | X86_DR7_LE | X86_DR7_MB1_MASK;
     2204        RTGCUINTREG uNewDr7 = X86_DR7_GE | X86_DR7_LE | X86_DR7_RA1_MASK;
    22052205
    22062206        /* bp 0 */
  • trunk/src/VBox/VMM/VMMAll/DBGFAll.cpp

    r44528 r47328  
    3535VMM_INT_DECL(RTGCUINTREG) DBGFBpGetDR7(PVM pVM)
    3636{
    37     RTGCUINTREG uDr7 = X86_DR7_GD | X86_DR7_GE | X86_DR7_LE | X86_DR7_MB1_MASK;
     37    RTGCUINTREG uDr7 = X86_DR7_GD | X86_DR7_GE | X86_DR7_LE | X86_DR7_RA1_MASK;
    3838    PDBGFBP     pBp = &pVM->dbgf.s.aHwBreakpoints[0];
    3939    unsigned    cLeft = RT_ELEMENTS(pVM->dbgf.s.aHwBreakpoints);
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r47327 r47328  
    84608460        CHECK_FIELD(dr[3]);
    84618461        CHECK_FIELD(dr[6]);
    8462         if ((pOrgCtx->dr[7] & ~X86_DR7_MB1_MASK) != (pDebugCtx->dr[7] & ~X86_DR7_MB1_MASK)) /* REM 'mov drX,greg' bug.*/
     8462        if ((pOrgCtx->dr[7] & ~X86_DR7_RA1_MASK) != (pDebugCtx->dr[7] & ~X86_DR7_RA1_MASK)) /* REM 'mov drX,greg' bug.*/
    84638463            CHECK_FIELD(dr[7]);
    84648464        CHECK_FIELD(gdtr.cbGdt);
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r47327 r47328  
    38363836        case 4:
    38373837            drX = pCtx->dr[6];
    3838             drX &= ~RT_BIT_32(12);
    3839             drX |= UINT32_C(0xffff0ff0);
     3838            drX |= X86_DR6_RA1_MASK;
     3839            drX &= ~X86_DR6_RAZ_MASK;
    38403840            break;
    38413841        case 7:
    38423842        case 5:
    38433843            drX = pCtx->dr[7];
    3844             drX &= ~(RT_BIT_32(11) | RT_BIT_32(12) | RT_BIT_32(14) | RT_BIT_32(15));
    3845             drX |= RT_BIT_32(10);
     3844            drX |=X86_DR7_RA1_MASK;
     3845            drX &= ~X86_DR7_RAZ_MASK;
    38463846            break;
    38473847        IEM_NOT_REACHED_DEFAULT_CASE_RET(); /* call checks */
     
    38753875    Assert(!pCtx->eflags.Bits.u1VM);
    38763876
    3877     if (   (iDrReg == 4 || iDrReg == 5)
    3878         && (pCtx->cr4 & X86_CR4_DE) )
    3879     {
    3880         Log(("mov dr%u,r%u: CR4.DE=1 -> #GP(0)\n", iDrReg, iGReg));
    3881         return iemRaiseGeneralProtectionFault0(pIemCpu);
     3877    if (iDrReg == 4 || iDrReg == 5)
     3878    {
     3879        if (pCtx->cr4 & X86_CR4_DE)
     3880        {
     3881            Log(("mov dr%u,r%u: CR4.DE=1 -> #GP(0)\n", iDrReg, iGReg));
     3882            return iemRaiseGeneralProtectionFault0(pIemCpu);
     3883        }
     3884        iDrReg += 2;
    38823885    }
    38833886
     
    39133916
    39143917        case 6:
    3915         case 4:
    3916             if (uNewDrX & UINT64_C(0xffffffff00000000))
     3918            if (uNewDrX & X86_DR6_MBZ_MASK)
    39173919            {
    39183920                Log(("mov dr%u,%#llx: DR6 high bits are not zero -> #GP(0)\n", iDrReg, uNewDrX));
    39193921                return iemRaiseGeneralProtectionFault0(pIemCpu);
    39203922            }
    3921             uNewDrX &= ~RT_BIT_32(12);
    3922             uNewDrX |= UINT32_C(0xffff0ff0);
     3923            uNewDrX |= X86_DR6_RA1_MASK;
     3924            uNewDrX &= ~X86_DR6_RAZ_MASK;
    39233925            break;
    39243926
    39253927        case 7:
    3926         case 5:
    3927             if (uNewDrX & UINT64_C(0xffffffff00000000))
     3928            if (uNewDrX & X86_DR7_MBZ_MASK)
    39283929            {
    39293930                Log(("mov dr%u,%#llx: DR7 high bits are not zero -> #GP(0)\n", iDrReg, uNewDrX));
    39303931                return iemRaiseGeneralProtectionFault0(pIemCpu);
    39313932            }
    3932             uNewDrX &= ~(RT_BIT_32(11) | RT_BIT_32(12) | RT_BIT_32(14) | RT_BIT_32(15));
    3933             uNewDrX |= RT_BIT_32(10);
     3933            uNewDrX |= X86_DR7_RA1_MASK;
     3934            uNewDrX &= ~X86_DR7_RAZ_MASK;
    39343935            break;
    39353936
Note: See TracChangeset for help on using the changeset viewer.

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