VirtualBox

source: vbox/trunk/include/iprt/memobj.h@ 3630

Last change on this file since 3630 was 3630, checked in by vboxsync, 17 years ago

iprt_hdr_h -> _iprt_hdr_h

File size: 9.7 KB
Line 
1/** @file
2 * innotek Portable Runtime - Memory Objects (Ring-0).
3 */
4
5/*
6 * Copyright (C) 2006-2007 innotek GmbH
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License as published by the Free Software Foundation,
12 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
13 * distribution. VirtualBox OSE is distributed in the hope that it will
14 * be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * If you received this file as part of a commercial VirtualBox
17 * distribution, then only the terms of your commercial VirtualBox
18 * license agreement apply instead of the previous paragraph.
19 */
20
21#ifndef ___iprt_memobj_h
22#define ___iprt_memobj_h
23
24#include <iprt/cdefs.h>
25#include <iprt/types.h>
26
27__BEGIN_DECLS
28
29/** @defgroup grp_rt_memobj RTMemObj - Memory Object Manipulation (Ring-0)
30 * @ingroup grp_rt
31 * @{
32 */
33
34#ifdef IN_RING0
35
36/**
37 * Checks if this is mapping or not.
38 *
39 * @returns true if it's a mapping, otherwise false.
40 * @param MemObj The ring-0 memory object handle.
41 */
42RTR0DECL(bool) RTR0MemObjIsMapping(RTR0MEMOBJ MemObj);
43
44/**
45 * Gets the address of a ring-0 memory object.
46 *
47 * @returns The address of the memory object.
48 * @returns NULL if the handle is invalid (asserts in strict builds) or if there isn't any mapping.
49 * @param MemObj The ring-0 memory object handle.
50 */
51RTR0DECL(void *) RTR0MemObjAddress(RTR0MEMOBJ MemObj);
52
53/**
54 * Gets the size of a ring-0 memory object.
55 *
56 * @returns The address of the memory object.
57 * @returns NULL if the handle is invalid (asserts in strict builds) or if there isn't any mapping.
58 * @param MemObj The ring-0 memory object handle.
59 */
60RTR0DECL(size_t) RTR0MemObjSize(RTR0MEMOBJ MemObj);
61
62/**
63 * Get the physical address of an page in the memory object.
64 *
65 * @returns The physical address.
66 * @returns NIL_RTHCPHYS if the object doesn't contain fixed physical pages.
67 * @returns NIL_RTHCPHYS if the iPage is out of range.
68 * @returns NIL_RTHCPHYS if the object handle isn't valid.
69 * @param MemObj The ring-0 memory object handle.
70 * @param iPage The page number within the object.
71 */
72RTR0DECL(RTHCPHYS) RTR0MemObjGetPagePhysAddr(RTR0MEMOBJ MemObj, unsigned iPage);
73
74/**
75 * Frees a ring-0 memory object.
76 *
77 * @returns IPRT status code.
78 * @retval VERR_INVALID_HANDLE if
79 * @param MemObj The ring-0 memory object to be freed. NULL is accepted.
80 * @param fFreeMappings Whether or not to free mappings of the object.
81 */
82RTR0DECL(int) RTR0MemObjFree(RTR0MEMOBJ MemObj, bool fFreeMappings);
83
84/**
85 * Allocates page aligned virtual kernel memory.
86 *
87 * The memory is taken from a non paged (= fixed physical memory backing) pool.
88 *
89 * @returns IPRT status code.
90 * @param pMemObj Where to store the ring-0 memory object handle.
91 * @param cb Number of bytes to allocate. This is rounded up to nearest page.
92 * @param fExecutable Flag indicating whether it should be permitted to executed code in the memory object.
93 */
94RTR0DECL(int) RTR0MemObjAllocPage(PRTR0MEMOBJ pMemObj, size_t cb, bool fExecutable);
95
96/**
97 * Allocates page aligned virtual kernel memory with physical backing below 4GB.
98 *
99 * The physical memory backing the allocation is fixed.
100 *
101 * @returns IPRT status code.
102 * @param pMemObj Where to store the ring-0 memory object handle.
103 * @param cb Number of bytes to allocate. This is rounded up to nearest page.
104 * @param fExecutable Flag indicating whether it should be permitted to executed code in the memory object.
105 */
106RTR0DECL(int) RTR0MemObjAllocLow(PRTR0MEMOBJ pMemObj, size_t cb, bool fExecutable);
107
108/**
109 * Allocates page aligned virtual kernel memory with contiguous physical backing below 4GB.
110 *
111 * The physical memory backing the allocation is fixed.
112 *
113 * @returns IPRT status code.
114 * @param pMemObj Where to store the ring-0 memory object handle.
115 * @param cb Number of bytes to allocate. This is rounded up to nearest page.
116 * @param fExecutable Flag indicating whether it should be permitted to executed code in the memory object.
117 */
118RTR0DECL(int) RTR0MemObjAllocCont(PRTR0MEMOBJ pMemObj, size_t cb, bool fExecutable);
119
120/**
121 * Locks a range of user virtual memory.
122 *
123 * @returns IPRT status code.
124 * @param pMemObj Where to store the ring-0 memory object handle.
125 * @param pv User virtual address. This is rounded down to a page boundrary.
126 * @param cb Number of bytes to lock. This is rounded up to nearest page boundrary.
127 * @param R0Process The process to lock pages in. NIL_R0PROCESS is an alias for the current one.
128 *
129 * @remark RTR0MemObjGetAddress() will return the rounded down address.
130 */
131RTR0DECL(int) RTR0MemObjLockUser(PRTR0MEMOBJ pMemObj, void *pv, size_t cb, RTR0PROCESS R0Process);
132
133/**
134 * Locks a range of kernel virtual memory.
135 *
136 * @returns IPRT status code.
137 * @param pMemObj Where to store the ring-0 memory object handle.
138 * @param pv Kernel virtual address. This is rounded down to a page boundrary.
139 * @param cb Number of bytes to lock. This is rounded up to nearest page boundrary.
140 *
141 * @remark RTR0MemObjGetAddress() will return the rounded down address.
142 */
143RTR0DECL(int) RTR0MemObjLockKernel(PRTR0MEMOBJ pMemObj, void *pv, size_t cb);
144
145/**
146 * Allocates page aligned physical memory without (necessarily) any kernel mapping.
147 *
148 * @returns IPRT status code.
149 * @param pMemObj Where to store the ring-0 memory object handle.
150 * @param cb Number of bytes to allocate. This is rounded up to nearest page.
151 * @param PhysHighest The highest permittable address (inclusive).
152 * Pass NIL_RTHCPHYS if any address is acceptable.
153 */
154RTR0DECL(int) RTR0MemObjAllocPhys(PRTR0MEMOBJ pMemObj, size_t cb, RTHCPHYS PhysHighest);
155
156/**
157 * Creates a page aligned, contiguous, physical memory object.
158 *
159 * No physical memory is allocated, we trust you do know what you're doing.
160 *
161 * @returns IPRT status code.
162 * @param pMemObj Where to store the ring-0 memory object handle.
163 * @param Phys The physical address to start at. This is rounded down to the
164 * nearest page boundrary.
165 * @param cb The size of the object in bytes. This is rounded up to nearest page boundrary.
166 */
167RTR0DECL(int) RTR0MemObjEnterPhys(PRTR0MEMOBJ pMemObj, RTHCPHYS Phys, size_t cb);
168
169/**
170 * Reserves kernel virtual address space.
171 *
172 * @returns IPRT status code.
173 * @param pMemObj Where to store the ring-0 memory object handle.
174 * @param pvFixed Requested address. (void *)-1 means any address. This must match the alignment.
175 * @param cb The number of bytes to reserve. This is rounded up to nearest page.
176 * @param uAlignment The alignment of the reserved memory.
177 * Supported values are 0 (alias for PAGE_SIZE), PAGE_SIZE, _2M and _4M.
178 */
179RTR0DECL(int) RTR0MemObjReserveKernel(PRTR0MEMOBJ pMemObj, void *pvFixed, size_t cb, size_t uAlignment);
180
181/**
182 * Reserves user virtual address space in the current process.
183 *
184 * @returns IPRT status code.
185 * @param pMemObj Where to store the ring-0 memory object handle.
186 * @param pvFixed Requested address. (void *)-1 means any address. This must match the alignment.
187 * @param cb The number of bytes to reserve. This is rounded up to nearest PAGE_SIZE.
188 * @param uAlignment The alignment of the reserved memory.
189 * Supported values are 0 (alias for PAGE_SIZE), PAGE_SIZE, _2M and _4M.
190 * @param R0Process The process to reserve the memory in. NIL_R0PROCESS is an alias for the current one.
191 */
192RTR0DECL(int) RTR0MemObjReserveUser(PRTR0MEMOBJ pMemObj, void *pvFixed, size_t cb, size_t uAlignment, RTR0PROCESS R0Process);
193
194/**
195 * Maps a memory object into kernel virtual address space.
196 *
197 * @returns IPRT status code.
198 * @param pMemObj Where to store the ring-0 memory object handle of the mapping object.
199 * @param MemObjToMap The object to be map.
200 * @param pvFixed Requested address. (void *)-1 means any address. This must match the alignment.
201 * @param uAlignment The alignment of the reserved memory.
202 * Supported values are 0 (alias for PAGE_SIZE), PAGE_SIZE, _2M and _4M.
203 * @param fProt Combination of RTMEM_PROT_* flags (except RTMEM_PROT_NONE).
204 */
205RTR0DECL(int) RTR0MemObjMapKernel(PRTR0MEMOBJ pMemObj, RTR0MEMOBJ MemObjToMap, void *pvFixed, size_t uAlignment, unsigned fProt);
206
207/**
208 * Maps a memory object into user virtual address space in the current process.
209 *
210 * @returns IPRT status code.
211 * @param pMemObj Where to store the ring-0 memory object handle of the mapping object.
212 * @param MemObjToMap The object to be map.
213 * @param pvFixed Requested address. (void *)-1 means any address. This must match the alignment.
214 * @param uAlignment The alignment of the reserved memory.
215 * Supported values are 0 (alias for PAGE_SIZE), PAGE_SIZE, _2M and _4M.
216 * @param fProt Combination of RTMEM_PROT_* flags (except RTMEM_PROT_NONE).
217 * @param R0Process The process to map the memory into. NIL_R0PROCESS is an alias for the current one.
218 */
219RTR0DECL(int) RTR0MemObjMapUser(PRTR0MEMOBJ pMemObj, RTR0MEMOBJ MemObjToMap, void *pvFixed, size_t uAlignment, unsigned fProt, RTR0PROCESS R0Process);
220
221#endif /* IN_RING0 */
222
223/** @} */
224
225__END_DECLS
226
227#endif
228
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