VirtualBox

Ignore:
Timestamp:
Jun 28, 2023 10:43:26 AM (20 months ago)
Author:
vboxsync
Message:

Runtime/r0drv/linux/memobj-r0drv-linux.c: Make it work on linux.arm64, bugref:10457

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c

    r98867 r100319  
    609609         * Use vmap - 2.4.22 and later.
    610610         */
    611 #if RTLNX_VER_MIN(2,4,22)
     611#if RTLNX_VER_MIN(2,4,22) && (defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86))
    612612        pgprot_t fPg;
    613613        pgprot_val(fPg) = _PAGE_PRESENT | _PAGE_RW;
     
    978978    int rc;
    979979
    980 #if (defined(RT_ARCH_AMD64) || defined(CONFIG_X86_PAE)) && defined(GFP_DMA32)
     980#if (defined(RT_ARCH_AMD64) || defined(RT_ARCH_ARM64) || defined(CONFIG_X86_PAE)) && defined(GFP_DMA32)
    981981    /* ZONE_DMA32: 0-4GB */
    982982    rc = rtR0MemObjLinuxAllocPages(&pMemLnx, RTR0MEMOBJTYPE_CONT, cb, PAGE_SIZE, GFP_DMA32,
     
    984984    if (RT_FAILURE(rc))
    985985#endif
    986 #ifdef RT_ARCH_AMD64
     986#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_ARM64)
    987987        /* ZONE_DMA: 0-16MB */
    988988        rc = rtR0MemObjLinuxAllocPages(&pMemLnx, RTR0MEMOBJTYPE_CONT, cb, PAGE_SIZE, GFP_DMA,
     
    11451145RTDECL(struct page *) rtR0MemObjLinuxVirtToPage(void *pv)
    11461146{
     1147#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
    11471148    unsigned long   ulAddr = (unsigned long)pv;
    11481149    unsigned long   pfn;
     
    11521153    {
    11531154        pgd_t       Global;
    1154 #if RTLNX_VER_MIN(4,12,0)
     1155# if RTLNX_VER_MIN(4,12,0)
    11551156        p4d_t       Four;
    1156 #endif
    1157 #if RTLNX_VER_MIN(2,6,11)
     1157# endif
     1158# if RTLNX_VER_MIN(2,6,11)
    11581159        pud_t       Upper;
    1159 #endif
     1160# endif
    11601161        pmd_t       Middle;
    11611162        pte_t       Entry;
     
    11701171    if (RT_UNLIKELY(pgd_none(u.Global)))
    11711172        return NULL;
    1172 #if RTLNX_VER_MIN(2,6,11)
    1173 # if RTLNX_VER_MIN(4,12,0)
     1173# if RTLNX_VER_MIN(2,6,11)
     1174#  if RTLNX_VER_MIN(4,12,0)
    11741175    u.Four  = *p4d_offset(&u.Global, ulAddr);
    11751176    if (RT_UNLIKELY(p4d_none(u.Four)))
     
    11851186    }
    11861187    u.Upper = *pud_offset(&u.Four, ulAddr);
    1187 # else /* < 4.12 */
     1188#  else /* < 4.12 */
    11881189    u.Upper = *pud_offset(&u.Global, ulAddr);
    1189 # endif /* < 4.12 */
     1190#  endif /* < 4.12 */
    11901191    if (RT_UNLIKELY(pud_none(u.Upper)))
    11911192        return NULL;
    1192 # if RTLNX_VER_MIN(2,6,25)
     1193#  if RTLNX_VER_MIN(2,6,25)
    11931194    if (pud_large(u.Upper))
    11941195    {
     
    11991200        return pfn_to_page(pfn);
    12001201    }
    1201 # endif
     1202#  endif
    12021203    u.Middle = *pmd_offset(&u.Upper, ulAddr);
    1203 #else  /* < 2.6.11 */
     1204# else  /* < 2.6.11 */
    12041205    u.Middle = *pmd_offset(&u.Global, ulAddr);
    1205 #endif /* < 2.6.11 */
     1206# endif /* < 2.6.11 */
    12061207    if (RT_UNLIKELY(pmd_none(u.Middle)))
    12071208        return NULL;
    1208 #if RTLNX_VER_MIN(2,6,0)
     1209# if RTLNX_VER_MIN(2,6,0)
    12091210    if (pmd_large(u.Middle))
    12101211    {
     
    12151216        return pfn_to_page(pfn);
    12161217    }
    1217 #endif
    1218 
    1219 #if RTLNX_VER_MIN(2,5,5) || defined(pte_offset_map) /* As usual, RHEL 3 had pte_offset_map earlier. */
     1218# endif
     1219
     1220# if RTLNX_VER_MIN(2,5,5) || defined(pte_offset_map) /* As usual, RHEL 3 had pte_offset_map earlier. */
    12201221    pEntry = pte_offset_map(&u.Middle, ulAddr);
    1221 #else
     1222# else
    12221223    pEntry = pte_offset(&u.Middle, ulAddr);
    1223 #endif
     1224# endif
    12241225    if (RT_UNLIKELY(!pEntry))
    12251226        return NULL;
    12261227    u.Entry = *pEntry;
    1227 #if RTLNX_VER_MIN(2,5,5) || defined(pte_offset_map)
     1228# if RTLNX_VER_MIN(2,5,5) || defined(pte_offset_map)
    12281229    pte_unmap(pEntry);
    1229 #endif
     1230# endif
    12301231
    12311232    if (RT_UNLIKELY(!pte_present(u.Entry)))
    12321233        return NULL;
    12331234    return pte_page(u.Entry);
     1235#else /* !defined(RT_ARCH_AMD64) && !defined(RT_ARCH_X86) */
     1236    return virt_to_page(pv);
     1237#endif
    12341238}
    12351239RT_EXPORT_SYMBOL(rtR0MemObjLinuxVirtToPage);
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