VirtualBox

source: vbox/trunk/include/VBox/Graphics/HGSMIMemAlloc.h@ 67180

Last change on this file since 67180 was 66506, checked in by vboxsync, 8 years ago

bugref:8524: Additions/linux: play nicely with distribution-installed Additions
Based on a patch series by Hans de Goede/Red Hat with minor adjustments by Oracle.
Graphics: Add VBoxVideoIPRT.h header
Add a VBoxVideoIPRT.h header, this adds 2 versions of this file:
1) Generic include/VBox/Graphics/VBoxVideoIPRT.h which includes all the header

files needed by files shared with the linux drm driver

2) src/VBox/Additions/linux/drm/VBoxVideoIPRT.h, which replaces the generic

gfx-common.h when building the linux drm driver


The purpose of this is to eventually redefines various iprt and HGSMI bits
in the linux drm driver version to use more linux kernel infrastructure.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.3 KB
Line 
1/** @file
2 *
3 * VBox Host Guest Shared Memory Interface (HGSMI).
4 * Memory allocator.
5 */
6
7/*
8 * Copyright (C) 2014-2016 Oracle Corporation
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17 *
18 * The contents of this file may alternatively be used under the terms
19 * of the Common Development and Distribution License Version 1.0
20 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
21 * VirtualBox OSE distribution, in which case the provisions of the
22 * CDDL are applicable instead of those of the GPL.
23 *
24 * You may elect to license modified versions of this file under the
25 * terms and conditions of either the GPL or the CDDL or both.
26 */
27
28
29#ifndef ___VBox_Graphics_HGSMIMemAlloc_h
30#define ___VBox_Graphics_HGSMIMemAlloc_h
31
32#include <HGSMIDefs.h>
33#include <VBoxVideoIPRT.h>
34
35
36/* Descriptor. */
37#define HGSMI_MA_DESC_OFFSET_MASK UINT32_C(0xFFFFFFE0)
38#define HGSMI_MA_DESC_FREE_MASK UINT32_C(0x00000010)
39#define HGSMI_MA_DESC_ORDER_MASK UINT32_C(0x0000000F)
40
41#define HGSMI_MA_DESC_OFFSET(d) ((d) & HGSMI_MA_DESC_OFFSET_MASK)
42#define HGSMI_MA_DESC_IS_FREE(d) (((d) & HGSMI_MA_DESC_FREE_MASK) != 0)
43#define HGSMI_MA_DESC_ORDER(d) ((d) & HGSMI_MA_DESC_ORDER_MASK)
44
45#define HGSMI_MA_DESC_ORDER_BASE UINT32_C(5)
46
47#define HGSMI_MA_BLOCK_SIZE_MIN (UINT32_C(1) << (HGSMI_MA_DESC_ORDER_BASE + 0))
48#define HGSMI_MA_BLOCK_SIZE_MAX (UINT32_C(1) << (HGSMI_MA_DESC_ORDER_BASE + HGSMI_MA_DESC_ORDER_MASK))
49
50/* HGSMI_MA_DESC_ORDER_BASE must correspond to HGSMI_MA_DESC_OFFSET_MASK. */
51AssertCompile((~HGSMI_MA_DESC_OFFSET_MASK + 1) == HGSMI_MA_BLOCK_SIZE_MIN);
52
53
54typedef struct HGSMIMABLOCK
55{
56 RTLISTNODE nodeBlock;
57 RTLISTNODE nodeFree;
58 HGSMIOFFSET descriptor;
59} HGSMIMABLOCK;
60
61typedef struct HGSMIMADATA
62{
63 HGSMIAREA area;
64 HGSMIENV env;
65 HGSMISIZE cbMaxBlock;
66
67 uint32_t cBlocks; /* How many blocks in the listBlocks. */
68 RTLISTANCHOR listBlocks; /* All memory blocks, sorted. */
69 RTLISTANCHOR aListFreeBlocks[HGSMI_MA_DESC_ORDER_MASK + 1]; /* For free blocks of each order. */
70} HGSMIMADATA;
71
72RT_C_DECLS_BEGIN
73
74int HGSMIMAInit(HGSMIMADATA *pMA, const HGSMIAREA *pArea,
75 HGSMIOFFSET *paDescriptors, uint32_t cDescriptors, HGSMISIZE cbMaxBlock,
76 const HGSMIENV *pEnv);
77void HGSMIMAUninit(HGSMIMADATA *pMA);
78
79void *HGSMIMAAlloc(HGSMIMADATA *pMA, HGSMISIZE cb);
80void HGSMIMAFree(HGSMIMADATA *pMA, void *pv);
81
82HGSMIMABLOCK *HGSMIMASearchOffset(HGSMIMADATA *pMA, HGSMIOFFSET off);
83
84uint32_t HGSMIPopCnt32(uint32_t u32);
85
86DECLINLINE(HGSMISIZE) HGSMIMAOrder2Size(HGSMIOFFSET order)
87{
88 return (UINT32_C(1) << (HGSMI_MA_DESC_ORDER_BASE + order));
89}
90
91DECLINLINE(HGSMIOFFSET) HGSMIMASize2Order(HGSMISIZE cb)
92{
93 HGSMIOFFSET order = HGSMIPopCnt32(cb - 1) - HGSMI_MA_DESC_ORDER_BASE;
94#ifdef HGSMI_STRICT
95 Assert(HGSMIMAOrder2Size(order) == cb);
96#endif
97 return order;
98}
99
100RT_C_DECLS_END
101
102#endif /* !___VBox_Graphics_HGSMIMemAlloc_h */
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette