VirtualBox

Ignore:
Timestamp:
May 3, 2012 8:14:02 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
77763
Message:

memobj-r0drv-solaris: Implemented rtR0MemObjNativeMapKernel.

Location:
trunk/src/VBox/Runtime/r0drv/solaris
Files:
2 edited

Legend:

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

    r41081 r41146  
    4343#include "memobj-r0drv-solaris.h"
    4444
     45/*******************************************************************************
     46*   Defined Constants And Macros                                               *
     47*******************************************************************************/
    4548#define SOL_IS_KRNL_ADDR(vx)    ((uintptr_t)(vx) >= kernelbase)
    46 static vnode_t                  s_PageVnode;
     49
    4750
    4851/*******************************************************************************
     
    6871
    6972
     73/*******************************************************************************
     74*   Global Variables                                                           *
     75*******************************************************************************/
     76static vnode_t                  g_PageVnode;
     77
     78
    7079/**
    7180 * Returns the physical address for a virtual address.
     
    125134    seg_t KernelSeg;
    126135    KernelSeg.s_as = &kas;
    127     page_t *pPage = page_get_freelist(&s_PageVnode, 0 /* offset */, &KernelSeg, virtAddr,
     136    page_t *pPage = page_get_freelist(&g_PageVnode, 0 /* offset */, &KernelSeg, virtAddr,
    128137                                      cbPage, 0 /* flags */, NULL /* NUMA group */);
    129138    if (   !pPage
    130139        && g_frtSolUseKflt)
    131140    {
    132         pPage = page_get_freelist(&s_PageVnode, 0 /* offset */, &KernelSeg, virtAddr,
     141        pPage = page_get_freelist(&g_PageVnode, 0 /* offset */, &KernelSeg, virtAddr,
    133142                                  cbPage, PG_KFLT, NULL /* NUMA group */);
    134143    }
     
    150159    seg_t KernelSeg;
    151160    KernelSeg.s_as = &kas;
    152     page_t *pPage = page_get_cachelist(&s_PageVnode, 0 /* offset */, &KernelSeg, virtAddr,
     161    page_t *pPage = page_get_cachelist(&g_PageVnode, 0 /* offset */, &KernelSeg, virtAddr,
    153162                                       0 /* flags */, NULL /* NUMA group */);
    154163    if (   !pPage
    155164        && g_frtSolUseKflt)
    156165    {
    157         pPage = page_get_cachelist(&s_PageVnode, 0 /* offset */, &KernelSeg, virtAddr,
     166        pPage = page_get_cachelist(&g_PageVnode, 0 /* offset */, &KernelSeg, virtAddr,
    158167                                   PG_KFLT, NULL /* NUMA group */);
    159168    }
     
    917926                                          unsigned fProt, size_t offSub, size_t cbSub)
    918927{
    919     /** @todo rtR0MemObjNativeMapKernel / Solaris - Should be fairly simple alloc kernel memory and memload it. */
    920     return VERR_NOT_SUPPORTED;
     928    /* Fail if requested to do something we can't. */
     929    AssertMsgReturn(pvFixed == (void *)-1, ("%p\n", pvFixed), VERR_NOT_SUPPORTED);
     930    if (uAlignment > PAGE_SIZE)
     931        return VERR_NOT_SUPPORTED;
     932
     933    /*
     934     * Use xalloc to get address space.
     935     */
     936    if (!cbSub)
     937        cbSub = pMemToMap->cb;
     938    void *pv = vmem_xalloc(heap_arena, cbSub, uAlignment, 0 /* phase */, 0 /* nocross */,
     939                           NULL /* minaddr */, NULL /* maxaddr */, VM_SLEEP);
     940    if (RT_UNLIKELY(!pv))
     941        return VERR_MAP_FAILED;
     942
     943    /*
     944     * Load the pages from the other object into it.
     945     */
     946    uint32_t fAttr  = HAT_UNORDERED_OK | HAT_MERGING_OK | HAT_LOADCACHING_OK | HAT_STORECACHING_OK;
     947    if (fProt & RTMEM_PROT_READ)
     948        fAttr |= PROT_READ;
     949    if (fProt & RTMEM_PROT_EXEC)
     950        fAttr |= PROT_EXEC;
     951    if (fProt & RTMEM_PROT_WRITE)
     952        fAttr |= PROT_WRITE;
     953    fAttr |= HAT_NOSYNC;
     954
     955    int    rc  = VINF_SUCCESS;
     956    size_t off = 0;
     957    while (off < cbSub)
     958    {
     959        RTHCPHYS HCPhys = rtR0MemObjNativeGetPagePhysAddr(pMemToMap, (offSub + offSub) >> PAGE_SHIFT);
     960        AssertBreakStmt(HCPhys != NIL_RTHCPHYS, rc = VERR_INTERNAL_ERROR_2);
     961        pfn_t pfn = HCPhys >> PAGESHIFT;
     962        AssertBreakStmt(((RTHCPHYS)pfn << PAGESHIFT) == HCPhys, rc = VERR_INTERNAL_ERROR_3);
     963
     964        hat_devload(kas.a_hat, (uint8_t *)pv + off, PAGE_SIZE, pfn, fAttr, HAT_LOAD_LOCK);
     965
     966        /* Advance. */
     967        off += PAGE_SIZE;
     968    }
     969    if (RT_SUCCESS(rc))
     970    {
     971        /*
     972         * Create a memory object for the mapping.
     973         */
     974        PRTR0MEMOBJSOL pMemSolaris = (PRTR0MEMOBJSOL)rtR0MemObjNew(sizeof(*pMemSolaris), RTR0MEMOBJTYPE_MAPPING, pv, cbSub);
     975        if (pMemSolaris)
     976        {
     977            pMemSolaris->Core.u.Mapping.R0Process = NIL_RTR0PROCESS;
     978            *ppMem = &pMemSolaris->Core;
     979            return VINF_SUCCESS;
     980        }
     981
     982        LogRel(("rtR0MemObjNativeMapKernel failed to alloc memory object.\n"));
     983        rc = VERR_NO_MEMORY;
     984    }
     985
     986    if (off)
     987        hat_unload(kas.a_hat, pv, off, HAT_UNLOAD | HAT_UNLOAD_UNLOCK);
     988    vmem_xfree(heap_arena, pv, cbSub);
     989    return rc;
    921990}
    922991
  • trunk/src/VBox/Runtime/r0drv/solaris/memobj-r0drv-solaris.h

    r40968 r41146  
    293293};
    294294
    295 #endif /* ___r0drv_solaris_memobj_r0drv_solaris_h */
    296 
     295#endif /* !___r0drv_solaris_memobj_r0drv_solaris_h */
     296
     297
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