VirtualBox

Changeset 78776 in vbox for trunk


Ignore:
Timestamp:
May 27, 2019 8:52:25 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
130863
Message:

VMM/IEM: Nested VMX: bugref:9180 Use CPUMIsGuestVmxMovToCr0Cr4InterceptSet.

File:
1 edited

Legend:

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

    r78771 r78776  
    31683168    Assert(iGReg < X86_GREG_COUNT);
    31693169
    3170     PCVMXVVMCS pVmcs = pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pVmcs);
    3171     Assert(pVmcs);
    3172 
    3173     uint64_t uGuestCrX;
    3174     uint64_t fGstHostMask;
    3175     uint64_t fReadShadow;
    3176     if (iCrReg == 0)
    3177     {
    3178         IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_CR0);
    3179         uGuestCrX    = pVCpu->cpum.GstCtx.cr0;
    3180         fGstHostMask = pVmcs->u64Cr0Mask.u;
    3181         fReadShadow  = pVmcs->u64Cr0ReadShadow.u;
    3182     }
    3183     else
    3184     {
    3185         IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_CR4);
    3186         uGuestCrX    = pVCpu->cpum.GstCtx.cr4;
    3187         fGstHostMask = pVmcs->u64Cr4Mask.u;
    3188         fReadShadow  = pVmcs->u64Cr4ReadShadow.u;
    3189     }
    3190 
    3191     /*
    3192      * For any CR0/CR4 bit owned by the host (in the CR0/CR4 guest/host mask), if the
    3193      * corresponding bits differ between the source operand and the read-shadow,
    3194      * we must cause a VM-exit.
    3195      *
    3196      * See Intel spec. 25.1.3 "Instructions That Cause VM Exits Conditionally".
    3197      */
    3198     if ((fReadShadow & fGstHostMask) != (*puNewCrX & fGstHostMask))
    3199     {
    3200         Assert(fGstHostMask != 0);
     3170    uint64_t const uNewCrX = *puNewCrX;
     3171    if (CPUMIsGuestVmxMovToCr0Cr4InterceptSet(pVCpu, &pVCpu->cpum.GstCtx, iCrReg, uNewCrX))
     3172    {
    32013173        Log2(("mov_Cr_Rd: (CR%u) Guest intercept -> VM-exit\n", iCrReg));
    32023174
     
    32173189     * See Intel Spec. 25.3 "Changes To Instruction Behavior In VMX Non-root Operation".
    32183190     */
     3191    PCVMXVVMCS pVmcs = pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pVmcs);
     3192    Assert(pVmcs);
     3193    uint64_t uGuestCrX;
     3194    uint64_t fGstHostMask;
     3195    if (iCrReg == 0)
     3196    {
     3197        IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_CR0);
     3198        uGuestCrX    = pVCpu->cpum.GstCtx.cr0;
     3199        fGstHostMask = pVmcs->u64Cr0Mask.u;
     3200    }
     3201    else
     3202    {
     3203        IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_CR4);
     3204        uGuestCrX    = pVCpu->cpum.GstCtx.cr4;
     3205        fGstHostMask = pVmcs->u64Cr4Mask.u;
     3206    }
     3207
    32193208    *puNewCrX = (uGuestCrX & fGstHostMask) | (*puNewCrX & ~fGstHostMask);
    3220 
    32213209    return VINF_VMX_INTERCEPT_NOT_ACTIVE;
    32223210}
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