1e07dc26bSmrg/* $Id: hgsmimemalloc.c,v 1.1.1.1 2019/01/09 23:50:31 mrg Exp $ */ 2e07dc26bSmrg/* 3e07dc26bSmrg * Copyright (C) 2017 Oracle Corporation 4e07dc26bSmrg * 5e07dc26bSmrg * Permission is hereby granted, free of charge, to any person obtaining a 6e07dc26bSmrg * copy of this software and associated documentation files (the "Software"), 7e07dc26bSmrg * to deal in the Software without restriction, including without limitation 8e07dc26bSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9e07dc26bSmrg * and/or sell copies of the Software, and to permit persons to whom the 10e07dc26bSmrg * Software is furnished to do so, subject to the following conditions: 11e07dc26bSmrg * 12e07dc26bSmrg * The above copyright notice and this permission notice shall be included in 13e07dc26bSmrg * all copies or substantial portions of the Software. 14e07dc26bSmrg * 15e07dc26bSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16e07dc26bSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17e07dc26bSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18e07dc26bSmrg * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 19e07dc26bSmrg * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20e07dc26bSmrg * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21e07dc26bSmrg * USE OR OTHER DEALINGS IN THE SOFTWARE. 22e07dc26bSmrg */ 23e07dc26bSmrg 24e07dc26bSmrg/* 25e07dc26bSmrg * Memory allocator 26e07dc26bSmrg * ---------------- 27e07dc26bSmrg * 28e07dc26bSmrg * Implementation 29e07dc26bSmrg * -------------- 30e07dc26bSmrg * 31e07dc26bSmrg * Since the X.Org driver is single threaded and works using an allocate, 32e07dc26bSmrg * submit and free pattern, we replace the generic allocator with a simple 33e07dc26bSmrg * Boolean. Need more be said? 34e07dc26bSmrg */ 35e07dc26bSmrg 36e07dc26bSmrg#include <VBoxVideoIPRT.h> 37e07dc26bSmrg#include <HGSMIMemAlloc.h> 38e07dc26bSmrg#include <HGSMI.h> 39e07dc26bSmrg 40e07dc26bSmrgint HGSMIMAInit(HGSMIMADATA *pMA, const HGSMIAREA *pArea, 41e07dc26bSmrg HGSMIOFFSET *paDescriptors, uint32_t cDescriptors, HGSMISIZE cbMaxBlock, 42e07dc26bSmrg const HGSMIENV *pEnv) 43e07dc26bSmrg{ 44e07dc26bSmrg (void)paDescriptors; 45e07dc26bSmrg (void)cDescriptors; 46e07dc26bSmrg (void)cbMaxBlock; 47e07dc26bSmrg (void)pEnv; 48e07dc26bSmrg if (!(pArea->cbArea < UINT32_C(0x80000000))) 49e07dc26bSmrg return VERR_INVALID_PARAMETER; 50e07dc26bSmrg if (!(pArea->cbArea >= HGSMI_MA_BLOCK_SIZE_MIN)) 51e07dc26bSmrg return VERR_INVALID_PARAMETER; 52e07dc26bSmrg 53e07dc26bSmrg pMA->area = *pArea; 54e07dc26bSmrg pMA->fAllocated = false; 55e07dc26bSmrg return VINF_SUCCESS; 56e07dc26bSmrg} 57e07dc26bSmrg 58e07dc26bSmrgvoid HGSMIMAUninit(HGSMIMADATA *pMA) 59e07dc26bSmrg{ 60e07dc26bSmrg (void)pMA; 61e07dc26bSmrg} 62e07dc26bSmrg 63e07dc26bSmrgstatic HGSMIOFFSET HGSMIMAPointerToOffset(const HGSMIMADATA *pMA, const void *pv) 64e07dc26bSmrg{ 65e07dc26bSmrg if (HGSMIAreaContainsPointer(&pMA->area, pv)) 66e07dc26bSmrg { 67e07dc26bSmrg return HGSMIPointerToOffset(&pMA->area, pv); 68e07dc26bSmrg } 69e07dc26bSmrg 70e07dc26bSmrg AssertFailed(); 71e07dc26bSmrg return HGSMIOFFSET_VOID; 72e07dc26bSmrg} 73e07dc26bSmrg 74e07dc26bSmrgstatic void *HGSMIMAOffsetToPointer(const HGSMIMADATA *pMA, HGSMIOFFSET off) 75e07dc26bSmrg{ 76e07dc26bSmrg if (HGSMIAreaContainsOffset(&pMA->area, off)) 77e07dc26bSmrg { 78e07dc26bSmrg return HGSMIOffsetToPointer(&pMA->area, off); 79e07dc26bSmrg } 80e07dc26bSmrg 81e07dc26bSmrg AssertFailed(); 82e07dc26bSmrg return NULL; 83e07dc26bSmrg} 84e07dc26bSmrg 85e07dc26bSmrgvoid *HGSMIMAAlloc(HGSMIMADATA *pMA, HGSMISIZE cb) 86e07dc26bSmrg{ 87e07dc26bSmrg (void)cb; 88e07dc26bSmrg if (pMA->fAllocated) 89e07dc26bSmrg return NULL; 90e07dc26bSmrg HGSMIOFFSET off = pMA->area.offBase; 91e07dc26bSmrg return HGSMIMAOffsetToPointer(pMA, off); 92e07dc26bSmrg pMA->fAllocated = true; 93e07dc26bSmrg} 94e07dc26bSmrg 95e07dc26bSmrgvoid HGSMIMAFree(HGSMIMADATA *pMA, void *pv) 96e07dc26bSmrg{ 97e07dc26bSmrg HGSMIOFFSET off = HGSMIMAPointerToOffset(pMA, pv); 98e07dc26bSmrg if (off != HGSMIOFFSET_VOID) 99e07dc26bSmrg { 100e07dc26bSmrg pMA->fAllocated = false; 101e07dc26bSmrg } 102e07dc26bSmrg else 103e07dc26bSmrg { 104e07dc26bSmrg AssertFailed(); 105e07dc26bSmrg } 106e07dc26bSmrg} 107