VirtualBox

Changeset 69183 in vbox


Ignore:
Timestamp:
Oct 23, 2017 6:47:18 PM (7 years ago)
Author:
vboxsync
Message:

Devices/testcase: Updates for the PDM unit test framework

Location:
trunk/src/VBox/Devices
Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Makefile.kmk

    r69162 r69183  
    13521352  PROGRAMS += tstDevice
    13531353  tstDevice_TEMPLATE    = VBOXR3TSTEXE
     1354  tstDevice_DEFS        += IN_SUP_R3
    13541355  tstDevice_LIBS.linux  = $(PATH_STAGE_BIN)/tstDeviceVBoxVMMStubs.so
    13551356  tstDevice_LIBS.darwin = $(PATH_STAGE_BIN)/tstDeviceVBoxVMMStubs.dylib
     
    13591360        testcase/tstDevice.cpp \
    13601361        testcase/tstDevicePdmDevHlp.cpp \
    1361         testcase/tstDeviceVMM.cpp
     1362        testcase/tstDeviceVMM.cpp \
     1363        testcase/tstDeviceSUP.cpp
    13621364 endif
    13631365
  • trunk/src/VBox/Devices/testcase/tstDevice.cpp

    r69162 r69183  
    2222#define LOG_GROUP LOG_GROUP_DEFAULT /** @todo */
    2323#include <VBox/types.h>
     24#include <VBox/sup.h>
    2425#include <VBox/version.h>
    2526#include <iprt/assert.h>
     
    774775 * @returns VBox status code.
    775776 * @param   pThis                   The device under test instance.
    776  * @param   pszR0Mod                The R0 module.
     777 * @param   pszMod                  The module name.
     778 * @param   enmModType              The module type if the module needs to be loaded.
    777779 * @param   pszSymbol               The symbol to resolve.
    778780 * @param   ppfn                    Where to store the value on success.
    779781 */
    780 DECLHIDDEN(int) tstDevPdmLdrGetSymbol(PDEVDUTINT pThis, const char *pszMod, TSTDEVPDMMODTYPE enmModType,
     782DECLHIDDEN(int) tstDevPdmLdrGetSymbol(PTSTDEVDUTINT pThis, const char *pszMod, TSTDEVPDMMODTYPE enmModType,
    781783                                      const char *pszSymbol, PFNRT *ppfn)
    782784{
     
    809811
    810812
     813static TSTDEVCFGITEM s_aTestcaseCfg[] =
     814{
     815    {"CtrlMemBufSize", TSTDEVCFGITEMTYPE_INTEGER, "0"  },
     816    {NULL,             TSTDEVCFGITEMTYPE_INVALID, NULL }
     817};
     818
    811819static TSTDEVTESTCASEREG s_TestcaseDef =
    812820{
    813821    "test",
    814822    "Testcase during implementation",
    815     "serial",
     823    "nvme",
    816824    0,
    817     NULL,
     825    &s_aTestcaseCfg[0],
    818826    NULL,
    819827};
     
    832840    {
    833841        TSTDEVDUTINT Dut;
    834         Dut.pTestcaseReg = &s_TestcaseDef;
    835         Dut.enmCtx       = TSTDEVDUTCTX_R3;
     842        Dut.pTestcaseReg    = &s_TestcaseDef;
     843        Dut.enmCtx          = TSTDEVDUTCTX_R3;
     844        Dut.pVm             = NULL;
     845        Dut.SupSession.pDut = &Dut;
    836846        RTListInit(&Dut.LstIoPorts);
    837847        RTListInit(&Dut.LstTimers);
     848        RTListInit(&Dut.LstMmHeap);
     849        RTListInit(&Dut.LstPdmThreads);
     850        RTListInit(&Dut.SupSession.LstSupSem);
    838851        CFGMNODE Cfg;
    839852        Cfg.pVmmCallbacks = &g_tstDevVmmCallbacks;
    840853        Cfg.pDut = &Dut;
     854
     855        rc = RTCritSectRwInit(&Dut.CritSectLists);
     856        AssertRC(rc);
    841857
    842858        PPDMDEVINS pDevIns = (PPDMDEVINS)RTMemAllocZ(RT_OFFSETOF(PDMDEVINS, achInstanceData[pPdmDev->pReg->cbInstance]));
     
    884900            rc = tstDevPdmLoadMod(argv[1], TSTDEVPDMMODTYPE_R3);
    885901            if (RT_SUCCESS(rc))
    886                 rc = tstDevPdmDevCreate("serial");
     902                rc = tstDevPdmDevCreate("nvme");
    887903            else
    888904                rcExit = RTEXITCODE_FAILURE;
  • trunk/src/VBox/Devices/testcase/tstDeviceInternal.h

    r69162 r69183  
    3030#include <iprt/assert.h>
    3131#include <iprt/list.h>
     32#include <iprt/semaphore.h>
    3233
    3334#include "tstDevicePlugin.h"
     
    3536
    3637RT_C_DECLS_BEGIN
     38
     39
     40/** Converts PDM device instance to the device under test structure. */
     41#define TSTDEV_PDMDEVINS_2_DUT(a_pDevIns) ((a_pDevIns)->Internal.s.pDut)
    3742
    3843/**
     
    7782    /** Opaque user data - R0. */
    7883    void                            *pvUserR0;
    79     /** Out handler - R3. */
     84    /** Out handler - R0. */
    8085    PFNIOMIOPORTOUT                 pfnOutR0;
    81     /** In handler - R3. */
     86    /** In handler - R0. */
    8287    PFNIOMIOPORTIN                  pfnInR0;
    83     /** Out string handler - R3. */
     88    /** Out string handler - R0. */
    8489    PFNIOMIOPORTOUTSTRING           pfnOutStrR0;
    85     /** In string handler - R3. */
     90    /** In string handler - R0. */
    8691    PFNIOMIOPORTINSTRING            pfnInStrR0;
    8792
    88     /** @todo: RC */
     93#ifdef TSTDEV_SUPPORTS_RC
     94    /** Opaque user data - RC. */
     95    void                            *pvUserRC;
     96    /** Out handler - RC. */
     97    PFNIOMIOPORTOUT                 pfnOutRC;
     98    /** In handler - RC. */
     99    PFNIOMIOPORTIN                  pfnInRC;
     100    /** Out string handler - RC. */
     101    PFNIOMIOPORTOUTSTRING           pfnOutStrRC;
     102    /** In string handler - RC. */
     103    PFNIOMIOPORTINSTRING            pfnInStrRC;
     104#endif
    89105} RTDEVDUTIOPORT;
    90106/** Pointer to a registered I/O port handler. */
     
    92108/** Pointer to a const I/O port handler. */
    93109typedef const RTDEVDUTIOPORT *PCRTDEVDUTIOPORT;
     110
     111/**
     112 * The Support Driver session state.
     113 */
     114typedef struct TSTDEVSUPDRVSESSION
     115{
     116    /** Pointer to the owning device under test instance. */
     117    PTSTDEVDUTINT                   pDut;
     118    /** List of event semaphores. */
     119    RTLISTANCHOR                    LstSupSem;
     120} TSTDEVSUPDRVSESSION;
     121/** Pointer to the Support Driver session state. */
     122typedef TSTDEVSUPDRVSESSION *PTSTDEVSUPDRVSESSION;
     123
     124/** Converts a Support Driver session handle to the internal state. */
     125#define TSTDEV_PSUPDRVSESSION_2_PTSTDEVSUPDRVSESSION(a_pSession) ((PTSTDEVSUPDRVSESSION)(a_pSession))
     126/** Converts the internal session state to a Support Driver session handle. */
     127#define TSTDEV_PTSTDEVSUPDRVSESSION_2_PSUPDRVSESSION(a_pSession) ((PSUPDRVSESSION)(a_pSession))
     128
     129/**
     130 * Support driver event semaphore.
     131 */
     132typedef struct TSTDEVSUPSEMEVENT
     133{
     134    /** Node for the event semaphore list. */
     135    RTLISTNODE                      NdSupSem;
     136    /** Flag whether this is multi event semaphore. */
     137    bool                            fMulti;
     138    /** Event smeaphore handles depending on the flag above. */
     139    union
     140    {
     141        RTSEMEVENT                  hSemEvt;
     142        RTSEMEVENTMULTI             hSemEvtMulti;
     143    } u;
     144} TSTDEVSUPSEMEVENT;
     145/** Pointer to a support event semaphore state. */
     146typedef TSTDEVSUPSEMEVENT *PTSTDEVSUPSEMEVENT;
     147
     148/** Converts a Support event semaphore handle to the internal state. */
     149#define TSTDEV_SUPSEMEVENT_2_PTSTDEVSUPSEMEVENT(a_pSupSemEvt) ((PTSTDEVSUPSEMEVENT)(a_pSupSemEvt))
     150/** Converts the internal session state to a Support event semaphore handle. */
     151#define TSTDEV_PTSTDEVSUPSEMEVENT_2_SUPSEMEVENT(a_pSupSemEvt) ((SUPSEMEVENT)(a_pSupSemEvt))
    94152
    95153/**
     
    111169
    112170/**
     171 * PCI region descriptor.
     172 */
     173typedef struct TSTDEVDUTPCIREGION
     174{
     175    /** Size of the region. */
     176    RTGCPHYS                        cbRegion;
     177    /** Address space type. */
     178    PCIADDRESSSPACE                 enmType;
     179    /** Region mapping callback. */
     180    PFNPCIIOREGIONMAP               pfnRegionMap;
     181} TSTDEVDUTPCIREGION;
     182/** Pointer to a PCI region descriptor. */
     183typedef TSTDEVDUTPCIREGION *PTSTDEVDUTPCIREGION;
     184/** Pointer to a const PCI region descriptor. */
     185typedef const TSTDEVDUTPCIREGION *PCTSTDEVDUTPCIREGION;
     186
     187/**
    113188 * Device under test instance data.
    114189 */
     
    121196    /** Current device context. */
    122197    TSTDEVDUTCTX                    enmCtx;
     198    /** Critical section protecting the lists below. */
     199    RTCRITSECTRW                    CritSectLists;
    123200    /** List of registered I/O port handlers. */
    124201    RTLISTANCHOR                    LstIoPorts;
    125202    /** List of timers registered. */
    126203    RTLISTANCHOR                    LstTimers;
     204    /** List of registered MMIO regions. */
     205    RTLISTANCHOR                    LstMmio;
     206    /** List of MM Heap allocations. */
     207    RTLISTANCHOR                    LstMmHeap;
     208    /** List of PDM threads. */
     209    RTLISTANCHOR                    LstPdmThreads;
     210    /** The SUP session we emulate. */
     211    TSTDEVSUPDRVSESSION             SupSession;
     212    /** The VM state assoicated with this device. */
     213    PVM                             pVm;
     214    /** The registered PCI device instance if this is a PCI device. */
     215    PPDMPCIDEV                      pPciDev;
     216    /** PCI Region descriptors. */
     217    TSTDEVDUTPCIREGION              aPciRegions[VBOX_PCI_NUM_REGIONS];
    127218} TSTDEVDUTINT;
    128 /** Pointer to the internal device under test instance data. */
    129 typedef TSTDEVDUTINT *PDEVDUTINT;
    130 
    131 DECLHIDDEN(int) tstDevPdmLdrGetSymbol(PDEVDUTINT pThis, const char *pszR0Mod, TSTDEVPDMMODTYPE enmModType,
     219
     220
     221DECLHIDDEN(int) tstDevPdmLdrGetSymbol(PTSTDEVDUTINT pThis, const char *pszMod, TSTDEVPDMMODTYPE enmModType,
    132222                                      const char *pszSymbol, PFNRT *ppfn);
    133223
     224
     225DECLINLINE(int) tstDevDutLockShared(PTSTDEVDUTINT pThis)
     226{
     227    return RTCritSectRwEnterShared(&pThis->CritSectLists);
     228}
     229
     230DECLINLINE(int) tstDevDutUnlockShared(PTSTDEVDUTINT pThis)
     231{
     232    return RTCritSectRwLeaveShared(&pThis->CritSectLists);
     233}
     234
     235DECLINLINE(int) tstDevDutLockExcl(PTSTDEVDUTINT pThis)
     236{
     237    return RTCritSectRwEnterExcl(&pThis->CritSectLists);
     238}
     239
     240DECLINLINE(int) tstDevDutUnlockExcl(PTSTDEVDUTINT pThis)
     241{
     242    return RTCritSectRwLeaveExcl(&pThis->CritSectLists);
     243}
     244
    134245RT_C_DECLS_END
    135246
  • trunk/src/VBox/Devices/testcase/tstDevicePdmDevHlp.cpp

    r69162 r69183  
    2525#include <VBox/vmm/pdmpci.h>
    2626
     27#include <iprt/assert.h>
    2728#include <iprt/mem.h>
    2829
     
    125126             pDevIns->pReg->szName, pDevIns->iInstance, Port, cPorts, pvUser, pszOut, pszOut, pszIn, pszIn, pszOutStr, pszOutStr, pszInStr, pszInStr, pszDesc, pszDesc));
    126127
    127     PDEVDUTINT pThis = pDevIns->Internal.s.pDut;
     128    PTSTDEVDUTINT pThis = pDevIns->Internal.s.pDut;
    128129    PRTDEVDUTIOPORT pIoPort;
    129130    int rc = VERR_NOT_FOUND;
     
    551552             pDevIns->pReg->szName, pDevIns->iInstance));
    552553
    553     PSUPDRVSESSION pSession = 0;
    554     AssertFailed();
     554    PTSTDEVDUTINT pThis = TSTDEV_PDMDEVINS_2_DUT(pDevIns);
     555    PSUPDRVSESSION pSession = TSTDEV_PTSTDEVSUPDRVSESSION_2_PSUPDRVSESSION(&pThis->SupSession);
    555556
    556557    LogFlow(("pdmR3DevHlp_GetSupDrvSession: caller='%s'/%d: returns %#p\n", pDevIns->pReg->szName, pDevIns->iInstance, pSession));
     
    703704    LogFlow(("pdmR3DevHlp_MMHeapAlloc: caller='%s'/%d: cb=%#x\n", pDevIns->pReg->szName, pDevIns->iInstance, cb));
    704705
     706    PTSTDEVDUTINT pThis = TSTDEV_PDMDEVINS_2_DUT(pDevIns);
     707
    705708    void *pv = NULL;
    706     AssertFailed();
     709    PTSTDEVMMHEAPALLOC pHeapAlloc = (PTSTDEVMMHEAPALLOC)RTMemAllocZ(cb + sizeof(TSTDEVMMHEAPALLOC) - 1);
     710    if (pHeapAlloc)
     711    {
     712        /* Poison */
     713        memset(&pHeapAlloc->abAlloc[0], 0xfe, cb);
     714        pHeapAlloc->cbAlloc       = cb;
     715        pHeapAlloc->pVmmCallbacks = pDevIns->Internal.s.pVmmCallbacks;
     716        pHeapAlloc->pDut          = pThis;
     717
     718        tstDevDutLockExcl(pThis);
     719        RTListAppend(&pThis->LstMmHeap, &pHeapAlloc->NdMmHeap);
     720        tstDevDutUnlockExcl(pThis);
     721
     722        pv = &pHeapAlloc->abAlloc[0];
     723    }
    707724
    708725    LogFlow(("pdmR3DevHlp_MMHeapAlloc: caller='%s'/%d: returns %p\n", pDevIns->pReg->szName, pDevIns->iInstance, pv));
     
    717734    LogFlow(("pdmR3DevHlp_MMHeapAllocZ: caller='%s'/%d: cb=%#x\n", pDevIns->pReg->szName, pDevIns->iInstance, cb));
    718735
    719     void *pv = NULL;
    720     AssertFailed();
     736    void *pv = pdmR3DevHlp_MMHeapAlloc(pDevIns, cb);
     737    if (VALID_PTR(pv))
     738        memset(pv, 0, cb);
    721739
    722740    LogFlow(("pdmR3DevHlp_MMHeapAllocZ: caller='%s'/%d: returns %p\n", pDevIns->pReg->szName, pDevIns->iInstance, pv));
     
    728746static DECLCALLBACK(void) pdmR3DevHlp_MMHeapFree(PPDMDEVINS pDevIns, void *pv)
    729747{
    730     PDMDEV_ASSERT_DEVINS(pDevIns); RT_NOREF_PV(pDevIns);
     748    PDMDEV_ASSERT_DEVINS(pDevIns);
    731749    LogFlow(("pdmR3DevHlp_MMHeapFree: caller='%s'/%d: pv=%p\n", pDevIns->pReg->szName, pDevIns->iInstance, pv));
    732750
    733     AssertFailed();
     751    MMR3HeapFree(pv);
    734752
    735753    LogFlow(("pdmR3DevHlp_MMHeapAlloc: caller='%s'/%d: returns void\n", pDevIns->pReg->szName, pDevIns->iInstance));
     
    935953                          ("'%s'/%d: Invalid flags: %#x\n", pDevIns->pReg->szName, pDevIns->iInstance, fFlags),
    936954                          VERR_INVALID_FLAGS);
    937     int rc = VERR_NOT_IMPLEMENTED;
    938     AssertFailed();
     955    int rc = VINF_SUCCESS;
     956    pDevIns->Internal.s.pDut->pPciDev = pPciDev;
    939957
    940958    LogFlow(("pdmR3DevHlp_PCIRegister: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, rc));
     
    950968             pDevIns->pReg->szName, pDevIns->iInstance, pPciDev, pPciDev->uDevFn, pMsiReg, pMsiReg->cMsiVectors, pMsiReg->cMsixVectors));
    951969
    952     int rc = VERR_NOT_IMPLEMENTED;
    953     AssertFailed();
     970    int rc = VERR_NOT_SUPPORTED; /** @todo */
    954971
    955972    LogFlow(("pdmR3DevHlp_PCIRegisterMsi: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, rc));
     
    966983             pDevIns->pReg->szName, pDevIns->iInstance, pPciDev, pPciDev->uDevFn, iRegion, cbRegion, enmType, pfnCallback));
    967984
    968     int rc = VERR_NOT_IMPLEMENTED;
    969     AssertFailed();
     985    AssertLogRelMsgReturn(iRegion < VBOX_PCI_NUM_REGIONS,
     986                          ("Region %u exceeds maximum region index %u\n", iRegion, VBOX_PCI_NUM_REGIONS),
     987                          VERR_INVALID_PARAMETER);
     988
     989    int rc = VINF_SUCCESS;
     990    PTSTDEVDUTINT pThis = TSTDEV_PDMDEVINS_2_DUT(pDevIns);
     991    PTSTDEVDUTPCIREGION pRegion = &pThis->aPciRegions[iRegion];
     992    pRegion->cbRegion     = cbRegion;
     993    pRegion->enmType      = enmType;
     994    pRegion->pfnRegionMap = pfnCallback;
    970995
    971996    LogFlow(("pdmR3DevHlp_PCIIORegionRegister: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, rc));
     
    14891514{
    14901515    PDMDEV_ASSERT_DEVINS(pDevIns);
    1491     AssertFailed();
     1516    PTSTDEVDUTINT pThis = TSTDEV_PDMDEVINS_2_DUT(pDevIns);
     1517    PVM pVM = pThis->pVm;
    14921518    LogFlow(("pdmR3DevHlp_GetVM: caller='%s'/%d: returns %p\n", pDevIns->pReg->szName, pDevIns->iInstance, NULL));
    1493     return NULL;
     1519    return pVM;
    14941520}
    14951521
  • trunk/src/VBox/Devices/testcase/tstDeviceVMM.cpp

    r69162 r69183  
    2424#include <VBox/version.h>
    2525#include <VBox/vmm/pdmpci.h>
     26
     27#include <iprt/mem.h>
    2628
    2729#include "tstDeviceInternal.h"
     
    274276static DECLCALLBACK(int) tstDevVmm_CFGMR3QueryString(PCFGMNODE pNode, const char *pszName, char *pszString, size_t cchString)
    275277{
    276     RT_NOREF(pNode, pszName, pszString, cchString);
    277     AssertFailed();
    278     return VERR_NOT_IMPLEMENTED;
     278    if (!pNode)
     279        return VERR_CFGM_NO_PARENT;
     280
     281    PCTSTDEVCFGITEM pCfgItem;
     282    int rc = tstDev_CfgmR3ResolveItem(pNode->pDut->pTestcaseReg->paDevCfg, pszName, &pCfgItem);
     283    if (RT_SUCCESS(rc))
     284    {
     285        switch (pCfgItem->enmType)
     286        {
     287            case TSTDEVCFGITEMTYPE_STRING:
     288            {
     289                size_t cchVal = strlen(pCfgItem->pszVal);
     290                if (cchString <= cchVal + 1)
     291                    memcpy(pszString, pCfgItem->pszVal, cchVal);
     292                else
     293                    rc = VERR_CFGM_NOT_ENOUGH_SPACE;
     294                break;
     295            }
     296            case TSTDEVCFGITEMTYPE_INTEGER:
     297            case TSTDEVCFGITEMTYPE_BYTES:
     298            default:
     299                rc = VERR_CFGM_IPE_1;
     300                AssertMsgFailed(("Invalid value type %d\n", pCfgItem->enmType));
     301                break;
     302        }
     303    }
     304    else
     305        rc = VERR_CFGM_VALUE_NOT_FOUND;
     306
     307    return rc;
    279308}
    280309
     
    371400static DECLCALLBACK(void) tstDevVmm_MMR3HeapFree(void *pv)
    372401{
    373     RT_NOREF(pv);
    374     AssertFailed();
     402    PTSTDEVMMHEAPALLOC pHeapAlloc = (PTSTDEVMMHEAPALLOC)((uint8_t *)pv - RT_OFFSETOF(TSTDEVMMHEAPALLOC, abAlloc[0]));
     403    PTSTDEVDUTINT pThis = pHeapAlloc->pDut;
     404
     405    tstDevDutLockExcl(pThis);
     406    RTListNodeRemove(&pHeapAlloc->NdMmHeap);
     407    tstDevDutUnlockExcl(pThis);
     408
     409    /* Poison */
     410    memset(&pHeapAlloc->abAlloc[0], 0xfc, pHeapAlloc->cbAlloc);
     411    RTMemFree(pHeapAlloc);
    375412}
    376413
  • trunk/src/VBox/Devices/testcase/tstDeviceVMMInternal.h

    r69162 r69183  
    162162{
    163163    /** Pointer to the callback table. */
    164     PCTSTDEVVMMCALLBACKS pVmmCallbacks;
    165     /** @todo: */
     164    PCTSTDEVVMMCALLBACKS            pVmmCallbacks;
     165    /** Pointer to the device under test. */
     166    PTSTDEVDUTINT                   pDut;
     167    /** Node for the list of PDM threads. */
     168    RTLISTNODE                      NdPdmThreads;
    166169} PDMTHREADINT;
    167170AssertCompile(sizeof(PDMTHREADINT) <= 64);
     171
     172/**
     173 * MM Heap allocation.
     174 */
     175typedef struct TSTDEVMMHEAPALLOC
     176{
     177    /** Node for the list of allocations. */
     178    RTLISTNODE                      NdMmHeap;
     179    /** Pointer to the callback table. */
     180    PCTSTDEVVMMCALLBACKS            pVmmCallbacks;
     181    /** Pointer to the device under test the allocation was made for. */
     182    PTSTDEVDUTINT                   pDut;
     183    /** Size of the allocation. */
     184    size_t                          cbAlloc;
     185    /** Align the next member on a 16byte boundary. */
     186    size_t                          uAlignment0;
     187    /** Start of the real allocation. */
     188    uint8_t                         abAlloc[RT_FLEXIBLE_ARRAY];
     189} TSTDEVMMHEAPALLOC;
     190/** Pointer to a MM Heap allocation. */
     191typedef TSTDEVMMHEAPALLOC *PTSTDEVMMHEAPALLOC;
     192/** Pointer to a const MM Heap allocation. */
     193typedef const TSTDEVMMHEAPALLOC *PCTSTDEVMMHEAPALLOC;
     194
     195AssertCompileMemberAlignment(TSTDEVMMHEAPALLOC, abAlloc, HC_ARCH_BITS == 64 ? 16 : 8);
    168196
    169197#if 0
  • trunk/src/VBox/Devices/testcase/tstDeviceVMMStubs.cpp

    r69162 r69183  
    614614VMMR3DECL(void) MMR3HeapFree(void *pv)
    615615{
    616     RTMemFree(pv); /** @todo */
     616    PTSTDEVMMHEAPALLOC pHeapAlloc = (PTSTDEVMMHEAPALLOC)((uint8_t *)pv - RT_OFFSETOF(TSTDEVMMHEAPALLOC, abAlloc[0]));
     617    pHeapAlloc->pVmmCallbacks->pfnMMR3HeapFree(pv);
    617618}
    618619
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