HWACCMR0.cpp revision e5df2db7934a997e0e390ccb0172bfd96cc10c95
5b281ba489ca18f0380d7efc7a5108b606cce449vboxsync * HWACCM - Host Context Ring 0.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
c98fb3e16fcd571a790eab772c0c66173d225205vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
c98fb3e16fcd571a790eab772c0c66173d225205vboxsync * available from http://www.virtualbox.org. This file is free software;
c98fb3e16fcd571a790eab772c0c66173d225205vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * additional information or have any questions.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync/*******************************************************************************
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync* Header Files *
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync*******************************************************************************/
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync/*******************************************************************************
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync* Internal Functions *
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync*******************************************************************************/
cacc4e75dbbff469c10a505168208f064c6c385cvboxsyncstatic DECLCALLBACK(void) hwaccmR0EnableCPU(RTCPUID idCpu, void *pvUser1, void *pvUser2);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsyncstatic DECLCALLBACK(void) hwaccmR0DisableCPU(RTCPUID idCpu, void *pvUser1, void *pvUser2);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsyncstatic DECLCALLBACK(void) HWACCMR0InitCPU(RTCPUID idCpu, void *pvUser1, void *pvUser2);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsyncstatic int hwaccmR0CheckCpuRcArray(int *paRc, unsigned cErrorCodes, RTCPUID *pidCpu);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsyncstatic DECLCALLBACK(void) hwaccmR0PowerCallback(RTPOWEREVENT enmEvent, void *pvUser);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync/*******************************************************************************
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync* Global Variables *
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync*******************************************************************************/
cacc4e75dbbff469c10a505168208f064c6c385cvboxsyncstatic struct
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /** Ring 0 handlers for VT-x and AMD-V. */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync DECLR0CALLBACKMEMBER(int, pfnEnterSession,(PVM pVM, PVMCPU pVCpu, PHWACCM_CPUINFO pCpu));
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync DECLR0CALLBACKMEMBER(int, pfnLeaveSession,(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx));
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync DECLR0CALLBACKMEMBER(int, pfnSaveHostState,(PVM pVM, PVMCPU pVCpu));
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync DECLR0CALLBACKMEMBER(int, pfnLoadGuestState,(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx));
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync DECLR0CALLBACKMEMBER(int, pfnRunGuestCode,(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx));
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync DECLR0CALLBACKMEMBER(int, pfnEnableCpu, (PHWACCM_CPUINFO pCpu, PVM pVM, void *pvPageCpu, RTHCPHYS pPageCpuPhys));
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync DECLR0CALLBACKMEMBER(int, pfnDisableCpu, (PHWACCM_CPUINFO pCpu, void *pvPageCpu, RTHCPHYS pPageCpuPhys));
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /** Maximum ASID allowed. */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /** Set by the ring-0 driver to indicate VMX is supported by the CPU. */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /** Whether we're using SUPR0EnableVTx or not. */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /** Host CR4 value (set by ring-0 VMX init) */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /** VMX MSR values */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /* Last instruction error */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /** Set by the ring-0 driver to indicate SVM is supported by the CPU. */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /** SVM revision. */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /** SVM feature bits from cpuid 0x8000000a */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /** Saved error from detection */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync volatile bool fSuspended;
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync * Does global Ring-0 HWACCM initialization.
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync * @returns VBox status code.
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync memset(&HWACCMR0Globals, 0, sizeof(HWACCMR0Globals));
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.enmHwAccmState = HWACCMSTATE_UNINITIALIZED;
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync for (unsigned i = 0; i < RT_ELEMENTS(HWACCMR0Globals.aCpuInfo); i++)
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.aCpuInfo[i].pMemObj = NIL_RTR0MEMOBJ;
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /* Fill in all callbacks with placeholders. */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.pfnEnterSession = HWACCMR0DummyEnter;
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.pfnLeaveSession = HWACCMR0DummyLeave;
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.pfnSaveHostState = HWACCMR0DummySaveHostState;
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.pfnLoadGuestState = HWACCMR0DummyLoadGuestState;
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.pfnRunGuestCode = HWACCMR0DummyRunGuestCode;
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.pfnEnableCpu = HWACCMR0DummyEnableCpu;
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.pfnDisableCpu = HWACCMR0DummyDisableCpu;
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync * Check for VT-x and AMD-V capabilities
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync ASMCpuId(0, &u32Dummy, &u32VendorEBX, &u32VendorECX, &u32VendorEDX);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync ASMCpuId(1, &u32Dummy, &u32Dummy, &u32FeaturesECX, &u32FeaturesEDX);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /* Query AMD features. */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync ASMCpuId(0x80000001, &u32Dummy, &u32Dummy, &HWACCMR0Globals.cpuid.u32AMDFeatureECX, &HWACCMR0Globals.cpuid.u32AMDFeatureEDX);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync * Read all VMX MSRs if VMX is available. (same goes for RDMSR/WRMSR)
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync * We also assume all VMX-enabled CPUs support fxsave/fxrstor.
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.vmx.msr.feature_ctrl = ASMRdMsr(MSR_IA32_FEATURE_CONTROL);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync * First try use native kernel API for controlling VT-x.
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync * (This is only supported by some Mac OS X kernels atm.)
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.lLastError = rc = SUPR0EnableVTx(true /* fEnable */);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync AssertMsg(rc == VINF_SUCCESS || rc == VERR_VMX_IN_VMX_ROOT_MODE || rc == VERR_VMX_NO_VMX, ("%Rrc\n", rc));
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /* We need to check if VT-x has been properly initialized on all CPUs. Some BIOSes do a lousy job. */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.lLastError = RTMpOnAll(HWACCMR0InitCPU, (void *)u32VendorEBX, aRc);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /* Check the return code of all invocations. */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.lLastError = hwaccmR0CheckCpuRcArray(aRc, RT_ELEMENTS(aRc), &idCpu);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /* Reread in case we've changed it. */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.vmx.msr.feature_ctrl = ASMRdMsr(MSR_IA32_FEATURE_CONTROL);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync if ( (HWACCMR0Globals.vmx.msr.feature_ctrl & (MSR_IA32_FEATURE_CONTROL_VMXON|MSR_IA32_FEATURE_CONTROL_LOCK))
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync == (MSR_IA32_FEATURE_CONTROL_VMXON|MSR_IA32_FEATURE_CONTROL_LOCK))
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.vmx.msr.vmx_basic_info = ASMRdMsr(MSR_IA32_VMX_BASIC_INFO);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.vmx.msr.vmx_pin_ctls.u = ASMRdMsr(MSR_IA32_VMX_PINBASED_CTLS);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.vmx.msr.vmx_proc_ctls.u = ASMRdMsr(MSR_IA32_VMX_PROCBASED_CTLS);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.vmx.msr.vmx_exit.u = ASMRdMsr(MSR_IA32_VMX_EXIT_CTLS);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.vmx.msr.vmx_entry.u = ASMRdMsr(MSR_IA32_VMX_ENTRY_CTLS);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.vmx.msr.vmx_misc = ASMRdMsr(MSR_IA32_VMX_MISC);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.vmx.msr.vmx_cr0_fixed0 = ASMRdMsr(MSR_IA32_VMX_CR0_FIXED0);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.vmx.msr.vmx_cr0_fixed1 = ASMRdMsr(MSR_IA32_VMX_CR0_FIXED1);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.vmx.msr.vmx_cr4_fixed0 = ASMRdMsr(MSR_IA32_VMX_CR4_FIXED0);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.vmx.msr.vmx_cr4_fixed1 = ASMRdMsr(MSR_IA32_VMX_CR4_FIXED1);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.vmx.msr.vmx_vmcs_enum = ASMRdMsr(MSR_IA32_VMX_VMCS_ENUM);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /* VPID 16 bits ASID. */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.uMaxASID = 0x10000; /* exclusive */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync if (HWACCMR0Globals.vmx.msr.vmx_proc_ctls.n.allowed1 & VMX_VMCS_CTRL_PROC_EXEC_USE_SECONDARY_EXEC_CTRL)
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.vmx.msr.vmx_proc_ctls2.u = ASMRdMsr(MSR_IA32_VMX_PROCBASED_CTLS2);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync if (HWACCMR0Globals.vmx.msr.vmx_proc_ctls2.n.allowed1 & (VMX_VMCS_CTRL_PROC_EXEC2_EPT|VMX_VMCS_CTRL_PROC_EXEC2_VPID))
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.vmx.msr.vmx_eptcaps = ASMRdMsr(MSR_IA32_VMX_EPT_CAPS);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync rc = RTR0MemObjAllocCont(&pScatchMemObj, 1 << PAGE_SHIFT, true /* executable R0 mapping */);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync pScatchPagePhys = RTR0MemObjGetPagePhysAddr(pScatchMemObj, 0);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /* Set revision dword at the beginning of the structure. */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync *(uint32_t *)pvScatchPage = MSR_IA32_VMX_BASIC_INFO_VMCS_ID(HWACCMR0Globals.vmx.msr.vmx_basic_info);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /* Make sure we don't get rescheduled to another cpu during this probe. */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync * Check CR4.VMXE
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /* In theory this bit could be cleared behind our back. Which would cause #UD faults when we
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync * try to execute the VMX instructions...
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync ASMSetCR4(HWACCMR0Globals.vmx.hostCR4 | X86_CR4_VMXE);
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /* Enter VMX Root Mode */
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /* KVM leaves the CPU in VMX root mode. Not only is this not allowed, it will crash the host when we enter raw mode, because
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync * (a) clearing X86_CR4_VMXE in CR4 causes a #GP (we no longer modify this bit)
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync * (b) turning off paging causes a #GP (unavoidable when switching from long to 32 bits mode or 32 bits to PAE)
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync * They should fix their code, but until they do we simply refuse to run.
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync HWACCMR0Globals.lLastError = VERR_VMX_IN_VMX_ROOT_MODE;
cacc4e75dbbff469c10a505168208f064c6c385cvboxsync /* Restore CR4 again; don't leave the X86_CR4_VMXE flag set if it wasn't so before (some software could incorrectly think it's in VMX mode) */
#ifdef LOG_ENABLED
/* We need to check if AMD-V has been properly initialized on all CPUs. Some BIOSes might do a poor job. */
ASMCpuId(0x8000000A, &HWACCMR0Globals.svm.u32Rev, &HWACCMR0Globals.uMaxASID, &u32Dummy, &HWACCMR0Globals.svm.u32Features);
return VINF_SUCCESS;
for (unsigned i=0;i<cErrorCodes;i++)
if (RTMpIsCpuOnline(i))
*pidCpu = i;
return rc;
int rc;
return rc;
#ifdef LOG_ENABLED
Assert(idCpu == (RTCPUID)RTMpCpuIdToSetIndex(idCpu)); /// @todo fix idCpu == index assumption (rainy day)
ASMWrMsr(MSR_IA32_FEATURE_CONTROL, HWACCMR0Globals.vmx.msr.feature_ctrl | MSR_IA32_FEATURE_CONTROL_VMXON | MSR_IA32_FEATURE_CONTROL_LOCK);
return VERR_HWACCM_SUSPEND_PENDING;
if (ASMAtomicCmpXchgU32((volatile uint32_t *)&HWACCMR0Globals.enmHwAccmState, HWACCMSTATE_ENABLED, HWACCMSTATE_UNINITIALIZED))
int rc;
if (RTMpIsCpuOnline(i))
rc = RTR0MemObjAllocCont(&HWACCMR0Globals.aCpuInfo[i].pMemObj, 1 << PAGE_SHIFT, true /* executable R0 mapping */);
return rc;
#ifdef LOG_ENABLED
SUPR0Printf("address %x phys %x\n", pvR0, (uint32_t)RTR0MemObjGetPagePhysAddr(HWACCMR0Globals.aCpuInfo[i].pMemObj, 0));
return rc;
return VINF_SUCCESS;
void *pvPageCpu;
Assert(idCpu == (RTCPUID)RTMpCpuIdToSetIndex(idCpu)); /// @todo fix idCpu == index assumption (rainy day)
AssertFailed();
void *pvPageCpu;
Assert(idCpu == (RTCPUID)RTMpCpuIdToSetIndex(idCpu)); /// @todo fix idCpu == index assumption (rainy day)
#ifdef LOG_ENABLED
int rc;
rc = RTMpOnAll(HWACCMR0InitCPU, (void *)((HWACCMR0Globals.vmx.fSupported) ? X86_CPUID_VENDOR_INTEL_EBX : X86_CPUID_VENDOR_AMD_EBX), aRc);
#ifdef LOG_ENABLED
int rc;
#ifdef LOG_ENABLED
return VERR_HWACCM_SUSPEND_PENDING;
/* @note Not correct as we can be rescheduled to a different cpu, but the fInUse case is mostly for debugging. */
return rc;
int rc;
#ifdef LOG_ENABLED
/* @note Not correct as we can be rescheduled to a different cpu, but the fInUse case is mostly for debugging. */
return rc;
int rc;
#ifdef LOG_ENABLED
return rc;
int rc;
/* We must save the host context here (VT-x) as we might be rescheduled on a different cpu after a long jump back to ring 3. */
#ifdef VBOX_WITH_2X_4GB_ADDR_SPACE
return rc;
int rc;
* We must restore the host FPU here to make absolutely sure we don't leave the guest FPU state active
#ifdef RT_STRICT
return rc;
int rc;
#ifdef VBOX_STRICT
#ifdef VBOX_WITH_2X_4GB_ADDR_SPACE
#ifdef VBOX_WITH_2X_4GB_ADDR_SPACE
return rc;
#if HC_ARCH_BITS == 32 && defined(VBOX_ENABLE_64_BITS_GUESTS) && !defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
int rc;
return rc;
#endif /* HC_ARCH_BITS == 32 && defined(VBOX_WITH_64_BITS_GUESTS) && !defined(VBOX_WITH_HYBRID_32BIT_KERNEL) */
*pfVTxDisabled = false;
case VMMSWITCHER_32_TO_32:
case VMMSWITCHER_PAE_TO_PAE:
case VMMSWITCHER_32_TO_PAE:
case VMMSWITCHER_AMD64_TO_32:
case VMMSWITCHER_AMD64_TO_PAE:
AssertFailed();
return VERR_INTERNAL_ERROR;
void *pvPageCpu;
*pfVTxDisabled = true;
if (!fVTxDisabled)
void *pvPageCpu;
#ifdef VBOX_STRICT
unsigned cch;
const char *psz;
} aFlags[] =
if (pszAdd)
(RTSEL)pCtx->cs, pCtx->csHid.u64Base, pCtx->csHid.u32Limit, pCtx->csHid.Attr.u, pCtx->dr[0], pCtx->dr[1],
(RTSEL)pCtx->ds, pCtx->dsHid.u64Base, pCtx->dsHid.u32Limit, pCtx->dsHid.Attr.u, pCtx->dr[2], pCtx->dr[3],
(RTSEL)pCtx->es, pCtx->esHid.u64Base, pCtx->esHid.u32Limit, pCtx->esHid.Attr.u, pCtx->dr[4], pCtx->dr[5],
(RTSEL)pCtx->fs, pCtx->fsHid.u64Base, pCtx->fsHid.u32Limit, pCtx->fsHid.Attr.u, pCtx->dr[6], pCtx->dr[7],
(RTSEL)pCtx->gs, pCtx->gsHid.u64Base, pCtx->gsHid.u32Limit, pCtx->gsHid.Attr.u, pCtx->cr0, pCtx->cr2,
(RTSEL)pCtx->ss, pCtx->ssHid.u64Base, pCtx->ssHid.u32Limit, pCtx->ssHid.Attr.u, pCtx->cr3, pCtx->cr4,
return VINF_SUCCESS;
return VINF_SUCCESS;
VMMR0DECL(int) HWACCMR0DummyEnableCpu(PHWACCM_CPUINFO pCpu, PVM pVM, void *pvPageCpu, RTHCPHYS pPageCpuPhys)
return VINF_SUCCESS;
VMMR0DECL(int) HWACCMR0DummyDisableCpu(PHWACCM_CPUINFO pCpu, void *pvPageCpu, RTHCPHYS pPageCpuPhys)
return VINF_SUCCESS;
return VINF_SUCCESS;
return VINF_SUCCESS;
return VINF_SUCCESS;
return VINF_SUCCESS;
return VINF_SUCCESS;
return VINF_SUCCESS;