07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync/* $Id$ */
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync/** @file
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync * kHlpPage - Page Memory Allocation, IPRT based implementation.
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync */
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2007-2010 Oracle Corporation
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync *
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync * available from http://www.virtualbox.org. This file is free software;
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync */
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync/*******************************************************************************
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync* Header Files *
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync*******************************************************************************/
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync#include <k/kHlpAlloc.h>
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync#include <k/kErrors.h>
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync#include <iprt/mem.h>
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync#include <iprt/assert.h>
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync#include <iprt/err.h>
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsyncstatic unsigned kHlpPageProtToNative(KPROT enmProt)
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync{
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync switch (enmProt)
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync {
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync case KPROT_NOACCESS: return RTMEM_PROT_NONE;
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync case KPROT_READONLY: return RTMEM_PROT_READ;
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync case KPROT_READWRITE: return RTMEM_PROT_READ | RTMEM_PROT_WRITE;
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync case KPROT_EXECUTE: return RTMEM_PROT_EXEC;
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync case KPROT_EXECUTE_READ: return RTMEM_PROT_EXEC | RTMEM_PROT_READ;
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync case KPROT_EXECUTE_READWRITE: return RTMEM_PROT_EXEC | RTMEM_PROT_READ | RTMEM_PROT_WRITE;
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync default:
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync AssertFailed();
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync return ~0U;
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync }
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync}
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsyncKHLP_DECL(int) kHlpPageAlloc(void **ppv, KSIZE cb, KPROT enmProt, KBOOL fFixed)
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync{
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync AssertReturn(fFixed, KERR_NOT_IMPLEMENTED);
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync int rc = VINF_SUCCESS;
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync void *pv = RTMemPageAlloc(cb);
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync if (pv)
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync {
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync rc = RTMemProtect(pv, cb, kHlpPageProtToNative(enmProt));
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync if (RT_SUCCESS(rc))
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync *ppv = pv;
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync else
64b7f88fc7a47e781e384800a467e27a844e79e7vboxsync RTMemPageFree(pv, cb);
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync }
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync return rc;
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync}
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsyncKHLP_DECL(int) kHlpPageProtect(void *pv, KSIZE cb, KPROT enmProt)
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync{
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync int rc = RTMemProtect(pv, cb, kHlpPageProtToNative(enmProt));
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync if (!rc)
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync return 0;
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync /** @todo convert iprt status code -> kErrors */
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync return rc;
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync}
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsyncKHLP_DECL(int) kHlpPageFree(void *pv, KSIZE cb)
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync{
187870a41052c1a6287a044270731ddb39a8312cvboxsync RTMemPageFree(pv, cb);
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync return 0;
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync}
07ca5489e6fa49b415eb5e0e42567833699a9e57vboxsync