VirtualBox

Changeset 13167 in vbox


Ignore:
Timestamp:
Oct 10, 2008 11:43:42 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
37687
Message:

Fixed EPT violation handling.

File:
1 edited

Legend:

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

    r13139 r13167  
    22792279        Assert(pVM->hwaccm.s.fNestedPaging);
    22802280
    2281         if ((exitQualification & (VMX_EXIT_QUALIFICATION_EPT_GUEST_ADDR_VALID | VMX_EXIT_QUALIFICATION_EPT_TRANSLATED_ACCESS))
    2282              ==                  (VMX_EXIT_QUALIFICATION_EPT_GUEST_ADDR_VALID | VMX_EXIT_QUALIFICATION_EPT_TRANSLATED_ACCESS))
    2283         {
    2284             /* Read the fault address. */
    2285             rc = VMXReadVMCS(VMX_VMCS_EXIT_GUEST_LINEAR_ADDR, &val);
    2286             AssertRC(rc);
    2287             GCPhys = val;
    2288         }
    2289         else
    2290         {
    2291             Assert(!(pCtx->cr0 & X86_CR0_PG) || (pCtx->cr4 & X86_CR4_PAE));
    2292 
    2293             /* If not set, then the violation occurred when loading the PDPTEs as part of a mov cr3 instruction
    2294              * or while accessing our real & protected mode without paging page directory.
    2295              */
    2296             if (!(pCtx->cr0 & X86_CR0_PG))
    2297             {
    2298                 /* We convert it here every time as pci regions could be reconfigured. */
    2299                 rc = PDMVMMDevHeapR3ToGCPhys(pVM, pVM->hwaccm.s.vmx.pRealModeEPTPageTable, &GCPhys);
    2300                 AssertRC(rc);
    2301             }
    2302             else
    2303             {
    2304                 /* It applies to the guest's CR3. */
    2305                 GCPhys = pCtx->cr3;
    2306             }
    2307         }
     2281#if HC_ARCH_BITS == 64
     2282        rc = VMXReadVMCS(VMX_VMCS_EXIT_PHYS_ADDR_FULL, &GCPhys);
     2283        AssertRC(rc);
     2284#else
     2285        rc = VMXReadVMCS(VMX_VMCS_EXIT_PHYS_ADDR_FULL, &val);
     2286        AssertRC(rc);
     2287        GCPhys = val;
     2288        rc = VMXReadVMCS(VMX_VMCS_EXIT_PHYS_ADDR_HIGH, &val);
     2289        GCPhys |= (val << 32ULL);     
     2290#endif
    23082291
    23092292        /* Determine the kind of violation. */
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