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