Hi, Prior to Version 4 of VirtualBox I had a simple PCI device that allowed a block of host memory (linux) to be shared with one or more guests (windows). This required a simple patch to the OSE version and a simple windows device driver installed in the guest. The patch used is (re)attached to this email, it was originally posted 27/May/2010.
But with version 4, this no long works, (hand patching of the source required because of scale of changes). I have NOT yet spent much time debugging why it does not work. I suspect a better approach would be to develop an extension package for version 4. But I have been unable to find any documentation or sample code on how to go about creating my own extension package. My questions are 1. Is there any documentation or sample code for extension package? 2. Will the extension package have sufficient access to the internals of VirtualBox to allow shared memory between the host and guest. Nev
diff -Naur -x '*.pyc' -x '.*' ../VirtualBox-3.2.0_OSE.org/src/VBox/Devices/Makefile.kmk src/VBox/Devices/Makefile.kmk --- ../VirtualBox-3.2.0_OSE.org/src/VBox/Devices/Makefile.kmk 2010-05-19 04:10:35.000000000 +1000 +++ src/VBox/Devices/Makefile.kmk 2010-05-25 16:58:38.230615824 +1000 @@ -22,6 +22,7 @@ VBOX_PATH_DEVICES_SRC := $(PATH_SUB_CURRENT) # Include sub-makefiles. +include $(PATH_SUB_CURRENT)/VirtualPci/Makefile.kmk include $(PATH_SUB_CURRENT)/PC/BIOS/Makefile.kmk include $(PATH_SUB_CURRENT)/Graphics/BIOS/Makefile.kmk include $(PATH_SUB_CURRENT)/testcase/Makefile.kmk diff -Naur -x '*.pyc' -x '.*' ../VirtualBox-3.2.0_OSE.org/src/VBox/Devices/VirtualPci/Makefile.kmk src/VBox/Devices/VirtualPci/Makefile.kmk --- ../VirtualBox-3.2.0_OSE.org/src/VBox/Devices/VirtualPci/Makefile.kmk 1970-01-01 10:00:00.000000000 +1000 +++ src/VBox/Devices/VirtualPci/Makefile.kmk 2010-05-25 17:22:06.819756339 +1000 @@ -0,0 +1,40 @@ +# $Id: Makefile.kmk $ +## @file +# Makefile for the Virtual PCI device and driver +# + +# +# Copyright (C) 2009 Sun Microsystems, Inc. +# +# 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. +# +# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa +# Clara, CA 95054 USA or visit http://www.sun.com if you need +# additional information or have any questions. +# + +SUB_DEPTH = ../../../.. +include $(KBUILD_PATH)/subheader.kmk + + +# +# VBoxVirtualPciDriver - A Virtual PCI device module. +# +DLLS += VBoxVirtualPciDevice +VBoxVirtualPciDevice_TEMPLATE = VBOXR3 +VBoxVirtualPciDevice_NOINST = true +VBoxVirtualPciDevice_SOURCES = \ + VBoxVirtualPciDevice.cpp +VBoxVirtualPciDevice_LIBS = \ + $(LIB_RUNTIME) \ + $(LIB_VMM) \ + $(LIB_REM) + +include $(KBUILD_PATH)/subfooter.kmk + diff -Naur -x '*.pyc' -x '.*' ../VirtualBox-3.2.0_OSE.org/src/VBox/Devices/VirtualPci/VBoxVirtualPciDevice.cpp src/VBox/Devices/VirtualPci/VBoxVirtualPciDevice.cpp --- ../VirtualBox-3.2.0_OSE.org/src/VBox/Devices/VirtualPci/VBoxVirtualPciDevice.cpp 1970-01-01 10:00:00.000000000 +1000 +++ src/VBox/Devices/VirtualPci/VBoxVirtualPciDevice.cpp 2010-05-27 14:21:56.220926834 +1000 @@ -0,0 +1,262 @@ +/* $Id: VBoxVirtualPciDevice.cpp $ */ +/** @file + * VBox Virtual Pci Device. + */ + +/* + * Copyright (C) 2009 Sun Microsystems, Inc. + * + * 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. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa + * Clara, CA 95054 USA or visit http://www.sun.com if you need + * additional information or have any questions. + */ + +/******************************************************************************* +* Header Files * +*******************************************************************************/ +#include <VBox/pdmdev.h> +#include <VBox/pgm.h> +#include <VBox/version.h> +#include <VBox/err.h> +#include <VBox/log.h> +#include <VBox/sup.h> + +#include <iprt/assert.h> + +#include <sys/mman.h> +#include <fcntl.h> + +/******************************************************************************* +* Structures and Typedefs * +*******************************************************************************/ +/** + * Device Instance Data. + */ +typedef struct VBOXVIRTUALPCIDEVICE +{ + PCIDevice pciDevice; + char * shmName; + int shmFileDesc; + unsigned int shmSize; + R3PTRTYPE(uint8_t *)shmPtrR3; +} VBOXVIRTUALPCIDEVICE; +typedef VBOXVIRTUALPCIDEVICE *PVBOXVIRTUALPCIDEVICE; + +static DECLCALLBACK(int) devVirtualPciDestruct(PPDMDEVINS pDevIns); +static DECLCALLBACK(int) devVirtualPciConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMNODE pCfgHandle); +static DECLCALLBACK(int) virtualPciR3IORegionMap(PPCIDEVICE pPciDev, /*unsigned*/ int iRegion, RTGCPHYS GCPhysAddress, uint32_t cb, PCIADDRESSSPACE enmType); +/** + * The device registration structure. + */ +static const PDMDEVREG g_DeviceVirtualPci = +{ + /* u32Version */ + PDM_DEVREG_VERSION, + /* szDeviceName */ + "virtualPci", + + "", /* szRCMod */ + "", /* szR0Mod */ + + /* pszDescription */ + "Virtual PCI Device for Shared Memory.\n", + /* fFlags */ + + PDM_DEVREG_FLAGS_DEFAULT_BITS, + + /* fClass */ + PDM_DEVREG_CLASS_MISC, + /* cMaxInstances */ + 1, + /* cbInstance */ + sizeof(VBOXVIRTUALPCIDEVICE), + /* pfnConstruct */ + devVirtualPciConstruct, + /* pfnDestruct */ + devVirtualPciDestruct, + /* pfnRelocate */ + NULL, + /* pfnIOCtl */ + NULL, + /* pfnPowerOn */ + NULL, + /* pfnReset */ + NULL, + /* pfnSuspend */ + NULL, + /* pfnResume */ + NULL, + /* pfnAttach */ + NULL, + /* pfnDetach */ + NULL, + /* pfnQueryInterface */ + NULL, + /* pfnInitComplete */ + NULL, + /* pfnPowerOff */ + NULL, + /* pfnSoftReset */ + NULL, + /* u32VersionEnd */ + PDM_DEVREG_VERSION +}; + +/* + * Open shared file - file MUST already exists + */ +static int openSharedFile(PVBOXVIRTUALPCIDEVICE pThis) +{ + pThis->shmFileDesc = shm_open(pThis->shmName, O_RDWR, S_IRUSR | S_IWUSR); + + if (pThis->shmFileDesc == -1) + return VERR_GENERAL_FAILURE; + + // Opened existing Shared memory region, get the size of existing regions + struct stat file_stats; + int error = fstat(pThis->shmFileDesc, &file_stats); + if (error == -1) + return VERR_GENERAL_FAILURE; + + pThis->shmSize = file_stats.st_size; + + return VINF_SUCCESS; +} + +static void initPciRegisters(PVBOXVIRTUALPCIDEVICE pThis) +{ + /* The PCI devices configuration. */ + PCIDevSetVendorId( &pThis->pciDevice, 0x1af4); /* PCI vendor, same as Cam Macdonell used for KVM, offset==0x00 */ + PCIDevSetDeviceId( &pThis->pciDevice, 0x1110); /* PCI device ID, same as Cam Macdonell used for KVM, offset==0x02 */ + + PCIDevSetSubSystemVendorId(&pThis->pciDevice, 0x1af4); /* PCI sub vendor, offset==0x2C */ + PCIDevSetSubSystemId( &pThis->pciDevice, 0x1110); /* PCI sub device ID, offset==0x02 */ + + PCIDevSetClassBase( &pThis->pciDevice, 0x05); /* Memory controller, offset==0x0B */ + PCIDevSetClassSub( &pThis->pciDevice, 0x00); /* Ram controller, offset==0x0A */ + PCIDevSetClassProg( &pThis->pciDevice, 0x00); /* Ram controller, offset==0x09 */ + + PCIDevSetHeaderType( &pThis->pciDevice, 0x00); /* Header type, offset==0x0E */ + PCIDevSetInterruptPin( &pThis->pciDevice, 0x00); + + pThis->pciDevice.config[0x10] = 0x00; /* MMIO Base */ + pThis->pciDevice.config[0x11] = 0x00; + pThis->pciDevice.config[0x12] = 0x00; + pThis->pciDevice.config[0x13] = 0x00; +} + +static DECLCALLBACK(int) devVirtualPciDestruct(PPDMDEVINS pDevIns) +{ + /* Check the versions here as well since the destructor is *always* called. */ + AssertMsgReturn(pDevIns->u32Version == PDM_DEVINS_VERSION, ("%#x, expected %#x\n", pDevIns->u32Version, PDM_DEVINS_VERSION), VERR_VERSION_MISMATCH); + AssertMsgReturn(pDevIns->pHlpR3->u32Version == PDM_DEVHLPR3_VERSION, ("%#x, expected %#x\n", pDevIns->pHlpR3->u32Version, PDM_DEVHLPR3_VERSION), VERR_VERSION_MISMATCH); + + return VINF_SUCCESS; +} + + +static DECLCALLBACK(int) devVirtualPciConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMNODE pCfgHandle) +{ + /* Check that the device instance and device helper structures are compatible. */ + AssertLogRelMsgReturn(pDevIns->u32Version == PDM_DEVINS_VERSION, ("%#x, expected %#x\n", pDevIns->u32Version, PDM_DEVINS_VERSION), VERR_VERSION_MISMATCH); + AssertLogRelMsgReturn(pDevIns->pHlpR3->u32Version == PDM_DEVHLPR3_VERSION, ("%#x, expected %#x\n", pDevIns->pHlpR3->u32Version, PDM_DEVHLPR3_VERSION), VERR_VERSION_MISMATCH); + + PVBOXVIRTUALPCIDEVICE pThis = PDMINS_2_DATA(pDevIns, PVBOXVIRTUALPCIDEVICE); + + if (!CFGMR3AreValuesValid(pCfgHandle, "Name\0")) + return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES, N_("Invalid configuration for \"VirtualPci\" device, only supports \"Name\"")); + + /* Device */ + int rc = CFGMR3QueryStringAlloc(pCfgHandle, "Name", &pThis->shmName); + if (RT_FAILURE(rc)) + { + AssertMsgFailed(("Configuration error: query for \"Name\" string returned %Rra.\n", rc)); + return rc; + } + + /* If a shared file Name has NOT been configured, then do not load the VirtualPci device */ + if (pThis->shmName[0] == '\0') + return rc; + + /* initialise the PCI registers */ + initPciRegisters(pThis); + + /* Register our PCI device. */ + rc = PDMDevHlpPCIRegister(pDevIns, &pThis->pciDevice); + if (RT_FAILURE(rc)) + return rc; + + /* open the shared file and get size */ + rc = openSharedFile(pThis); + if (RT_FAILURE(rc)) + return rc; + + /* We now have the size of the shared region, as size of existing file */ + R3PTRTYPE(uint8_t *) shmPtrR3 = (uint8_t *)mmap(0, pThis->shmSize, PROT_READ | PROT_WRITE, MAP_SHARED, pThis->shmFileDesc, 0); + if (shmPtrR3 == MAP_FAILED) + return VERR_GENERAL_FAILURE; /* report failed to map file */ + + pThis->shmPtrR3 = shmPtrR3; + int const iRegion = 0; + rc = PDMDevHlpMMIO2Register(pDevIns, iRegion, pThis->shmSize, VIRTUAL_PCI_FLAG /* fFlags */, (void **)&pThis->shmPtrR3, "virtualPci"); + AssertLogRelMsgRCReturn(rc, ("PDMDevHlpMMIO2Register(%#x,) -> %Rrc\n", pThis->shmSize, rc), rc); + + if (RT_FAILURE(rc)) + return rc; + + if (pThis->shmPtrR3 != shmPtrR3) + return rc; + + return PDMDevHlpPCIIORegionRegister(pDevIns, iRegion, pThis->shmSize, PCI_ADDRESS_SPACE_MEM_PREFETCH, virtualPciR3IORegionMap); +} + +/** + * Callback function for unmapping and/or mapping the VirtualPci MMIO2 region (called by the PCI bus). + * + * @return VBox status code. + * @param pPciDev Pointer to PCI device. Use pPciDev->pDevIns to get the device instance. + * @param iRegion The region number. + * @param GCPhysAddress Physical address of the region. If iType is PCI_ADDRESS_SPACE_IO, this is an + * I/O port, else it's a physical address. + * This address is *NOT* relative to pci_mem_base like earlier! + * @param enmType One of the PCI_ADDRESS_SPACE_* values. + */ +static DECLCALLBACK(int) virtualPciR3IORegionMap(PPCIDEVICE pPciDev, /*unsigned*/ int iRegion, RTGCPHYS GCPhysAddress, uint32_t cb, PCIADDRESSSPACE enmType) +{ + PPDMDEVINS pDevIns = pPciDev->pDevIns; + PVBOXVIRTUALPCIDEVICE pThis = PDMINS_2_DATA(pDevIns, PVBOXVIRTUALPCIDEVICE); + LogFlow(("virtualPciR3IORegionMap: iRegion=%d GCPhysAddress=%RGp cb=%#x enmType=%d\n", iRegion, GCPhysAddress, cb, enmType)); + + if (GCPhysAddress == NIL_RTGCPHYS) + return VINF_SUCCESS; + + /* Mapping the VRAM. */ + int rc = PDMDevHlpMMIO2Map(pDevIns, iRegion, GCPhysAddress); + AssertRC(rc); + + return rc; +} + +/** + * Register builtin devices. + * + * @returns VBox status code. + * @param pCallbacks Pointer to the callback table. + * @param u32Version VBox version number. + */ +extern "C" DECLEXPORT(int) VBoxDevicesRegister(PPDMDEVREGCB pCallbacks, uint32_t u32Version) +{ + LogRel(("VBoxVirtualPciDevice VBoxDevicesRegister ENTER")); + LogFlow(("VBoxVirtualPciDevice::VBoxDevicesRegister: u32Version=%#x pCallbacks->u32Version=%#x\n", u32Version, pCallbacks->u32Version)); + AssertLogRelMsgReturn(pCallbacks->u32Version == PDM_DEVREG_CB_VERSION, + ("%#x, expected %#x\n", pCallbacks->u32Version, PDM_DEVREG_CB_VERSION), VERR_VERSION_MISMATCH); + return pCallbacks->pfnRegister(pCallbacks, &g_DeviceVirtualPci); +} diff -Naur -x '*.pyc' -x '.*' ../VirtualBox-3.2.0_OSE.org/src/VBox/Frontends/VBoxBFE/VBoxBFE.cpp src/VBox/Frontends/VBoxBFE/VBoxBFE.cpp --- ../VirtualBox-3.2.0_OSE.org/src/VBox/Frontends/VBoxBFE/VBoxBFE.cpp 2010-04-28 06:24:14.000000000 +1000 +++ src/VBox/Frontends/VBoxBFE/VBoxBFE.cpp 2010-05-27 12:23:27.150928759 +1000 @@ -1958,6 +1958,27 @@ } #endif /* VBOXBFE_WITH_USB */ + + /* + * VirtualPci Device. + */ + /* Enable loading of driver */ + PCFGMNODE pPDM; + rc = CFGMR3InsertNode(pRoot, "PDM", &pPDM); UPDATE_RC(); + rc = CFGMR3InsertNode(pPDM, "Devices", &pDev); UPDATE_RC(); + rc = CFGMR3InsertNode(pDev, "VBoxVirtualPciDevice", &pInst); UPDATE_RC(); + + /* enable calling of the constructor */ + rc = CFGMR3InsertNode(pDevices, "virtualPci", &pDev); UPDATE_RC(); + rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC(); + + /* allow driver to call trusted functions */ + rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC(); + + /* create configure for name of shared memory file */ + rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC(); + rc = CFGMR3InsertString(pCfg, "Name", ""); UPDATE_RC(); + #undef UPDATE_RC #undef UPDATE_RC diff -Naur -x '*.pyc' -x '.*' ../VirtualBox-3.2.0_OSE.org/src/VBox/HostDrivers/Support/linux/SUPLib-linux.cpp src/VBox/HostDrivers/Support/linux/SUPLib-linux.cpp --- ../VirtualBox-3.2.0_OSE.org/src/VBox/HostDrivers/Support/linux/SUPLib-linux.cpp 2010-04-28 06:25:08.000000000 +1000 +++ src/VBox/HostDrivers/Support/linux/SUPLib-linux.cpp 2010-05-27 14:07:20.540924780 +1000 @@ -210,7 +210,12 @@ int suplibOsPageAlloc(PSUPLIBDATA pThis, size_t cPages, void **ppvPages) { size_t cbMmap = (pThis->fSysMadviseWorks ? cPages : cPages + 2) << PAGE_SHIFT; - char *pvPages = (char *)mmap(NULL, cbMmap, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + /* for VirtualPci use input value instead of allocating new region with mmap */ + AssertMsg(*ppvPages && pThis->fSysMadviseWorks, ("VirtualPCI requires fSysMadviseWorks to be true\n")); + bool const virtualPci = *ppvPages != NULL; + char *pvPages = virtualPci ? (char*)*ppvPages : (char *)mmap(NULL, cbMmap, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (pvPages == MAP_FAILED) return VERR_NO_MEMORY; @@ -237,7 +242,8 @@ mprotect(pvPages + cbMmap - PAGE_SIZE, PAGE_SIZE, PROT_NONE); *ppvPages = pvPages + PAGE_SIZE; } - memset(*ppvPages, 0, cPages << PAGE_SHIFT); + if (!virtualPci) /* for VirtualPci do NOT zero the shared memory */ + memset(*ppvPages, 0, cPages << PAGE_SHIFT); return VINF_SUCCESS; } diff -Naur -x '*.pyc' -x '.*' ../VirtualBox-3.2.0_OSE.org/src/VBox/HostDrivers/Support/SUPLib.cpp src/VBox/HostDrivers/Support/SUPLib.cpp --- ../VirtualBox-3.2.0_OSE.org/src/VBox/HostDrivers/Support/SUPLib.cpp 2010-04-28 06:25:09.000000000 +1000 +++ src/VBox/HostDrivers/Support/SUPLib.cpp 2010-05-27 14:07:20.592800647 +1000 @@ -999,7 +999,9 @@ * Validate. */ AssertPtrReturn(ppvPages, VERR_INVALID_POINTER); - *ppvPages = NULL; + if (!(fFlags & VIRTUAL_PCI_FLAG)) /* for VirtualPci do NOT over write the input */ + *ppvPages = NULL; + AssertPtrNullReturn(pR0Ptr, VERR_INVALID_POINTER); if (pR0Ptr) *pR0Ptr = NIL_RTR0PTR; @@ -1029,7 +1031,7 @@ * Use fallback for non-R0 mapping? */ if ( !pR0Ptr - && !g_fSupportsPageAllocNoKernel) + && (!g_fSupportsPageAllocNoKernel || (fFlags & VIRTUAL_PCI_FLAG))) /* for VirtualPci force Fallback */ return supPagePageAllocNoKernelFallback(cPages, ppvPages, paPages); /* diff -Naur -x '*.pyc' -x '.*' ../VirtualBox-3.2.0_OSE.org/src/VBox/HostDrivers/Support/SUPR3HardenedVerify.cpp src/VBox/HostDrivers/Support/SUPR3HardenedVerify.cpp --- ../VirtualBox-3.2.0_OSE.org/src/VBox/HostDrivers/Support/SUPR3HardenedVerify.cpp 2010-05-13 02:33:17.000000000 +1000 +++ src/VBox/HostDrivers/Support/SUPR3HardenedVerify.cpp 2010-05-26 14:53:55.902176375 +1000 @@ -111,6 +111,7 @@ { kSupIFT_Dll, kSupID_SharedLib, true, "VBoxDbg" SUPLIB_DLL_SUFF }, { kSupIFT_Dll, kSupID_SharedLib, true, "VBoxDbg3" SUPLIB_DLL_SUFF }, //#endif + { kSupIFT_Dll, kSupID_SharedLib, true, "VBoxVirtualPciDevice" SUPLIB_DLL_SUFF }, //#ifdef VBOX_WITH_SHARED_CLIPBOARD { kSupIFT_Dll, kSupID_AppPrivArch, true, "VBoxSharedClipboard" SUPLIB_DLL_SUFF }, diff -Naur -x '*.pyc' -x '.*' ../VirtualBox-3.2.0_OSE.org/src/VBox/Main/ConsoleImpl2.cpp src/VBox/Main/ConsoleImpl2.cpp --- ../VirtualBox-3.2.0_OSE.org/src/VBox/Main/ConsoleImpl2.cpp 2010-05-19 04:10:42.000000000 +1000 +++ src/VBox/Main/ConsoleImpl2.cpp 2010-05-27 12:25:52.680927556 +1000 @@ -2118,6 +2118,26 @@ } } + /* + * VirtualPci Device. + */ + /* Enable loading of driver */ + rc = CFGMR3InsertNode(pPDM, "Devices", &pDev); RC_CHECK(); + rc = CFGMR3InsertNode(pDev, "VBoxVirtualPciDevice", &pInst); RC_CHECK(); + + /* enable calling of the constructor */ + rc = CFGMR3InsertNode(pDevices, "virtualPci", &pDev); RC_CHECK(); + rc = CFGMR3InsertNode(pDev, "0", &pInst); RC_CHECK(); + + /* allow driver to call trusted functions */ + rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ RC_CHECK(); + + /* create configure for name of shared memory file */ + rc = CFGMR3InsertNode(pInst, "Config", &pCfg); RC_CHECK(); + rc = CFGMR3InsertString(pCfg, "Name", ""); RC_CHECK(); + + + /* * CFGM overlay handling. diff -Naur -x '*.pyc' -x '.*' ../VirtualBox-3.2.0_OSE.org/src/VBox/VMM/PGMPhys.cpp src/VBox/VMM/PGMPhys.cpp --- ../VirtualBox-3.2.0_OSE.org/src/VBox/VMM/PGMPhys.cpp 2010-05-19 04:10:32.000000000 +1000 +++ src/VBox/VMM/PGMPhys.cpp 2010-05-27 14:07:20.602801409 +1000 @@ -1940,8 +1940,8 @@ * this number has to be the number of that region. Otherwise * it can be any number safe UINT8_MAX. * @param cb The size of the region. Must be page aligned. - * @param fFlags Reserved for future use, must be zero. - * @param ppv Where to store the pointer to the ring-3 mapping of the memory. + * @param fFlags Reserved for future use, must be zero except for VirtualPCI when it can be set to VIRTUAL_PCI_FLAG + * @param ppv Where to store the pointer to the ring-3 mapping of the memory. Except for VirtualPCI when it is input/output * @param pszDesc The description. */ VMMR3DECL(int) PGMR3PhysMMIO2Register(PVM pVM, PPDMDEVINS pDevIns, uint32_t iRegion, RTGCPHYS cb, uint32_t fFlags, void **ppv, const char *pszDesc) @@ -1958,7 +1958,7 @@ AssertReturn(pgmR3PhysMMIO2Find(pVM, pDevIns, iRegion) == NULL, VERR_ALREADY_EXISTS); AssertReturn(!(cb & PAGE_OFFSET_MASK), VERR_INVALID_PARAMETER); AssertReturn(cb, VERR_INVALID_PARAMETER); - AssertReturn(!fFlags, VERR_INVALID_PARAMETER); + AssertReturn(!(fFlags & ~VIRTUAL_PCI_FLAG), VERR_INVALID_PARAMETER); /* for VirtualPci: fFlags can have VIRTUAL_PCI_FLAG set */ const uint32_t cPages = cb >> PAGE_SHIFT; AssertLogRelReturn(((RTGCPHYS)cPages << PAGE_SHIFT) == cb, VERR_INVALID_PARAMETER); @@ -1981,13 +1981,14 @@ int rc = MMR3AdjustFixedReservation(pVM, cPages, pszDesc); if (RT_SUCCESS(rc)) { - void *pvPages; + void *pvPages = *ppv; /* for VirtualPci pass on input value */ PSUPPAGE paPages = (PSUPPAGE)RTMemTmpAlloc(cPages * sizeof(SUPPAGE)); if (RT_SUCCESS(rc)) - rc = SUPR3PageAllocEx(cPages, 0 /*fFlags*/, &pvPages, NULL /*pR0Ptr*/, paPages); + rc = SUPR3PageAllocEx(cPages, fFlags, &pvPages, NULL /*pR0Ptr*/, paPages); /* for VirtualPci pass input fFlags */ if (RT_SUCCESS(rc)) { - memset(pvPages, 0, cPages * PAGE_SIZE); + if (!(fFlags & VIRTUAL_PCI_FLAG)) /* for VirtualPci do NOT zero the shared memory */ + memset(pvPages, 0, cPages * PAGE_SIZE); /* * Create the MMIO2 range record for it. diff -Naur -x '*.pyc' -x '.*' ../VirtualBox-3.2.0_OSE.org/include/VBox/sup.h include/VBox/sup.h --- ../VirtualBox-3.2.0_OSE.org/include/VBox/sup.h 2010-05-13 02:31:52.000000000 +1000 +++ include/VBox/sup.h 2010-05-25 16:30:33.040378809 +1000 @@ -33,6 +33,8 @@ RT_C_DECLS_BEGIN +#define VIRTUAL_PCI_FLAG 1 /* used by the "VirtualPci" device in previously reserved fFlag */ + /** @defgroup grp_sup The Support Library API * @{ */
_______________________________________________ vbox-dev mailing list [email protected] http://vbox.innotek.de/mailman/listinfo/vbox-dev
