VirtualBox

Ignore:
Timestamp:
Jul 4, 2023 7:09:24 AM (22 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
158090
Message:

Additions/VBoxGuest/VBoxGuestR0LibPhysHeap: Make use of the RTR0MemObjContAlloc() API and support allocating memory above 4GiB, bugref:10457

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuest/lib/testcase/tstVbglR0PhysHeap-1.cpp

    r100270 r100360  
    5353#define IN_TESTCASE
    5454#define IN_RING0 /* pretend we're in ring-0 so we get access to the functions */
     55#include <iprt/memobj.h>
    5556#include "../VBoxGuestR0LibInternal.h"
    5657
     
    6667
    6768
     69typedef struct TSTMEMOBJ
     70{
     71    size_t cb;
     72} TSTMEMOBJ;
     73typedef TSTMEMOBJ *PTSTMEMOBJ;
     74
     75
    6876/*********************************************************************************************************************************
    6977*   Global Variables                                                                                                             *
     
    7583
    7684/** Drop-in replacement for RTMemContAlloc   */
    77 static void *tstMemContAlloc(PRTCCPHYS pPhys, size_t cb)
    78 {
     85static int tstMemObjContAllocTag(PRTR0MEMOBJ pMemObj, size_t cb, RTHCPHYS PhysHighest, bool fExecutable, const char *pszTag)
     86{
     87    RT_NOREF(pszTag, PhysHighest, fExecutable);
     88
    7989    RTTESTI_CHECK(cb > 0);
    8090
     
    8292    if (g_cChunks < TST_MAX_CHUNKS)
    8393    {
    84         void *pvRet = RTMemAlloc(cb);
    85         if (pvRet)
    86         {
     94        PTSTMEMOBJ pMem = (PTSTMEMOBJ)RTMemAlloc(sizeof(TSTMEMOBJ) + cb);
     95        if (pMem)
     96        {
     97            pMem->cb = cb;
     98
    8799            g_cChunks++;
    88100            g_cbChunks += cb;
    89             *pPhys = (uint32_t)(uintptr_t)pvRet ^ (UINT32_C(0xf0f0f0f0) & ~(uint32_t)PAGE_OFFSET_MASK);
    90 
    91             /* Avoid problematic values that won't happen in real life:  */
    92             if (!*pPhys)
    93                 *pPhys = 4U << PAGE_SHIFT;
    94             if (UINT32_MAX - *pPhys < cb)
    95                 *pPhys -= RT_ALIGN_32(cb, PAGE_SIZE);
    96 
    97             return pvRet;
    98         }
    99     }
    100 
    101     *pPhys = NIL_RTCCPHYS;
    102     return NULL;
    103 }
    104 
    105 
    106 /** Drop-in replacement for RTMemContFree   */
    107 static void tstMemContFree(void *pv, size_t cb)
    108 {
    109     RTTESTI_CHECK(RT_VALID_PTR(pv));
    110     RTTESTI_CHECK(cb > 0);
     101            *pMemObj = (RTR0MEMOBJ)pMem;
     102            return VINF_SUCCESS;
     103        }
     104    }
     105
     106    return VERR_NO_MEMORY;
     107}
     108
     109
     110/** Drop-in replacement for RTR0MemObjAddress   */
     111static void *tstMemObjAddress(RTR0MEMOBJ hMemObj)
     112{
     113    return (void *)((PTSTMEMOBJ)hMemObj + 1);
     114}
     115
     116
     117/** Drop-in replacement for RTR0MemObjGetPagePhysAddr   */
     118static RTHCPHYS tstMemObjGetPagePhysAddr(RTR0MEMOBJ hMemObj, uint32_t iPage)
     119{
     120    RTTESTI_CHECK(iPage == 0);
     121
     122    PTSTMEMOBJ pMemObj = (PTSTMEMOBJ)hMemObj;
     123    uintptr_t PtrMem = (uintptr_t)(pMemObj + 1);
     124    RTHCPHYS Phys = (uint32_t)(uintptr_t)PtrMem ^ (UINT32_C(0xf0f0f0f0) & ~(uint32_t)PAGE_OFFSET_MASK);
     125
     126    /* Avoid problematic values that won't happen in real life:  */
     127    if (!Phys)
     128        Phys = 4U << PAGE_SHIFT;
     129    if (UINT32_MAX - Phys < pMemObj->cb)
     130        Phys -= RT_ALIGN_32(pMemObj->cb, PAGE_SIZE);
     131
     132    return Phys;
     133}
     134
     135
     136/** Drop-in replacement for RTR0MemObjFree   */
     137static void tstMemObjFree(RTR0MEMOBJ hMemObj, bool fFreeMappings)
     138{
     139    RT_NOREF(fFreeMappings);
     140
     141    PTSTMEMOBJ pMemObj = (PTSTMEMOBJ)hMemObj;
     142    RTTESTI_CHECK(RT_VALID_PTR(pMemObj));
     143    RTTESTI_CHECK(pMemObj->cb > 0);
    111144    RTTESTI_CHECK(g_cChunks > 0);
    112     RTMemFree(pv);
    113145    g_cChunks--;
    114     g_cbChunks -= cb;
    115 }
    116 
    117 
    118 #define RTMemContAlloc  tstMemContAlloc
    119 #define RTMemContFree   tstMemContFree
     146    g_cbChunks -= pMemObj->cb;
     147    RTMemFree(pMemObj);
     148}
     149
     150
     151#define RTR0MemObjAllocContTag      tstMemObjContAllocTag
     152#define RTR0MemObjAddress           tstMemObjAddress
     153#define RTR0MemObjGetPagePhysAddr   tstMemObjGetPagePhysAddr
     154#define RTR0MemObjFree              tstMemObjFree
    120155#include "../VBoxGuestR0LibPhysHeap.cpp"
    121156
     
    178213     */
    179214    RTTestSub(hTest, "Basics");
    180     RTTESTI_CHECK_RC(rc = VbglR0PhysHeapInit(true /*fAlloc32BitAddr*/), VINF_SUCCESS);
     215    RTTESTI_CHECK_RC(rc = VbglR0PhysHeapInit(NIL_RTHCPHYS), VINF_SUCCESS);
    181216    if (RT_FAILURE(rc))
    182217        return RTTestSummaryAndDestroy(hTest);
     
    288323     */
    289324    RTTestSub(hTest, "Random Test");
    290     RTTESTI_CHECK_RC(rc = VbglR0PhysHeapInit(true /*fAlloc32BitAddr*/), VINF_SUCCESS);
     325    RTTESTI_CHECK_RC(rc = VbglR0PhysHeapInit(NIL_RTHCPHYS), VINF_SUCCESS);
    291326    if (RT_FAILURE(rc))
    292327        return RTTestSummaryAndDestroy(hTest);
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