VirtualBox

Changeset 48453 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Sep 12, 2013 4:03:43 PM (11 years ago)
Author:
vboxsync
Message:

VMM/HMVMXR0: Check VMCS values rather than fudged pCtx values in hmR0VmxCheckGuestState().

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r48443 r48453  
    67416741    uint32_t u32IntrInfo = (uint32_t)u64IntrInfo;
    67426742
    6743     const uint32_t uVector = VMX_EXIT_INTERRUPTION_INFO_VECTOR(u32IntrInfo);
     6743    const uint32_t uVector   = VMX_EXIT_INTERRUPTION_INFO_VECTOR(u32IntrInfo);
    67446744    const uint32_t uIntrType = VMX_EXIT_INTERRUPTION_INFO_TYPE(u32IntrInfo);
    67456745
     
    69246924{
    69256925    int rc;
     6926    Log4Func(("vcpu[%d]\n", pVCpu->idCpu));
    69266927
    69276928    /* Clear interrupt-window exiting control. */
     
    80138014         * CR0.
    80148015         */
     8016        uint32_t u32GuestCR0;
    80158017        uint32_t uSetCR0 = (uint32_t)(pVM->hm.s.vmx.Msrs.u64Cr0Fixed0 & pVM->hm.s.vmx.Msrs.u64Cr0Fixed1);
    80168018        uint32_t uZapCR0 = (uint32_t)(pVM->hm.s.vmx.Msrs.u64Cr0Fixed0 | pVM->hm.s.vmx.Msrs.u64Cr0Fixed1);
     
    80208022            uSetCR0 &= ~(X86_CR0_PE | X86_CR0_PG);
    80218023
    8022         rc = VMXReadVmcs32(VMX_VMCS_GUEST_CR0, &u32Val);
     8024        rc = VMXReadVmcs32(VMX_VMCS_GUEST_CR0, &u32GuestCR0);
    80238025        AssertRCBreak(rc);
    80248026        HMVMX_CHECK_BREAK((u32Val & uSetCR0) == uSetCR0, VMX_IGS_CR0_FIXED1);
    80258027        HMVMX_CHECK_BREAK(!(u32Val & ~uZapCR0), VMX_IGS_CR0_FIXED0);
    80268028        if (   !fUnrestrictedGuest
    8027             && (u32Val & X86_CR0_PG)
    8028             && !(u32Val & X86_CR0_PE))
     8029            && (u32GuestCR0 & X86_CR0_PG)
     8030            && !(u32GuestCR0 & X86_CR0_PE))
    80298031        {
    80308032            HMVMX_ERROR_BREAK(VMX_IGS_CR0_PG_PE_COMBO);
     
    80348036         * CR4.
    80358037         */
     8038        uint32_t u32GuestCR4;
    80368039        uint64_t uSetCR4 = (pVM->hm.s.vmx.Msrs.u64Cr4Fixed0 & pVM->hm.s.vmx.Msrs.u64Cr4Fixed1);
    80378040        uint64_t uZapCR4 = (pVM->hm.s.vmx.Msrs.u64Cr4Fixed0 | pVM->hm.s.vmx.Msrs.u64Cr4Fixed1);
    8038         rc = VMXReadVmcs32(VMX_VMCS_GUEST_CR4, &u32Val);
     8041        rc = VMXReadVmcs32(VMX_VMCS_GUEST_CR4, &u32GuestCR4);
    80398042        AssertRCBreak(rc);
    8040         HMVMX_CHECK_BREAK((u32Val & uSetCR4) == uSetCR4, VMX_IGS_CR4_FIXED1);
    8041         HMVMX_CHECK_BREAK(!(u32Val & ~uZapCR4), VMX_IGS_CR4_FIXED0);
     8043        HMVMX_CHECK_BREAK((u32GuestCR4 & uSetCR4) == uSetCR4, VMX_IGS_CR4_FIXED1);
     8044        HMVMX_CHECK_BREAK(!(u32GuestCR4 & ~uZapCR4), VMX_IGS_CR4_FIXED0);
    80428045
    80438046        /*
     
    80988101
    80998102        if (   fLongModeGuest
    8100             || !(pCtx->cr0 & X86_CR0_PE))
     8103            || !(u32GuestCR0 & X86_CR0_PE))
    81018104        {
    81028105            HMVMX_CHECK_BREAK(!(u32Eflags & X86_EFL_VM), VMX_IGS_RFLAGS_VM_INVALID);
     
    81218124                && !fUnrestrictedGuest)
    81228125            {
    8123                 HMVMX_CHECK_BREAK(CPUMIsGuestPagingEnabledEx(pCtx), VMX_IGS_CR0_PG_LONGMODE);
    8124                 HMVMX_CHECK_BREAK((pCtx->cr4 & X86_CR4_PAE), VMX_IGS_CR4_PAE_LONGMODE);
     8126                HMVMX_CHECK_BREAK(u32GuestCR0 & X86_CR0_PG, VMX_IGS_CR0_PG_LONGMODE);
     8127                HMVMX_CHECK_BREAK(u32GuestCR4 & X86_CR4_PAE, VMX_IGS_CR4_PAE_LONGMODE);
    81258128            }
    81268129
    81278130            if (   !fLongModeGuest
    8128                 && (pCtx->cr4 & X86_CR4_PCIDE))
     8131                && (u32GuestCR4 & X86_CR4_PCIDE))
    81298132            {
    81308133                HMVMX_ERROR_BREAK(VMX_IGS_CR4_PCIDE);
     
    81978200                              VMX_IGS_EFER_LMA_GUEST_MODE_MISMATCH);
    81988201            HMVMX_CHECK_BREAK(   fUnrestrictedGuest
    8199                               || (u64Val & MSR_K6_EFER_LMA) == (pCtx->cr0 & X86_CR0_PG), VMX_IGS_EFER_LMA_PG_MISMATCH);
     8202                              || (u64Val & MSR_K6_EFER_LMA) == (u32GuestCR0 & X86_CR0_PG), VMX_IGS_EFER_LMA_PG_MISMATCH);
    82008203        }
    82018204
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