summaryrefslogtreecommitdiffstats
path: root/src/VBox/Devices/testcase/tstDeviceVMMStubs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/Devices/testcase/tstDeviceVMMStubs.cpp')
-rw-r--r--src/VBox/Devices/testcase/tstDeviceVMMStubs.cpp991
1 files changed, 991 insertions, 0 deletions
diff --git a/src/VBox/Devices/testcase/tstDeviceVMMStubs.cpp b/src/VBox/Devices/testcase/tstDeviceVMMStubs.cpp
new file mode 100644
index 00000000..3ac54bd5
--- /dev/null
+++ b/src/VBox/Devices/testcase/tstDeviceVMMStubs.cpp
@@ -0,0 +1,991 @@
+/* $Id: tstDeviceVMMStubs.cpp $ */
+/** @file
+ * tstDevice - Test framework for PDM devices/drivers, shim library exporting methods
+ * originally for VBoxVMM for intercepting (we don't want to use the PDM module
+ * to use the originals from VBoxVMM).
+ */
+
+/*
+ * Copyright (C) 2017-2019 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+/* Methods imported from VBoxVMM by VBoxDD are extracted with:
+ * objdump -T VBoxDD.so | grep "UND" | awk -F ' ' '{print $5}' | grep -E "^TM|^PGM|^PDM|^CFGM|^IOM|^MM|^VM|^PDM|^SUP" | sort
+ */
+
+
+/*********************************************************************************************************************************
+* Header Files *
+*********************************************************************************************************************************/
+#define LOG_GROUP LOG_GROUP_DEFAULT /** @todo */
+#include <iprt/assert.h>
+#include <iprt/mem.h>
+
+#include <VBox/err.h>
+#include <VBox/cdefs.h>
+
+#include "tstDeviceVMMInternal.h"
+
+
+/*********************************************************************************************************************************
+* Defined Constants And Macros *
+*********************************************************************************************************************************/
+
+
+/*********************************************************************************************************************************
+* Structures and Typedefs *
+*********************************************************************************************************************************/
+
+
+/*********************************************************************************************************************************
+* Global Variables *
+*********************************************************************************************************************************/
+
+
+/*********************************************************************************************************************************
+* Internal Functions *
+*********************************************************************************************************************************/
+
+
+/**
+ * @copydoc CFGMR3AreValuesValid
+ */
+VMMR3DECL(bool) CFGMR3AreValuesValid(PCFGMNODE pNode, const char *pszzValid)
+{
+ return pNode->pVmmCallbacks->pfnCFGMR3AreValuesValid(pNode, pszzValid);
+}
+
+
+/**
+ * @copydoc CFGMR3Dump
+ */
+VMMR3DECL(void) CFGMR3Dump(PCFGMNODE pRoot)
+{
+ pRoot->pVmmCallbacks->pfnCFGMR3Dump(pRoot);
+}
+
+
+/**
+ * @copydoc CFGMR3GetChild
+ */
+VMMR3DECL(PCFGMNODE) CFGMR3GetChild(PCFGMNODE pNode, const char *pszPath)
+{
+ return pNode->pVmmCallbacks->pfnCFGMR3GetChild(pNode, pszPath);
+}
+
+
+/**
+ * @copydoc CFGMR3GetChildF
+ */
+VMMR3DECL(PCFGMNODE) CFGMR3GetChildF(PCFGMNODE pNode, const char *pszPathFormat, ...) RT_IPRT_FORMAT_ATTR(2, 3)
+{
+ va_list Args;
+ va_start(Args, pszPathFormat);
+ PCFGMNODE pChild = pNode->pVmmCallbacks->pfnCFGMR3GetChildFV(pNode, pszPathFormat, Args);
+ va_end(Args);
+
+ return pChild;
+}
+
+
+/**
+ * @copydoc CFGMR3GetFirstChild
+ */
+VMMR3DECL(PCFGMNODE) CFGMR3GetFirstChild(PCFGMNODE pNode)
+{
+ return pNode->pVmmCallbacks->pfnCFGMR3GetFirstChild(pNode);
+}
+
+
+/**
+ * @copydoc CFGMR3GetName
+ */
+VMMR3DECL(int) CFGMR3GetName(PCFGMNODE pCur, char *pszName, size_t cchName)
+{
+ return pCur->pVmmCallbacks->pfnCFGMR3GetName(pCur, pszName, cchName);
+}
+
+
+/**
+ * @copydoc CFGMR3GetFirstChild
+ */
+VMMR3DECL(PCFGMNODE) CFGMR3GetNextChild(PCFGMNODE pNode)
+{
+ return pNode->pVmmCallbacks->pfnCFGMR3GetNextChild(pNode);
+}
+
+
+/**
+ * @copydoc CFGMR3GetParent
+ */
+VMMR3DECL(PCFGMNODE) CFGMR3GetParent(PCFGMNODE pNode)
+{
+ return pNode->pVmmCallbacks->pfnCFGMR3GetParent(pNode);
+}
+
+
+/**
+ * @copydoc CFGMR3GetRoot
+ */
+VMMR3DECL(PCFGMNODE) CFGMR3GetRoot(PVM pVM)
+{
+ return pVM->vm.s.pVmmCallbacks->pfnCFGMR3GetRoot(pVM);
+}
+
+
+/**
+ * @copydoc CFGMR3InsertNode
+ */
+VMMR3DECL(int) CFGMR3InsertNode(PCFGMNODE pNode, const char *pszName, PCFGMNODE *ppChild)
+{
+ return pNode->pVmmCallbacks->pfnCFGMR3InsertNode(pNode, pszName, ppChild);
+}
+
+
+/**
+ * @copydoc CFGMR3InsertNodeF
+ */
+VMMR3DECL(int) CFGMR3InsertNodeF(PCFGMNODE pNode, PCFGMNODE *ppChild,
+ const char *pszNameFormat, ...) RT_IPRT_FORMAT_ATTR(3, 4)
+{
+ va_list Args;
+ va_start(Args, pszNameFormat);
+ int rc = pNode->pVmmCallbacks->pfnCFGMR3InsertNodeFV(pNode, ppChild, pszNameFormat, Args);
+ va_end(Args);
+
+ return rc;
+}
+
+
+/**
+ * @copydoc CFGMR3InsertString
+ */
+VMMR3DECL(int) CFGMR3InsertString(PCFGMNODE pNode, const char *pszName, const char *pszString)
+{
+ return pNode->pVmmCallbacks->pfnCFGMR3InsertString(pNode, pszName, pszString);
+}
+
+
+/**
+ * @copydoc CFGMR3QueryBool
+ */
+VMMR3DECL(int) CFGMR3QueryBool(PCFGMNODE pNode, const char *pszName, bool *pf)
+{
+ uint64_t u64;
+ int rc = CFGMR3QueryInteger(pNode, pszName, &u64);
+ if (RT_SUCCESS(rc))
+ *pf = u64 ? true : false;
+ return rc;
+}
+
+
+/**
+ * @copydoc CFGMR3QueryBoolDef
+ */
+VMMR3DECL(int) CFGMR3QueryBoolDef(PCFGMNODE pNode, const char *pszName, bool *pf, bool fDef)
+{
+ uint64_t u64;
+ int rc = CFGMR3QueryIntegerDef(pNode, pszName, &u64, fDef);
+ *pf = u64 ? true : false;
+ return rc;
+}
+
+
+/**
+ * @copydoc CFGMR3QueryBytes
+ */
+VMMR3DECL(int) CFGMR3QueryBytes(PCFGMNODE pNode, const char *pszName, void *pvData, size_t cbData)
+{
+ return pNode->pVmmCallbacks->pfnCFGMR3QueryBytes(pNode, pszName, pvData, cbData);
+}
+
+
+/**
+ * @copydoc CFGMR3QueryInteger
+ */
+VMMR3DECL(int) CFGMR3QueryInteger(PCFGMNODE pNode, const char *pszName, uint64_t *pu64)
+{
+ return pNode->pVmmCallbacks->pfnCFGMR3QueryInteger(pNode, pszName, pu64);
+}
+
+
+/**
+ * @copydoc CFGMR3QueryIntegerDef
+ */
+VMMR3DECL(int) CFGMR3QueryIntegerDef(PCFGMNODE pNode, const char *pszName, uint64_t *pu64, uint64_t u64Def)
+{
+ int rc = CFGMR3QueryInteger(pNode, pszName, pu64);
+ if (RT_FAILURE(rc))
+ {
+ *pu64 = u64Def;
+ if (rc == VERR_CFGM_VALUE_NOT_FOUND || rc == VERR_CFGM_NO_PARENT)
+ rc = VINF_SUCCESS;
+ }
+
+ return rc;
+}
+
+
+/**
+ * @copydoc CFGMR3QueryPortDef
+ */
+VMMR3DECL(int) CFGMR3QueryPortDef(PCFGMNODE pNode, const char *pszName, PRTIOPORT pPort, RTIOPORT PortDef)
+{
+ AssertCompileSize(RTIOPORT, 2);
+ return CFGMR3QueryU16Def(pNode, pszName, pPort, PortDef);
+}
+
+
+/**
+ * @copydoc CFGMR3QueryPtr
+ */
+VMMR3DECL(int) CFGMR3QueryPtr(PCFGMNODE pNode, const char *pszName, void **ppv)
+{
+ uint64_t u64;
+ int rc = CFGMR3QueryInteger(pNode, pszName, &u64);
+ if (RT_SUCCESS(rc))
+ {
+ uintptr_t u = (uintptr_t)u64;
+ if (u64 == u)
+ *ppv = (void *)u;
+ else
+ rc = VERR_CFGM_INTEGER_TOO_BIG;
+ }
+ return rc;
+}
+
+
+/**
+ * @copydoc CFGMR3QueryS32
+ */
+VMMR3DECL(int) CFGMR3QueryS32(PCFGMNODE pNode, const char *pszName, int32_t *pi32)
+{
+ uint64_t u64;
+ int rc = CFGMR3QueryInteger(pNode, pszName, &u64);
+ if (RT_SUCCESS(rc))
+ {
+ if ( !(u64 & UINT64_C(0xffffffff80000000))
+ || (u64 & UINT64_C(0xffffffff80000000)) == UINT64_C(0xffffffff80000000))
+ *pi32 = (int32_t)u64;
+ else
+ rc = VERR_CFGM_INTEGER_TOO_BIG;
+ }
+ return rc;
+}
+
+
+/**
+ * @copydoc CFGMR3QueryS32Def
+ */
+VMMR3DECL(int) CFGMR3QueryS32Def(PCFGMNODE pNode, const char *pszName, int32_t *pi32, int32_t i32Def)
+{
+ uint64_t u64;
+ int rc = CFGMR3QueryIntegerDef(pNode, pszName, &u64, i32Def);
+ if (RT_SUCCESS(rc))
+ {
+ if ( !(u64 & UINT64_C(0xffffffff80000000))
+ || (u64 & UINT64_C(0xffffffff80000000)) == UINT64_C(0xffffffff80000000))
+ *pi32 = (int32_t)u64;
+ else
+ rc = VERR_CFGM_INTEGER_TOO_BIG;
+ }
+ if (RT_FAILURE(rc))
+ *pi32 = i32Def;
+ return rc;
+}
+
+
+/**
+ * @copydoc CFGMR3QuerySIntDef
+ */
+VMMR3DECL(int) CFGMR3QuerySIntDef(PCFGMNODE pNode, const char *pszName, signed int *pi, signed int iDef)
+{
+ AssertCompileSize(signed int, 4);
+ return CFGMR3QueryS32Def(pNode, pszName, (int32_t *)pi, iDef);
+}
+
+
+/**
+ * @copydoc CFGMR3QuerySize
+ */
+VMMDECL(int) CFGMR3QuerySize(PCFGMNODE pNode, const char *pszName, size_t *pcb)
+{
+ return pNode->pVmmCallbacks->pfnCFGMR3QuerySize(pNode, pszName, pcb);
+}
+
+
+/**
+ * @copydoc CFGMR3QueryString
+ */
+VMMR3DECL(int) CFGMR3QueryString(PCFGMNODE pNode, const char *pszName, char *pszString, size_t cchString)
+{
+ return pNode->pVmmCallbacks->pfnCFGMR3QueryString(pNode, pszName, pszString, cchString);
+}
+
+
+/**
+ * @copydoc CFGMR3QueryStringDef
+ */
+VMMR3DECL(int) CFGMR3QueryStringDef(PCFGMNODE pNode, const char *pszName, char *pszString, size_t cchString, const char *pszDef)
+{
+ int rc = CFGMR3QueryString(pNode, pszName, pszString, cchString);
+ if (RT_FAILURE(rc) && rc != VERR_CFGM_NOT_ENOUGH_SPACE)
+ {
+ size_t cchDef = strlen(pszDef);
+ if (cchString > cchDef)
+ {
+ memcpy(pszString, pszDef, cchDef);
+ memset(pszString + cchDef, 0, cchString - cchDef);
+ if (rc == VERR_CFGM_VALUE_NOT_FOUND || rc == VERR_CFGM_NO_PARENT)
+ rc = VINF_SUCCESS;
+ }
+ else if (rc == VERR_CFGM_VALUE_NOT_FOUND || rc == VERR_CFGM_NO_PARENT)
+ rc = VERR_CFGM_NOT_ENOUGH_SPACE;
+ }
+
+ return rc;
+}
+
+
+/**
+ * @copydoc CFGMR3QueryStringAlloc
+ */
+VMMR3DECL(int) CFGMR3QueryStringAlloc(PCFGMNODE pNode, const char *pszName, char **ppszString)
+{
+#if 0
+ size_t cbString;
+ int rc = CFGMR3QuerySize(pNode, pszName, &cbString);
+ if (RT_SUCCESS(rc))
+ {
+ char *pszString = cfgmR3StrAlloc(pNode->pVM, MM_TAG_CFGM_USER, cbString);
+ if (pszString)
+ {
+ rc = CFGMR3QueryString(pNode, pszName, pszString, cbString);
+ if (RT_SUCCESS(rc))
+ *ppszString = pszString;
+ else
+ cfgmR3StrFree(pNode->pVM, pszString);
+ }
+ else
+ rc = VERR_NO_MEMORY;
+ }
+ return rc;
+#endif
+ RT_NOREF(pNode, pszName, ppszString);
+ AssertFailed();
+ return VERR_NOT_IMPLEMENTED;
+}
+
+
+/**
+ * @copydoc CFGMR3QueryStringAllocDef
+ */
+VMMR3DECL(int) CFGMR3QueryStringAllocDef(PCFGMNODE pNode, const char *pszName, char **ppszString, const char *pszDef)
+{
+ RT_NOREF(pNode, pszName, ppszString, pszDef);
+ AssertFailed();
+ return VERR_NOT_IMPLEMENTED;
+}
+
+
+/**
+ * @copydoc CFGMR3QueryU16
+ */
+VMMR3DECL(int) CFGMR3QueryU16(PCFGMNODE pNode, const char *pszName, uint16_t *pu16)
+{
+ uint64_t u64;
+ int rc = CFGMR3QueryInteger(pNode, pszName, &u64);
+ if (RT_SUCCESS(rc))
+ {
+ if (!(u64 & UINT64_C(0xffffffffffff0000)))
+ *pu16 = (int16_t)u64;
+ else
+ rc = VERR_CFGM_INTEGER_TOO_BIG;
+ }
+ return rc;
+}
+
+
+/**
+ * @copydoc CFGMR3QueryU16Def
+ */
+VMMR3DECL(int) CFGMR3QueryU16Def(PCFGMNODE pNode, const char *pszName, uint16_t *pu16, uint16_t u16Def)
+{
+ uint64_t u64;
+ int rc = CFGMR3QueryIntegerDef(pNode, pszName, &u64, u16Def);
+ if (RT_SUCCESS(rc))
+ {
+ if (!(u64 & UINT64_C(0xffffffffffff0000)))
+ *pu16 = (int16_t)u64;
+ else
+ rc = VERR_CFGM_INTEGER_TOO_BIG;
+ }
+ if (RT_FAILURE(rc))
+ *pu16 = u16Def;
+ return rc;
+}
+
+
+/**
+ * @copydoc CFGMR3QueryU32
+ */
+VMMR3DECL(int) CFGMR3QueryU32(PCFGMNODE pNode, const char *pszName, uint32_t *pu32)
+{
+ uint64_t u64;
+ int rc = CFGMR3QueryInteger(pNode, pszName, &u64);
+ if (RT_SUCCESS(rc))
+ {
+ if (!(u64 & UINT64_C(0xffffffff00000000)))
+ *pu32 = (uint32_t)u64;
+ else
+ rc = VERR_CFGM_INTEGER_TOO_BIG;
+ }
+ return rc;
+}
+
+
+/**
+ * @copydoc CFGMR3QueryU32Def
+ */
+VMMR3DECL(int) CFGMR3QueryU32Def(PCFGMNODE pNode, const char *pszName, uint32_t *pu32, uint32_t u32Def)
+{
+ uint64_t u64;
+ int rc = CFGMR3QueryIntegerDef(pNode, pszName, &u64, u32Def);
+ if (RT_SUCCESS(rc))
+ {
+ if (!(u64 & UINT64_C(0xffffffff00000000)))
+ *pu32 = (uint32_t)u64;
+ else
+ rc = VERR_CFGM_INTEGER_TOO_BIG;
+ }
+ if (RT_FAILURE(rc))
+ *pu32 = u32Def;
+ return rc;
+}
+
+
+/**
+ * @copydoc CFGMR3QueryU64
+ */
+VMMR3DECL(int) CFGMR3QueryU64(PCFGMNODE pNode, const char *pszName, uint64_t *pu64)
+{
+ return CFGMR3QueryInteger(pNode, pszName, pu64);
+}
+
+
+/**
+ * @copydoc CFGMR3QueryU64Def
+ */
+VMMR3DECL(int) CFGMR3QueryU64Def(PCFGMNODE pNode, const char *pszName, uint64_t *pu64, uint64_t u64Def)
+{
+ return CFGMR3QueryIntegerDef(pNode, pszName, pu64, u64Def);
+}
+
+
+/**
+ * @copydoc CFGMR3QueryU8
+ */
+VMMR3DECL(int) CFGMR3QueryU8(PCFGMNODE pNode, const char *pszName, uint8_t *pu8)
+{
+ uint64_t u64;
+ int rc = CFGMR3QueryInteger(pNode, pszName, &u64);
+ if (RT_SUCCESS(rc))
+ {
+ if (!(u64 & UINT64_C(0xffffffffffffff00)))
+ *pu8 = (uint8_t)u64;
+ else
+ rc = VERR_CFGM_INTEGER_TOO_BIG;
+ }
+ return rc;
+}
+
+
+/**
+ * @copydoc CFGMR3QueryU8Def
+ */
+VMMR3DECL(int) CFGMR3QueryU8Def(PCFGMNODE pNode, const char *pszName, uint8_t *pu8, uint8_t u8Def)
+{
+ uint64_t u64;
+ int rc = CFGMR3QueryIntegerDef(pNode, pszName, &u64, u8Def);
+ if (RT_SUCCESS(rc))
+ {
+ if (!(u64 & UINT64_C(0xffffffffffffff00)))
+ *pu8 = (uint8_t)u64;
+ else
+ rc = VERR_CFGM_INTEGER_TOO_BIG;
+ }
+ if (RT_FAILURE(rc))
+ *pu8 = u8Def;
+ return rc;
+}
+
+
+/**
+ * @copydoc CFGMR3RemoveNode
+ */
+VMMR3DECL(void) CFGMR3RemoveNode(PCFGMNODE pNode)
+{
+ pNode->pVmmCallbacks->pfnCFGMR3RemoveNode(pNode);
+}
+
+
+/**
+ * @copydoc CFGMR3ValidateConfig
+ */
+VMMR3DECL(int) CFGMR3ValidateConfig(PCFGMNODE pNode, const char *pszNode,
+ const char *pszValidValues, const char *pszValidNodes,
+ const char *pszWho, uint32_t uInstance)
+{
+ return pNode->pVmmCallbacks->pfnCFGMR3ValidateConfig(pNode, pszNode, pszValidValues, pszValidNodes, pszWho, uInstance);
+}
+
+
+/**
+ * @copydoc IOMIOPortWrite
+ */
+VMMDECL(VBOXSTRICTRC) IOMIOPortWrite(PVM pVM, PVMCPU pVCpu, RTIOPORT Port, uint32_t u32Value, size_t cbValue)
+{
+ return pVM->vm.s.pVmmCallbacks->pfnIOMIOPortWrite(pVM, pVCpu, Port, u32Value, cbValue);
+}
+
+
+/**
+ * @copydoc IOMMMIOMapMMIO2Page
+ */
+VMMDECL(int) IOMMMIOMapMMIO2Page(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS GCPhysRemapped, uint64_t fPageFlags)
+{
+ return pVM->vm.s.pVmmCallbacks->pfnIOMMMIOMapMMIO2Page(pVM, GCPhys, GCPhysRemapped, fPageFlags);
+}
+
+
+/**
+ * @copydoc IOMMMIOResetRegion
+ */
+VMMDECL(int) IOMMMIOResetRegion(PVM pVM, RTGCPHYS GCPhys)
+{
+ return pVM->vm.s.pVmmCallbacks->pfnIOMMMIOResetRegion(pVM, GCPhys);
+}
+
+
+/**
+ * @copydoc MMHyperAlloc
+ */
+VMMDECL(int) MMHyperAlloc(PVM pVM, size_t cb, uint32_t uAlignment, MMTAG enmTag, void **ppv)
+{
+ return pVM->vm.s.pVmmCallbacks->pfnMMHyperAlloc(pVM, cb, uAlignment, enmTag, ppv);
+}
+
+
+/**
+ * @copydoc MMHyperFree
+ */
+VMMDECL(int) MMHyperFree(PVM pVM, void *pv)
+{
+ return pVM->vm.s.pVmmCallbacks->pfnMMHyperFree(pVM, pv);
+}
+
+
+/**
+ * @copydoc MMHyperR3ToR0
+ */
+VMMDECL(RTR0PTR) MMHyperR3ToR0(PVM pVM, RTR3PTR R3Ptr)
+{
+ return pVM->vm.s.pVmmCallbacks->pfnMMHyperR3ToR0(pVM, R3Ptr);
+}
+
+
+/**
+ * @copydoc MMHyperR3ToRC
+ */
+VMMDECL(RTRCPTR) MMHyperR3ToRC(PVM pVM, RTR3PTR R3Ptr)
+{
+ return pVM->vm.s.pVmmCallbacks->pfnMMHyperR3ToRC(pVM, R3Ptr);
+}
+
+
+/**
+ * @copydoc MMR3HeapFree
+ */
+VMMR3DECL(void) MMR3HeapFree(void *pv)
+{
+ PTSTDEVMMHEAPALLOC pHeapAlloc = (PTSTDEVMMHEAPALLOC)((uint8_t *)pv - RT_UOFFSETOF(TSTDEVMMHEAPALLOC, abAlloc[0]));
+ pHeapAlloc->pVmmCallbacks->pfnMMR3HeapFree(pv);
+}
+
+
+/**
+ * @copydoc MMR3HyperAllocOnceNoRel
+ */
+VMMR3DECL(int) MMR3HyperAllocOnceNoRel(PVM pVM, size_t cb, uint32_t uAlignment, MMTAG enmTag, void **ppv)
+{
+ return pVM->vm.s.pVmmCallbacks->pfnMMR3HyperAllocOnceNoRel(pVM, cb, uAlignment, enmTag, ppv);
+}
+
+
+/**
+ * @copydoc MMR3PhysGetRamSize
+ */
+VMMR3DECL(uint64_t) MMR3PhysGetRamSize(PVM pVM)
+{
+ return pVM->vm.s.pVmmCallbacks->pfnMMR3PhysGetRamSize(pVM);
+}
+
+
+/**
+ * @copydoc MMR3PhysGetRamSizeBelow4GB
+ */
+VMMR3DECL(uint32_t) MMR3PhysGetRamSizeBelow4GB(PVM pVM)
+{
+ return pVM->vm.s.pVmmCallbacks->pfnMMR3PhysGetRamSizeBelow4GB(pVM);
+}
+
+
+/**
+ * @copydoc MMR3PhysGetRamSizeAbove4GB
+ */
+VMMR3DECL(uint64_t) MMR3PhysGetRamSizeAbove4GB(PVM pVM)
+{
+ return pVM->vm.s.pVmmCallbacks->pfnMMR3PhysGetRamSizeAbove4GB(pVM);
+}
+
+
+/**
+ * @copydoc PDMCritSectEnterDebug
+ */
+VMMDECL(int) PDMCritSectEnterDebug(PPDMCRITSECT pCritSect, int rcBusy, RTHCUINTPTR uId, RT_SRC_POS_DECL)
+{
+ return pCritSect->s.pVmmCallbacks->pfnPDMCritSectEnterDebug(pCritSect, rcBusy, uId, RT_SRC_POS_ARGS);
+}
+
+
+/**
+ * @copydoc PDMCritSectIsInitialized
+ */
+VMMDECL(bool) PDMCritSectIsInitialized(PCPDMCRITSECT pCritSect)
+{
+ return pCritSect->s.pVmmCallbacks->pfnPDMCritSectIsInitialized(pCritSect);
+}
+
+
+/**
+ * @copydoc PDMCritSectIsOwner
+ */
+VMMDECL(bool) PDMCritSectIsOwner(PCPDMCRITSECT pCritSect)
+{
+ return pCritSect->s.pVmmCallbacks->pfnPDMCritSectIsOwner(pCritSect);
+}
+
+
+/**
+ * @copydoc PDMCritSectLeave
+ */
+VMMDECL(int) PDMCritSectLeave(PPDMCRITSECT pCritSect)
+{
+ return pCritSect->s.pVmmCallbacks->pfnPDMCritSectLeave(pCritSect);
+}
+
+
+/**
+ * @copydoc PDMCritSectTryEnterDebug
+ */
+VMMDECL(int) PDMCritSectTryEnterDebug(PPDMCRITSECT pCritSect, RTHCUINTPTR uId, RT_SRC_POS_DECL)
+{
+ return pCritSect->s.pVmmCallbacks->pfnPDMCritSectTryEnterDebug(pCritSect, uId, RT_SRC_POS_ARGS);
+}
+
+
+/**
+ * @copydoc PDMHCCritSectScheduleExitEvent
+ */
+VMMDECL(int) PDMHCCritSectScheduleExitEvent(PPDMCRITSECT pCritSect, SUPSEMEVENT hEventToSignal)
+{
+ return pCritSect->s.pVmmCallbacks->pfnPDMHCCritSectScheduleExitEvent(pCritSect, hEventToSignal);
+}
+
+
+/**
+ * @copydoc PDMNsAllocateBandwidth
+ */
+VMMDECL(bool) PDMNsAllocateBandwidth(PPDMNSFILTER pFilter, size_t cbTransfer)
+{
+#if 0
+ return pFilter->pVmmCallbacks->pfnPDMNsAllocateBandwidth(pFilter, cbTransfer);
+#endif
+ RT_NOREF(pFilter, cbTransfer);
+ AssertFailed();
+ return false;
+}
+
+
+/**
+ * @copydoc PDMQueueAlloc
+ */
+VMMDECL(PPDMQUEUEITEMCORE) PDMQueueAlloc(PPDMQUEUE pQueue)
+{
+ return pQueue->pVmmCallbacks->pfnPDMQueueAlloc(pQueue);
+}
+
+
+/**
+ * @copydoc PDMQueueFlushIfNecessary
+ */
+VMMDECL(bool) PDMQueueFlushIfNecessary(PPDMQUEUE pQueue)
+{
+ return pQueue->pVmmCallbacks->pfnPDMQueueFlushIfNecessary(pQueue);
+}
+
+
+/**
+ * @copydoc PDMQueueInsert
+ */
+VMMDECL(void) PDMQueueInsert(PPDMQUEUE pQueue, PPDMQUEUEITEMCORE pItem)
+{
+ pQueue->pVmmCallbacks->pfnPDMQueueInsert(pQueue, pItem);
+}
+
+
+/**
+ * @copydoc PDMQueueR0Ptr
+ */
+VMMDECL(R0PTRTYPE(PPDMQUEUE)) PDMQueueR0Ptr(PPDMQUEUE pQueue)
+{
+ return pQueue->pVmmCallbacks->pfnPDMQueueR0Ptr(pQueue);
+}
+
+
+/**
+ * @copydoc PDMQueueRCPtr
+ */
+VMMDECL(RCPTRTYPE(PPDMQUEUE)) PDMQueueRCPtr(PPDMQUEUE pQueue)
+{
+ return pQueue->pVmmCallbacks->pfnPDMQueueRCPtr(pQueue);
+}
+
+
+/**
+ * @copydoc PGMHandlerPhysicalPageTempOff
+ */
+VMMDECL(int) PGMHandlerPhysicalPageTempOff(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS GCPhysPage)
+{
+ RT_NOREF(pVM, GCPhys, GCPhysPage);
+ AssertFailed();
+ return VERR_NOT_IMPLEMENTED;
+}
+
+
+/**
+ * @copydoc PGMShwMakePageWritable
+ */
+VMMDECL(int) PGMShwMakePageWritable(PVMCPU pVCpu, RTGCPTR GCPtr, uint32_t fFlags)
+{
+ RT_NOREF(pVCpu, GCPtr, fFlags);
+ AssertFailed();
+ return VERR_NOT_IMPLEMENTED;
+}
+
+/** @todo PDMR3AsyncCompletion + BlkCache + CritSect + QueryLun + Thread. */
+
+/**
+ * @copydoc TMCpuTicksPerSecond
+ */
+VMMDECL(uint64_t) TMCpuTicksPerSecond(PVM pVM)
+{
+ return pVM->vm.s.pVmmCallbacks->pfnTMCpuTicksPerSecond(pVM);
+}
+
+
+/**
+ * @copydoc TMR3TimerDestroy
+ */
+VMMR3DECL(int) TMR3TimerDestroy(PTMTIMER pTimer)
+{
+ return pTimer->pVmmCallbacks->pfnTMR3TimerDestroy(pTimer);
+}
+
+
+/**
+ * @copydoc TMR3TimerSave
+ */
+VMMR3DECL(int) TMR3TimerSave(PTMTIMERR3 pTimer, PSSMHANDLE pSSM)
+{
+ return pTimer->pVmmCallbacks->pfnTMR3TimerSave(pTimer, pSSM);
+}
+
+
+/**
+ * @copydoc TMR3TimerLoad
+ */
+VMMR3DECL(int) TMR3TimerLoad(PTMTIMERR3 pTimer, PSSMHANDLE pSSM)
+{
+ return pTimer->pVmmCallbacks->pfnTMR3TimerLoad(pTimer, pSSM);
+}
+
+
+/**
+ * @copydoc TMR3TimerSetCritSect
+ */
+VMMR3DECL(int) TMR3TimerSetCritSect(PTMTIMERR3 pTimer, PPDMCRITSECT pCritSect)
+{
+ return pTimer->pVmmCallbacks->pfnTMR3TimerSetCritSect(pTimer, pCritSect);
+}
+
+
+/**
+ * @copydoc TMTimerFromMilli
+ */
+VMMDECL(uint64_t) TMTimerFromMilli(PTMTIMER pTimer, uint64_t cMilliSecs)
+{
+ return pTimer->pVmmCallbacks->pfnTMTimerFromMilli(pTimer, cMilliSecs);
+}
+
+
+/**
+ * @copydoc TMTimerFromNano
+ */
+VMMDECL(uint64_t) TMTimerFromNano(PTMTIMER pTimer, uint64_t cNanoSecs)
+{
+ return pTimer->pVmmCallbacks->pfnTMTimerFromNano(pTimer, cNanoSecs);
+}
+
+
+/**
+ * @copydoc TMTimerGet
+ */
+VMMDECL(uint64_t) TMTimerGet(PTMTIMER pTimer)
+{
+ return pTimer->pVmmCallbacks->pfnTMTimerGet(pTimer);
+}
+
+
+/**
+ * @copydoc TMTimerGetFreq
+ */
+VMMDECL(uint64_t) TMTimerGetFreq(PTMTIMER pTimer)
+{
+ return pTimer->pVmmCallbacks->pfnTMTimerGetFreq(pTimer);
+}
+
+
+/**
+ * @copydoc TMTimerGetNano
+ */
+VMMDECL(uint64_t) TMTimerGetNano(PTMTIMER pTimer)
+{
+ return pTimer->pVmmCallbacks->pfnTMTimerGetNano(pTimer);
+}
+
+
+/**
+ * @copydoc TMTimerIsActive
+ */
+VMMDECL(bool) TMTimerIsActive(PTMTIMER pTimer)
+{
+ return pTimer->pVmmCallbacks->pfnTMTimerIsActive(pTimer);
+}
+
+
+/**
+ * @copydoc TMTimerIsLockOwner
+ */
+VMMDECL(bool) TMTimerIsLockOwner(PTMTIMER pTimer)
+{
+ return pTimer->pVmmCallbacks->pfnTMTimerIsLockOwner(pTimer);
+}
+
+
+/**
+ * @copydoc TMTimerLock
+ */
+VMMDECL(int) TMTimerLock(PTMTIMER pTimer, int rcBusy)
+{
+ return pTimer->pVmmCallbacks->pfnTMTimerLock(pTimer, rcBusy);
+}
+
+
+/**
+ * @copydoc TMTimerR0Ptr
+ */
+VMMDECL(PTMTIMERR0) TMTimerR0Ptr(PTMTIMER pTimer)
+{
+ return pTimer->pVmmCallbacks->pfnTMTimerR0Ptr(pTimer);
+}
+
+
+/**
+ * @copydoc TMTimerRCPtr
+ */
+VMMDECL(PTMTIMERRC) TMTimerRCPtr(PTMTIMER pTimer)
+{
+ return pTimer->pVmmCallbacks->pfnTMTimerRCPtr(pTimer);
+}
+
+
+/**
+ * @copydoc TMTimerSet
+ */
+VMMDECL(int) TMTimerSet(PTMTIMER pTimer, uint64_t u64Expire)
+{
+ return pTimer->pVmmCallbacks->pfnTMTimerSet(pTimer, u64Expire);
+}
+
+
+/**
+ * @copydoc TMTimerSetFrequencyHint
+ */
+VMMDECL(int) TMTimerSetFrequencyHint(PTMTIMER pTimer, uint32_t uHz)
+{
+ return pTimer->pVmmCallbacks->pfnTMTimerSetFrequencyHint(pTimer, uHz);
+}
+
+
+/**
+ * @copydoc TMTimerSetMicro
+ */
+VMMDECL(int) TMTimerSetMicro(PTMTIMER pTimer, uint64_t cMicrosToNext)
+{
+ return pTimer->pVmmCallbacks->pfnTMTimerSetMicro(pTimer, cMicrosToNext);
+}
+
+
+/**
+ * @copydoc TMTimerSetMillies
+ */
+VMMDECL(int) TMTimerSetMillies(PTMTIMER pTimer, uint32_t cMilliesToNext)
+{
+ return pTimer->pVmmCallbacks->pfnTMTimerSetMillies(pTimer, cMilliesToNext);
+}
+
+
+/**
+ * @copydoc TMTimerSetNano
+ */
+VMMDECL(int) TMTimerSetNano(PTMTIMER pTimer, uint64_t cNanosToNext)
+{
+ return pTimer->pVmmCallbacks->pfnTMTimerSetNano(pTimer, cNanosToNext);
+}
+
+
+/**
+ * @copydoc TMTimerStop
+ */
+VMMDECL(int) TMTimerStop(PTMTIMER pTimer)
+{
+ return pTimer->pVmmCallbacks->pfnTMTimerStop(pTimer);
+}
+
+
+/**
+ * @copydoc TMTimerUnlock
+ */
+VMMDECL(void) TMTimerUnlock(PTMTIMER pTimer)
+{
+ return pTimer->pVmmCallbacks->pfnTMTimerUnlock(pTimer);
+}
+