9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/* $Id$ */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/** @file
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * IPRT - Ring-0 Memory Objects, Haiku.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Copyright (C) 2012 Oracle Corporation
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * available from http://www.virtualbox.org. This file is free software;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * General Public License (GPL) as published by the Free Software
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * The contents of this file may alternatively be used under the terms
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * of the Common Development and Distribution License Version 1.0
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * VirtualBox OSE distribution, in which case the provisions of the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * CDDL are applicable instead of those of the GPL.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * You may elect to license modified versions of this file under the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * terms and conditions of either the GPL or the CDDL or both.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/*******************************************************************************
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync* Header Files *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync*******************************************************************************/
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include "the-haiku-kernel.h"
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/memobj.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/mem.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/err.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/assert.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/log.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/param.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/process.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include "internal/memobj.h"
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/*******************************************************************************
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync* Structures and Typedefs *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync*******************************************************************************/
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * The Haiku version of the memory object structure.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsynctypedef struct RTR0MEMOBJHAIKU
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** The core structure. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MEMOBJINTERNAL Core;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** Area identifier */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync area_id AreaId;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync} RTR0MEMOBJHAIKU, *PRTR0MEMOBJHAIKU;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync//MALLOC_DEFINE(M_IPRTMOBJ, "iprtmobj", "IPRT - R0MemObj");
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#if 0
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Gets the virtual memory map the specified object is mapped into.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns VM map handle on success, NULL if no map.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param pMem The memory object.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic vm_map_t rtR0MemObjHaikuGetMap(PRTR0MEMOBJINTERNAL pMem)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync switch (pMem->enmType)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_PAGE:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_LOW:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_CONT:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return kernel_map;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_PHYS:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_PHYS_NC:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return NULL; /* pretend these have no mapping atm. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_LOCK:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return pMem->u.Lock.R0Process == NIL_RTR0PROCESS
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync ? kernel_map
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync : &((struct proc *)pMem->u.Lock.R0Process)->p_vmspace->vm_map;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_RES_VIRT:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return pMem->u.ResVirt.R0Process == NIL_RTR0PROCESS
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync ? kernel_map
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync : &((struct proc *)pMem->u.ResVirt.R0Process)->p_vmspace->vm_map;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_MAPPING:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return pMem->u.Mapping.R0Process == NIL_RTR0PROCESS
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync ? kernel_map
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync : &((struct proc *)pMem->u.Mapping.R0Process)->p_vmspace->vm_map;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync default:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return NULL;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
62b8247e4970b835e263b4c18a2748bf651fabd0vboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncint rtR0MemObjNativeFree(RTR0MEMOBJ pMem)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PRTR0MEMOBJHAIKU pMemHaiku = (PRTR0MEMOBJHAIKU)pMem;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int rc = B_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync switch (pMemHaiku->Core.enmType)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_PAGE:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_LOW:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_CONT:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_MAPPING:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_PHYS:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_PHYS_NC:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pMemHaiku->AreaId > -1)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = delete_area(pMemHaiku->AreaId);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AssertMsg(rc == B_OK, ("%#x", rc));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync break;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_LOCK:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync team_id team = B_SYSTEM_TEAM;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pMemHaiku->Core.u.Lock.R0Process != NIL_RTR0PROCESS)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync team = ((team_id)pMemHaiku->Core.u.Lock.R0Process);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = unlock_memory_etc(team, pMemHaiku->Core.pv, pMemHaiku->Core.cb, B_READ_DEVICE);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AssertMsg(rc == B_OK, ("%#x", rc));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync break;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_RES_VIRT:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync team_id team = B_SYSTEM_TEAM;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pMemHaiku->Core.u.Lock.R0Process != NIL_RTR0PROCESS)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync team = ((team_id)pMemHaiku->Core.u.Lock.R0Process);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = vm_unreserve_address_range(team, pMemHaiku->Core.pv, pMemHaiku->Core.cb);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AssertMsg(rc == B_OK, ("%#x", rc));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync break;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync default:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AssertMsgFailed(("enmType=%d\n", pMemHaiku->Core.enmType));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VERR_INTERNAL_ERROR;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VINF_SUCCESS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
62b8247e4970b835e263b4c18a2748bf651fabd0vboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic int rtR0MemObjNativeAllocArea(PPRTR0MEMOBJINTERNAL ppMem, size_t cb,
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync bool fExecutable, RTR0MEMOBJTYPE type, RTHCPHYS PhysHighest, size_t uAlignment)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync NOREF(fExecutable);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int rc;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync void *pvMap = NULL;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync const char *pszName = NULL;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uint32 addressSpec = B_ANY_KERNEL_ADDRESS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uint32 fLock = ~0U;
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync LogFlowFunc(("ppMem=%p cb=%u, fExecutable=%s, type=%08x, PhysHighest=%RX64 uAlignment=%u\n", ppMem,(unsigned)cb,
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync fExecutable ? "true" : "false", type, PhysHighest,(unsigned)uAlignment));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync switch (type)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_PAGE:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pszName = "IPRT R0MemObj Alloc";
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync fLock = B_FULL_LOCK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync break;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_LOW:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pszName = "IPRT R0MemObj AllocLow";
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync fLock = B_32_BIT_FULL_LOCK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync break;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_CONT:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pszName = "IPRT R0MemObj AllocCont";
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync fLock = B_32_BIT_CONTIGUOUS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync break;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#if 0
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_MAPPING:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pszName = "IPRT R0MemObj Mapping";
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync fLock = B_FULL_LOCK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync break;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_PHYS:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** @todo alignment */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (uAlignment != PAGE_SIZE)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VERR_NOT_SUPPORTED;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** @todo r=ramshankar: no 'break' here?? */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_PHYS_NC:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pszName = "IPRT R0MemObj AllocPhys";
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync fLock = (PhysHighest < _4G ? B_LOMEM : B_32_BIT_CONTIGUOUS);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync break;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#if 0
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_LOCK:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync break;
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync default:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VERR_INTERNAL_ERROR;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* Create the object. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PRTR0MEMOBJHAIKU pMemHaiku;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemHaiku = (PRTR0MEMOBJHAIKU)rtR0MemObjNew(sizeof(RTR0MEMOBJHAIKU), type, NULL, cb);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (RT_UNLIKELY(!pMemHaiku))
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VERR_NO_MEMORY;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = pMemHaiku->AreaId = create_area(pszName, &pvMap, addressSpec, cb, fLock, B_READ_AREA | B_WRITE_AREA);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pMemHaiku->AreaId >= 0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync physical_entry physMap[2];
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemHaiku->Core.pv = pvMap; /* store start address */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync switch (type)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_CONT:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = get_memory_map(pvMap, cb, physMap, 2);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (rc == B_OK)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemHaiku->Core.u.Cont.Phys = physMap[0].address;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync break;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_PHYS:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_PHYS_NC:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = get_memory_map(pvMap, cb, physMap, 2);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (rc == B_OK)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemHaiku->Core.u.Phys.PhysBase = physMap[0].address;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemHaiku->Core.u.Phys.fAllocated = true;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync break;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync default:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync break;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (rc >= B_OK)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *ppMem = &pMemHaiku->Core;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VINF_SUCCESS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync delete_area(pMemHaiku->AreaId);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rtR0MemObjDelete(&pMemHaiku->Core);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return RTErrConvertFromHaikuKernReturn(rc);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncint rtR0MemObjNativeAllocPage(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, bool fExecutable)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return rtR0MemObjNativeAllocArea(ppMem, cb, fExecutable, RTR0MEMOBJTYPE_PAGE, 0 /* PhysHighest */, 0 /* uAlignment */);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncint rtR0MemObjNativeAllocLow(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, bool fExecutable)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return rtR0MemObjNativeAllocArea(ppMem, cb, fExecutable, RTR0MEMOBJTYPE_LOW, 0 /* PhysHighest */, 0 /* uAlignment */);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncint rtR0MemObjNativeAllocCont(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, bool fExecutable)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return rtR0MemObjNativeAllocArea(ppMem, cb, fExecutable, RTR0MEMOBJTYPE_CONT, 0 /* PhysHighest */, 0 /* uAlignment */);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncint rtR0MemObjNativeAllocPhys(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, RTHCPHYS PhysHighest, size_t uAlignment)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return rtR0MemObjNativeAllocArea(ppMem, cb, false, RTR0MEMOBJTYPE_PHYS, PhysHighest, uAlignment);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncint rtR0MemObjNativeAllocPhysNC(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, RTHCPHYS PhysHighest)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return rtR0MemObjNativeAllocPhys(ppMem, cb, PhysHighest, PAGE_SIZE);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncint rtR0MemObjNativeEnterPhys(PPRTR0MEMOBJINTERNAL ppMem, RTHCPHYS Phys, size_t cb, uint32_t uCachePolicy)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AssertReturn(uCachePolicy == RTMEM_CACHE_POLICY_DONT_CARE, VERR_NOT_SUPPORTED);
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync LogFlowFunc(("ppMem=%p Phys=%08x cb=%u uCachePolicy=%x\n", ppMem, Phys,(unsigned)cb, uCachePolicy));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* Create the object. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PRTR0MEMOBJHAIKU pMemHaiku = (PRTR0MEMOBJHAIKU)rtR0MemObjNew(sizeof(*pMemHaiku), RTR0MEMOBJTYPE_PHYS, NULL, cb);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!pMemHaiku)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VERR_NO_MEMORY;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* There is no allocation here, it needs to be mapped somewhere first. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemHaiku->AreaId = -1;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemHaiku->Core.u.Phys.fAllocated = false;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemHaiku->Core.u.Phys.PhysBase = Phys;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemHaiku->Core.u.Phys.uCachePolicy = uCachePolicy;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *ppMem = &pMemHaiku->Core;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VINF_SUCCESS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Worker locking the memory in either kernel or user maps.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns IPRT status code.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param ppMem Where to store the allocated memory object.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param pvStart The starting address.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param cb The size of the block.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param fAccess The mapping protection to apply.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param R0Process The process to map the memory to (use NIL_RTR0PROCESS
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * for the kernel)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param fFlags Memory flags (B_READ_DEVICE indicates the memory is
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * intended to be written from a "device").
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic int rtR0MemObjNativeLockInMap(PPRTR0MEMOBJINTERNAL ppMem, void *pvStart, size_t cb, uint32_t fAccess,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0PROCESS R0Process, int fFlags)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync NOREF(fAccess);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int rc;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync team_id TeamId = B_SYSTEM_TEAM;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync LogFlowFunc(("ppMem=%p pvStart=%p cb=%u fAccess=%x R0Process=%d fFlags=%x\n", ppMem, pvStart, cb, fAccess, R0Process,
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync fFlags));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* Create the object. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PRTR0MEMOBJHAIKU pMemHaiku = (PRTR0MEMOBJHAIKU)rtR0MemObjNew(sizeof(*pMemHaiku), RTR0MEMOBJTYPE_LOCK, pvStart, cb);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (RT_UNLIKELY(!pMemHaiku))
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VERR_NO_MEMORY;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (R0Process != NIL_RTR0PROCESS)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync TeamId = (team_id)R0Process;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = lock_memory_etc(TeamId, pvStart, cb, fFlags);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (rc == B_OK)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemHaiku->AreaId = -1;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemHaiku->Core.u.Lock.R0Process = R0Process;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *ppMem = &pMemHaiku->Core;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VINF_SUCCESS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rtR0MemObjDelete(&pMemHaiku->Core);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return RTErrConvertFromHaikuKernReturn(rc);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncint rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, uint32_t fAccess, RTR0PROCESS R0Process)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return rtR0MemObjNativeLockInMap(ppMem, (void *)R3Ptr, cb, fAccess, R0Process, B_READ_DEVICE);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncint rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb, uint32_t fAccess)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return rtR0MemObjNativeLockInMap(ppMem, pv, cb, fAccess, NIL_RTR0PROCESS, B_READ_DEVICE);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#if 0
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/** @todo Reserve address space */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Worker for the two virtual address space reservers.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * We're leaning on the examples provided by mmap and vm_mmap in vm_mmap.c here.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic int rtR0MemObjNativeReserveInMap(PPRTR0MEMOBJINTERNAL ppMem, void *pvFixed, size_t cb, size_t uAlignment,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0PROCESS R0Process)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int rc;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync team_id TeamId = B_SYSTEM_TEAM;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync LogFlowFunc(("ppMem=%p pvFixed=%p cb=%u uAlignment=%u R0Process=%d\n", ppMem, pvFixed, (unsigned)cb, uAlignment, R0Process));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (R0Process != NIL_RTR0PROCESS)
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync team = (team_id)R0Process;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* Check that the specified alignment is supported. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (uAlignment > PAGE_SIZE)
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync return VERR_NOT_SUPPORTED;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* Create the object. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PRTR0MEMOBJHAIKU pMemHaiku = (PRTR0MEMOBJHAIKU)rtR0MemObjNew(sizeof(*pMemHaiku), RTR0MEMOBJTYPE_RES_VIRT, NULL, cb);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!pMemHaiku)
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync return VERR_NO_MEMORY;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* Ask the kernel to reserve the address range. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync //XXX: vm_reserve_address_range ?
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VERR_NOT_SUPPORTED;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncint rtR0MemObjNativeReserveKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pvFixed, size_t cb, size_t uAlignment)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VERR_NOT_SUPPORTED;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncint rtR0MemObjNativeReserveUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3PtrFixed, size_t cb, size_t uAlignment, RTR0PROCESS R0Process)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VERR_NOT_SUPPORTED;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncint rtR0MemObjNativeMapKernel(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ pMemToMap, void *pvFixed, size_t uAlignment,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync unsigned fProt, size_t offSub, size_t cbSub)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PRTR0MEMOBJHAIKU pMemToMapHaiku = (PRTR0MEMOBJHAIKU)pMemToMap;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PRTR0MEMOBJHAIKU pMemHaiku;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync area_id area = -1;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync void *pvMap = pvFixed;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uint32 uAddrSpec = B_EXACT_ADDRESS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uint32 fProtect = 0;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int rc = VERR_MAP_FAILED;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AssertMsgReturn(!offSub && !cbSub, ("%#x %#x\n", offSub, cbSub), VERR_NOT_SUPPORTED);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AssertMsgReturn(pvFixed == (void *)-1, ("%p\n", pvFixed), VERR_NOT_SUPPORTED);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#if 0
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** @todo r=ramshankar: Wrong format specifiers, fix later! */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync dprintf("%s(%p, %p, %p, %d, %x, %u, %u)\n", __FUNCTION__, ppMem, pMemToMap, pvFixed, uAlignment,
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync fProt, offSub, cbSub);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* Check that the specified alignment is supported. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (uAlignment > PAGE_SIZE)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VERR_NOT_SUPPORTED;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* We can't map anything to the first page, sorry. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pvFixed == 0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VERR_NOT_SUPPORTED;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (fProt & RTMEM_PROT_READ)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync fProtect |= B_KERNEL_READ_AREA;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (fProt & RTMEM_PROT_WRITE)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync fProtect |= B_KERNEL_WRITE_AREA;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Either the object we map has an area associated with, which we can clone,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * or it's a physical address range which we must map.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pMemToMapHaiku->AreaId > -1)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pvFixed == (void *)-1)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uAddrSpec = B_ANY_KERNEL_ADDRESS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = area = clone_area("IPRT R0MemObj MapKernel", &pvMap, uAddrSpec, fProtect, pMemToMapHaiku->AreaId);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync LogFlow(("rtR0MemObjNativeMapKernel: clone_area uAddrSpec=%d fProtect=%x AreaId=%d rc=%d\n", uAddrSpec, fProtect,
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync pMemToMapHaiku->AreaId, rc));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else if (pMemToMapHaiku->Core.enmType == RTR0MEMOBJTYPE_PHYS)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* map_physical_memory() won't let you choose where. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pvFixed != (void *)-1)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VERR_NOT_SUPPORTED;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uAddrSpec = B_ANY_KERNEL_ADDRESS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = area = map_physical_memory("IPRT R0MemObj MapKernelPhys", (phys_addr_t)pMemToMapHaiku->Core.u.Phys.PhysBase,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemToMapHaiku->Core.cb, uAddrSpec, fProtect, &pvMap);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VERR_NOT_SUPPORTED;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (rc >= B_OK)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* Create the object. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemHaiku = (PRTR0MEMOBJHAIKU)rtR0MemObjNew(sizeof(RTR0MEMOBJHAIKU), RTR0MEMOBJTYPE_MAPPING, pvMap,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemToMapHaiku->Core.cb);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (RT_UNLIKELY(!pMemHaiku))
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync return VERR_NO_MEMORY;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemHaiku->Core.u.Mapping.R0Process = NIL_RTR0PROCESS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemHaiku->Core.pv = pvMap;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemHaiku->AreaId = area;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *ppMem = &pMemHaiku->Core;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VINF_SUCCESS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = VERR_MAP_FAILED;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** @todo finish the implementation. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rtR0MemObjDelete(&pMemHaiku->Core);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return rc;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
62b8247e4970b835e263b4c18a2748bf651fabd0vboxsyncint rtR0MemObjNativeMapUser(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ pMemToMap, RTR3PTR R3PtrFixed, size_t uAlignment,
62b8247e4970b835e263b4c18a2748bf651fabd0vboxsync unsigned fProt, RTR0PROCESS R0Process)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#if 0
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Check for unsupported stuff.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AssertMsgReturn(R0Process == RTR0ProcHandleSelf(), ("%p != %p\n", R0Process, RTR0ProcHandleSelf()), VERR_NOT_SUPPORTED);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AssertMsgReturn(R3PtrFixed == (RTR3PTR)-1, ("%p\n", R3PtrFixed), VERR_NOT_SUPPORTED);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (uAlignment > PAGE_SIZE)
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync return VERR_NOT_SUPPORTED;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int rc;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PRTR0MEMOBJHAIKU pMemToMapHaiku = (PRTR0MEMOBJHAIKU)pMemToMap;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync struct proc *pProc = (struct proc *)R0Process;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync struct vm_map *pProcMap = &pProc->p_vmspace->vm_map;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* calc protection */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync vm_prot_t ProtectionFlags = 0;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if ((fProt & RTMEM_PROT_NONE) == RTMEM_PROT_NONE)
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync ProtectionFlags = VM_PROT_NONE;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if ((fProt & RTMEM_PROT_READ) == RTMEM_PROT_READ)
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync ProtectionFlags |= VM_PROT_READ;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if ((fProt & RTMEM_PROT_WRITE) == RTMEM_PROT_WRITE)
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync ProtectionFlags |= VM_PROT_WRITE;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if ((fProt & RTMEM_PROT_EXEC) == RTMEM_PROT_EXEC)
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync ProtectionFlags |= VM_PROT_EXECUTE;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* calc mapping address */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PROC_LOCK(pProc);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync vm_offset_t AddrR3 = round_page((vm_offset_t)pProc->p_vmspace->vm_daddr + lim_max(pProc, RLIMIT_DATA));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PROC_UNLOCK(pProc);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* Insert the object in the map. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = vm_map_find(pProcMap, /* Map to insert the object in */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync NULL, /* Object to map */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync 0, /* Start offset in the object */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync &AddrR3, /* Start address IN/OUT */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemToMap->cb, /* Size of the mapping */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync TRUE, /* Whether a suitable address should be searched for first */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync ProtectionFlags, /* protection flags */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync VM_PROT_ALL, /* Maximum protection flags */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync 0); /* Copy on write */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* Map the memory page by page into the destination map. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (rc == KERN_SUCCESS)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync size_t cPages = pMemToMap->cb >> PAGE_SHIFT;;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pmap_t pPhysicalMap = pProcMap->pmap;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync vm_offset_t AddrR3Dst = AddrR3;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if ( pMemToMap->enmType == RTR0MEMOBJTYPE_PHYS
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync || pMemToMap->enmType == RTR0MEMOBJTYPE_PHYS_NC
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync || pMemToMap->enmType == RTR0MEMOBJTYPE_PAGE)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* Mapping physical allocations */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Assert(cPages == pMemToMapHaiku->u.Phys.cPages);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* Insert the memory page by page into the mapping. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync for (uint32_t iPage = 0; iPage < cPages; iPage++)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync vm_page_t pPage = pMemToMapHaiku->u.Phys.apPages[iPage];
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync MY_PMAP_ENTER(pPhysicalMap, AddrR3Dst, pPage, ProtectionFlags, TRUE);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AddrR3Dst += PAGE_SIZE;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* Mapping cont or low memory types */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync vm_offset_t AddrToMap = (vm_offset_t)pMemToMap->pv;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync for (uint32_t iPage = 0; iPage < cPages; iPage++)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync vm_page_t pPage = PHYS_TO_VM_PAGE(vtophys(AddrToMap));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync MY_PMAP_ENTER(pPhysicalMap, AddrR3Dst, pPage, ProtectionFlags, TRUE);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AddrR3Dst += PAGE_SIZE;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AddrToMap += PAGE_SIZE;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (RT_SUCCESS(rc))
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Create a mapping object for it.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PRTR0MEMOBJHAIKU pMemHaiku = (PRTR0MEMOBJHAIKU)rtR0MemObjNew(sizeof(RTR0MEMOBJHAIKU),
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync RTR0MEMOBJTYPE_MAPPING,
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync (void *)AddrR3,
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync pMemToMap->cb);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pMemHaiku)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Assert((vm_offset_t)pMemHaiku->Core.pv == AddrR3);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pMemHaiku->Core.u.Mapping.R0Process = R0Process;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *ppMem = &pMemHaiku->Core;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VINF_SUCCESS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = vm_map_remove(pProcMap, ((vm_offset_t)AddrR3), ((vm_offset_t)AddrR3) + pMemToMap->cb);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AssertMsg(rc == KERN_SUCCESS, ("Deleting mapping failed\n"));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VERR_NOT_SUPPORTED;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncint rtR0MemObjNativeProtect(PRTR0MEMOBJINTERNAL pMem, size_t offSub, size_t cbSub, uint32_t fProt)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return VERR_NOT_SUPPORTED;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncRTHCPHYS rtR0MemObjNativeGetPagePhysAddr(PRTR0MEMOBJINTERNAL pMem, size_t iPage)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PRTR0MEMOBJHAIKU pMemHaiku = (PRTR0MEMOBJHAIKU)pMem;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync status_t rc;
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** @todo r=ramshankar: Validate objects */
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync LogFlow(("rtR0MemObjNativeGetPagePhysAddr: pMem=%p enmType=%x iPage=%u\n", pMem, pMemHaiku->Core.enmType,(unsigned)iPage));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync switch (pMemHaiku->Core.enmType)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_LOCK:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync team_id TeamId = B_SYSTEM_TEAM;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync physical_entry aPhysMap[2];
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync int32 cPhysMap = 2; /** @todo r=ramshankar: why not use RT_ELEMENTS? */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pMemHaiku->Core.u.Lock.R0Process != NIL_RTR0PROCESS)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync TeamId = (team_id)pMemHaiku->Core.u.Lock.R0Process;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync void *pb = pMemHaiku->Core.pv + (iPage << PAGE_SHIFT);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = get_memory_map_etc(TeamId, pb, B_PAGE_SIZE, aPhysMap, &cPhysMap);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (rc < B_OK || cPhysMap < 1)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return NIL_RTHCPHYS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return aPhysMap[0].address;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#if 0
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_MAPPING:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync vm_offset_t pb = (vm_offset_t)pMemHaiku->Core.pv + (iPage << PAGE_SHIFT);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pMemHaiku->Core.u.Mapping.R0Process != NIL_RTR0PROCESS)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync struct proc *pProc = (struct proc *)pMemHaiku->Core.u.Mapping.R0Process;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync struct vm_map *pProcMap = &pProc->p_vmspace->vm_map;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pmap_t pPhysicalMap = pProcMap->pmap;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return pmap_extract(pPhysicalMap, pb);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return vtophys(pb);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_CONT:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return pMemHaiku->Core.u.Cont.Phys + (iPage << PAGE_SHIFT);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_PHYS:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return pMemHaiku->Core.u.Phys.PhysBase + (iPage << PAGE_SHIFT);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_LOW:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_PAGE:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_PHYS_NC:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync team_id TeamId = B_SYSTEM_TEAM;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync physical_entry aPhysMap[2];
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync int32 cPhysMap = 2; /** @todo r=ramshankar: why not use RT_ELEMENTS? */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync void *pb = pMemHaiku->Core.pv + (iPage << PAGE_SHIFT);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = get_memory_map_etc(TeamId, pb, B_PAGE_SIZE, aPhysMap, &cPhysMap);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (rc < B_OK || cPhysMap < 1)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return NIL_RTHCPHYS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return aPhysMap[0].address;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync case RTR0MEMOBJTYPE_RES_VIRT:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync default:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return NIL_RTHCPHYS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
62b8247e4970b835e263b4c18a2748bf651fabd0vboxsync