VirtualBox

Changeset 3225 in vbox for trunk/src/VBox/Runtime/r0drv


Ignore:
Timestamp:
Jun 22, 2007 4:37:40 AM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
22198
Message:

RTR0MemObjMapKernel for OS/2.

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

Legend:

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

    r2981 r3225  
    580580 * @param   fProt           Combination of RTMEM_PROT_* flags (except RTMEM_PROT_NONE).
    581581 */
    582 RTR0DECL(int) RTR0MemObjMapKernel(PRTR0MEMOBJ pMemObj, PRTR0MEMOBJ MemObjToMap, void *pvFixed, size_t uAlignment, unsigned fProt)
     582RTR0DECL(int) RTR0MemObjMapKernel(PRTR0MEMOBJ pMemObj, RTR0MEMOBJ MemObjToMap, void *pvFixed, size_t uAlignment, unsigned fProt)
    583583{
    584584    /* sanity checks. */
  • trunk/src/VBox/Runtime/r0drv/os2/memobj-r0drv-os2.cpp

    r2981 r3225  
    8080            if (!pMemOs2->Core.pv)
    8181                break;
     82
     83        case RTR0MEMOBJTYPE_MAPPING:
     84            if (pMemOs2->Core.u.Mapping.R0Process == NIL_RTR0PROCESS)
     85                break;
     86
     87            /* fall thru */
    8288        case RTR0MEMOBJTYPE_PAGE:
    8389        case RTR0MEMOBJTYPE_LOW:
    8490        case RTR0MEMOBJTYPE_CONT:
    85         case RTR0MEMOBJTYPE_MAPPING:
    8691            rc = KernVMFree(pMemOs2->Core.pv);
    8792            AssertMsg(!rc, ("rc=%d type=%d pv=%p cb=%#zx\n", rc, pMemOs2->Core.enmType, pMemOs2->Core.pv, pMemOs2->Core.cb));
     
    289294int rtR0MemObjNativeMapKernel(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ pMemToMap, void *pvFixed, size_t uAlignment, unsigned fProt)
    290295{
    291     return VERR_NOT_IMPLEMENTED;
    292 }
    293 
    294 
    295 int rtR0MemObjNativeMapUser(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ pMemToMap, void *pvFixed, size_t uAlignment, unsigned fProt, RTR0PROCESS R0Process)
    296 {
    297     AssertMsgReturn(R0Process == RTR0ProcHandleSelf(), ("%p != %p\n", R0Process, RTR0ProcHandleSelf()), VERR_NOT_SUPPORTED);
    298296    AssertMsgReturn(pvFixed == (void *)-1, ("%p\n", pvFixed), VERR_NOT_SUPPORTED);
    299297
     298/** @todo finish the implementation. */
     299
    300300    int rc;
    301     void *pvR0;
    302     void *pvR3 = NULL;
     301    void *pvR0 = NULL;
    303302    PRTR0MEMOBJOS2 pMemToMapOs2 = (PRTR0MEMOBJOS2)pMemToMap;
    304303    switch (pMemToMapOs2->Core.enmType)
     
    315314        case RTR0MEMOBJTYPE_PHYS:
    316315            pvR0 = pMemToMapOs2->Core.pv;
     316            if (!pvR0)
     317            {
     318                /* no ring-0 mapping, so allocate a mapping in the process. */
     319                AssertMsgReturn(uAlignment == PAGE_SIZE, ("%#zx\n", uAlignment), VERR_NOT_SUPPORTED);
     320                AssertMsgReturn(fProt & RTMEM_PROT_WRITE, ("%#x\n", fProt), VERR_NOT_SUPPORTED);
     321                Assert(!pMemToMapOs2->Core.u.Phys.fAllocated);
     322                ULONG ulPhys = pMemToMapOs2->Core.u.Phys.PhysBase;
     323                rc = KernVMAlloc(pMemToMapOs2->Core.cb, VMDHA_PHYS/* | VMDHA_SHARED?*/, &pvR0, (PPVOID)&ulPhys, NULL);
     324                if (rc)
     325                    return RTErrConvertFromOS2(rc);
     326                pMemToMapOs2->Core.pv = pvR0;
     327            }
     328            break;
     329
     330        case RTR0MEMOBJTYPE_LOCK:
     331            if (pMemToMapOs2->Core.u.Lock.R0Process != NIL_RTR0PROCESS)
     332                return VERR_NOT_SUPPORTED; /** @todo implement this... */
     333            pvR0 = pMemToMapOs2->Core.pv;
     334            break;
     335
     336        case RTR0MEMOBJTYPE_RES_VIRT:
     337        case RTR0MEMOBJTYPE_MAPPING:
     338        default:
     339            AssertMsgFailed(("enmType=%d\n", pMemToMapOs2->Core.enmType));
     340            return VERR_INTERNAL_ERROR;
     341    }
     342
     343    /*
     344     * Create a dummy mapping object for it.
     345     *
     346     * All mappings are read/write/execute in OS/2 and there isn't
     347     * any cache options, so sharing is ok. And the main memory object
     348     * isn't actually freed until all the mappings have been freed up
     349     * (reference counting).
     350     */
     351    PRTR0MEMOBJOS2 pMemOs2 = (PRTR0MEMOBJOS2)rtR0MemObjNew(RT_OFFSETOF(RTR0MEMOBJOS2, Lock), RTR0MEMOBJTYPE_MAPPING, pvR0, pMemToMapOs2->Core.cb);
     352    if (pMemOs2)
     353    {
     354        pMemOs2->Core.u.Mapping.R0Process = NIL_RTR0PROCESS;
     355        *ppMem = &pMemOs2->Core;
     356        return VINF_SUCCESS;
     357    }
     358    return VERR_NO_MEMORY;
     359}
     360
     361
     362int rtR0MemObjNativeMapUser(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ pMemToMap, void *pvFixed, size_t uAlignment, unsigned fProt, RTR0PROCESS R0Process)
     363{
     364    AssertMsgReturn(R0Process == RTR0ProcHandleSelf(), ("%p != %p\n", R0Process, RTR0ProcHandleSelf()), VERR_NOT_SUPPORTED);
     365    AssertMsgReturn(pvFixed == (void *)-1, ("%p\n", pvFixed), VERR_NOT_SUPPORTED);
     366
     367    int rc;
     368    void *pvR0;
     369    void *pvR3 = NULL;
     370    PRTR0MEMOBJOS2 pMemToMapOs2 = (PRTR0MEMOBJOS2)pMemToMap;
     371    switch (pMemToMapOs2->Core.enmType)
     372    {
     373        /*
     374         * These has kernel mappings.
     375         */
     376        case RTR0MEMOBJTYPE_PAGE:
     377        case RTR0MEMOBJTYPE_LOW:
     378        case RTR0MEMOBJTYPE_CONT:
     379            pvR0 = pMemToMapOs2->Core.pv;
     380            break;
     381
     382        case RTR0MEMOBJTYPE_PHYS:
     383            pvR0 = pMemToMapOs2->Core.pv;
     384#if 0/* this is wrong. */
    317385            if (!pvR0)
    318386            {
     
    327395            }
    328396            break;
     397#endif
     398            return VERR_NOT_SUPPORTED;
    329399
    330400        case RTR0MEMOBJTYPE_LOCK:
     
    364434    if (pMemOs2)
    365435    {
    366 Assert(pMemOs2->Core.pv == pvR3);
     436        Assert(pMemOs2->Core.pv == pvR3);
    367437        pMemOs2->Core.u.Mapping.R0Process = R0Process;
    368438        *ppMem = &pMemOs2->Core;
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