VirtualBox

Changeset 97522 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Nov 13, 2022 2:45:48 AM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
154546
Message:

VMM/IEM: Dynamically load DR6 in the DRx read & write helper code, we only need it when DR4 or DR5 are accessed to see if such accesses are allowed. This is not very common and there is no point in requiring it. (VT-x code wasn't importing CR4 and we hit an assertion. Adjusted the assertions.)

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

Legend:

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

    r97497 r97522  
    1090310903{
    1090410904    IEMEXEC_ASSERT_INSTR_LEN_RETURN(cbInstr, 2);
    10905     IEM_CTX_ASSERT(pVCpu, IEM_CPUMCTX_EXTRN_EXEC_DECODED_NO_MEM_MASK);
     10905    IEM_CTX_ASSERT(pVCpu, IEM_CPUMCTX_EXTRN_EXEC_DECODED_NO_MEM_MASK | CPUMCTX_EXTRN_DR7);
    1090610906    Assert(iDrReg < 8);
    1090710907    Assert(iGReg < 16);
     
    1092810928{
    1092910929    IEMEXEC_ASSERT_INSTR_LEN_RETURN(cbInstr, 2);
    10930     IEM_CTX_ASSERT(pVCpu, IEM_CPUMCTX_EXTRN_EXEC_DECODED_NO_MEM_MASK);
     10930    IEM_CTX_ASSERT(pVCpu, IEM_CPUMCTX_EXTRN_EXEC_DECODED_NO_MEM_MASK | CPUMCTX_EXTRN_DR7);
    1093110931    Assert(iDrReg < 8);
    1093210932    Assert(iGReg < 16);
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp

    r97521 r97522  
    64316431        return iemRaiseGeneralProtectionFault0(pVCpu);
    64326432    Assert(!pVCpu->cpum.GstCtx.eflags.Bits.u1VM);
    6433     IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_DR7 | CPUMCTX_EXTRN_CR0);
    6434 
    6435     if (   (iDrReg == 4 || iDrReg == 5)
    6436         && (pVCpu->cpum.GstCtx.cr4 & X86_CR4_DE) )
    6437     {
    6438         Log(("mov r%u,dr%u: CR4.DE=1 -> #GP(0)\n", iGReg, iDrReg));
    6439         return iemRaiseGeneralProtectionFault0(pVCpu);
     6433    IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_DR7);
     6434
     6435    /** @todo \#UD in outside ring-0 too? */
     6436    if (iDrReg == 4 || iDrReg == 5)
     6437    {
     6438        IEM_CTX_IMPORT_RET(pVCpu, CPUMCTX_EXTRN_CR4);
     6439        if (pVCpu->cpum.GstCtx.cr4 & X86_CR4_DE)
     6440        {
     6441            Log(("mov r%u,dr%u: CR4.DE=1 -> #GP(0)\n", iGReg, iDrReg));
     6442            return iemRaiseGeneralProtectionFault0(pVCpu);
     6443        }
     6444        iDrReg += 2;
    64406445    }
    64416446
     
    64706475            break;
    64716476        case 6:
    6472         case 4:
    64736477            IEM_CTX_IMPORT_RET(pVCpu, CPUMCTX_EXTRN_DR6);
    64746478            drX = pVCpu->cpum.GstCtx.dr[6];
     
    64776481            break;
    64786482        case 7:
    6479         case 5:
    64806483            IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_DR7);
    64816484            drX = pVCpu->cpum.GstCtx.dr[7];
     
    65376540        return iemRaiseGeneralProtectionFault0(pVCpu);
    65386541    Assert(!pVCpu->cpum.GstCtx.eflags.Bits.u1VM);
    6539     IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_DR7 | CPUMCTX_EXTRN_CR4);
     6542    IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_DR7);
    65406543
    65416544    if (iDrReg == 4 || iDrReg == 5)
    65426545    {
     6546        IEM_CTX_IMPORT_RET(pVCpu, CPUMCTX_EXTRN_CR4);
    65436547        if (pVCpu->cpum.GstCtx.cr4 & X86_CR4_DE)
    65446548        {
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