VirtualBox

Ignore:
Timestamp:
Mar 24, 2025 6:53:21 PM (3 weeks ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
168147
Message:

HostDrivers/Support: Make SUPR3 work on hosts where the page size is not known during compile time, bugref:10391

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/SUPLib.cpp

    r108481 r108724  
    7575#include <iprt/path.h>
    7676#include <iprt/string.h>
     77#include <iprt/system.h>
    7778#include <iprt/env.h>
    7879#include <iprt/rand.h>
     
    551552
    552553        /* fake the GIP. */
    553         g_pSUPGlobalInfoPage = (PSUPGLOBALINFOPAGE)RTMemPageAllocZ(PAGE_SIZE);
     554        g_pSUPGlobalInfoPage = (PSUPGLOBALINFOPAGE)RTMemPageAllocZ(SUP_PAGE_SIZE);
    554555        if (g_pSUPGlobalInfoPage)
    555556        {
    556557            g_pSUPGlobalInfoPageR0 = g_pSUPGlobalInfoPage;
    557             g_HCPhysSUPGlobalInfoPage = NIL_RTHCPHYS & ~(RTHCPHYS)PAGE_OFFSET_MASK;
     558            g_HCPhysSUPGlobalInfoPage = NIL_RTHCPHYS & ~(RTHCPHYS)SUP_PAGE_OFFSET_MASK;
    558559            /* the page is supposed to be invalid, so don't set the magic. */
    559560            return VINF_SUCCESS;
     
    10021003SUPR3DECL(int) supR3PageLock(void *pvStart, size_t cPages, PSUPPAGE paPages)
    10031004{
     1005    uint32_t  const cbPage = SUP_PAGE_SIZE;
     1006
    10041007    /*
    10051008     * Validate.
    10061009     */
    10071010    AssertPtr(pvStart);
    1008     AssertMsg(RT_ALIGN_P(pvStart, PAGE_SIZE) == pvStart, ("pvStart (%p) must be page aligned\n", pvStart));
     1011    AssertMsg(RT_ALIGN_P(pvStart, cbPage) == pvStart, ("pvStart (%p) must be page aligned\n", pvStart));
    10091012    AssertPtr(paPages);
    10101013
     
    10121015    if (RT_UNLIKELY(g_uSupFakeMode))
    10131016    {
    1014         RTHCPHYS    Phys = (uintptr_t)pvStart + PAGE_SIZE * 1024;
     1017        RTHCPHYS    Phys = (uintptr_t)pvStart + cbPage * 1024;
    10151018        size_t      iPage = cPages;
    10161019        while (iPage-- > 0)
    1017             paPages[iPage].Phys = Phys + (iPage << PAGE_SHIFT);
     1020            paPages[iPage].Phys = Phys + (iPage << SUP_PAGE_SHIFT);
    10181021        return VINF_SUCCESS;
    10191022    }
     
    10681071     */
    10691072    AssertPtr(pvStart);
    1070     AssertMsg(RT_ALIGN_P(pvStart, PAGE_SIZE) == pvStart, ("pvStart (%p) must be page aligned\n", pvStart));
     1073    AssertMsg(RT_ALIGN_P(pvStart, SUP_PAGE_SIZE) == pvStart, ("pvStart (%p) must be page aligned\n", pvStart));
    10711074
    10721075    /* fake */
     
    11171120
    11181121
     1122#ifdef VBOX_WITH_R0_MODULES
    11191123/**
    11201124 * Fallback for SUPR3PageAllocEx on systems where RTR0MemObjPhysAllocNC isn't
     
    11351139    return rc;
    11361140}
     1141#endif /* VBOX_WITH_R0_MODULES */
    11371142
    11381143
     
    11481153        *pR0Ptr = NIL_RTR0PTR;
    11491154    AssertPtrNullReturn(paPages, VERR_INVALID_POINTER);
    1150     AssertMsgReturn(cPages > 0 && cPages <= VBOX_MAX_ALLOC_PAGE_COUNT, ("cPages=%zu\n", cPages), VERR_PAGE_COUNT_OUT_OF_RANGE);
     1155    AssertMsgReturn(cPages > 0 && cPages <= VBOX_MAX_ALLOC_SIZE / SUP_PAGE_SIZE, ("cPages=%zu\n", cPages), VERR_PAGE_COUNT_OUT_OF_RANGE);
    11511156    AssertReturn(!fFlags, VERR_INVALID_FLAGS);
    11521157
     
    11571162    {
    11581163        int rc = SUPR3PageAlloc(cPages, 0 /*fFlags*/, ppvPages);
    1159         Assert(RT_FAILURE(rc) || ASMMemIsZero(*ppvPages, cPages << PAGE_SHIFT));
     1164        Assert(RT_FAILURE(rc) || ASMMemIsZero(*ppvPages, cPages << SUP_PAGE_SHIFT));
    11601165        if (pR0Ptr)
    11611166            *pR0Ptr = NIL_RTR0PTR;
     
    11761181        return VERR_WRONG_ORDER;
    11771182
     1183#ifdef VBOX_WITH_R0_MODULES
    11781184    /*
    11791185     * Use fallback for non-R0 mapping?
     
    12401246        rc = VERR_NO_TMP_MEMORY;
    12411247    return rc;
    1242 
    1243 }
    1244 
    1245 
     1248#else
     1249    AssertFailedReturn(VERR_NOT_SUPPORTED);
     1250#endif /* VBOX_WITH_R0_MODULES */
     1251}
     1252
     1253
     1254#ifdef VBOX_WITH_R0_MODULES
    12461255SUPR3DECL(int) SUPR3PageMapKernel(void *pvR3, uint32_t off, uint32_t cb, uint32_t fFlags, PRTR0PTR pR0Ptr)
    12471256{
     
    12821291    return rc;
    12831292}
     1293#endif
    12841294
    12851295
     
    12901300     */
    12911301    AssertPtrReturn(pvR3, VERR_INVALID_POINTER);
    1292     Assert(!(off & PAGE_OFFSET_MASK));
    1293     Assert(!(cb & PAGE_OFFSET_MASK) && cb);
     1302    Assert(!(off & SUP_PAGE_OFFSET_MASK));
     1303    Assert(!(cb & SUP_PAGE_OFFSET_MASK) && cb);
    12941304    AssertReturn(!(fProt & ~(RTMEM_PROT_NONE | RTMEM_PROT_READ | RTMEM_PROT_WRITE | RTMEM_PROT_EXEC)), VERR_INVALID_PARAMETER);
    12951305
     
    14761486    if (RT_UNLIKELY(g_uSupFakeMode))
    14771487    {
    1478         *ppvPages = RTMemPageAllocZ((size_t)cPages * PAGE_SIZE);
     1488        *ppvPages = RTMemPageAllocZ((size_t)cPages * SUP_PAGE_SIZE);
    14791489        if (!*ppvPages)
    14801490            return VERR_NO_LOW_MEMORY;
    14811491
    14821492        /* fake physical addresses. */
    1483         RTHCPHYS    Phys = (uintptr_t)*ppvPages + PAGE_SIZE * 1024;
     1493        RTHCPHYS    Phys = (uintptr_t)*ppvPages + SUP_PAGE_SIZE * 1024;
    14841494        size_t      iPage = cPages;
    14851495        while (iPage-- > 0)
    1486             paPages[iPage].Phys = Phys + (iPage << PAGE_SHIFT);
     1496            paPages[iPage].Phys = Phys + (iPage << SUP_PAGE_SHIFT);
    14871497        return VINF_SUCCESS;
    14881498    }
     
    15441554    if (RT_UNLIKELY(g_uSupFakeMode))
    15451555    {
    1546         RTMemPageFree(pv, cPages * PAGE_SIZE);
     1556        RTMemPageFree(pv, cPages * SUP_PAGE_SIZE);
    15471557        return VINF_SUCCESS;
    15481558    }
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