]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Include/Library/MemoryAllocationLib.h
MdePkg: Add RETURN_ADDRESS macro into Base.h.
[mirror_edk2.git] / MdePkg / Include / Library / MemoryAllocationLib.h
1 /** @file
2 Provides services to allocate and free memory buffers of various memory types and alignments.
3
4 The Memory Allocation Library abstracts various common memory allocation operations. This library
5 allows code to be written in a phase-independent manner because the allocation of memory in PEI, DXE,
6 and SMM (for example) is done via a different mechanism. Using a common library interface makes it
7 much easier to port algorithms from phase to phase.
8
9 Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
10 This program and the accompanying materials
11 are licensed and made available under the terms and conditions of the BSD License
12 which accompanies this distribution. The full text of the license may be found at
13 http://opensource.org/licenses/bsd-license.php
14
15 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
16 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17
18 **/
19
20 #ifndef __MEMORY_ALLOCATION_LIB_H__
21 #define __MEMORY_ALLOCATION_LIB_H__
22
23 /**
24 Allocates one or more 4KB pages of type EfiBootServicesData.
25
26 Allocates the number of 4KB pages of type EfiBootServicesData and returns a pointer to the
27 allocated buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL
28 is returned. If there is not enough memory remaining to satisfy the request, then NULL is
29 returned.
30
31 @param Pages The number of 4 KB pages to allocate.
32
33 @return A pointer to the allocated buffer or NULL if allocation fails.
34
35 **/
36 VOID *
37 EFIAPI
38 AllocatePages (
39 IN UINTN Pages
40 );
41
42 /**
43 Allocates one or more 4KB pages of type EfiRuntimeServicesData.
44
45 Allocates the number of 4KB pages of type EfiRuntimeServicesData and returns a pointer to the
46 allocated buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL
47 is returned. If there is not enough memory remaining to satisfy the request, then NULL is
48 returned.
49
50 @param Pages The number of 4 KB pages to allocate.
51
52 @return A pointer to the allocated buffer or NULL if allocation fails.
53
54 **/
55 VOID *
56 EFIAPI
57 AllocateRuntimePages (
58 IN UINTN Pages
59 );
60
61 /**
62 Allocates one or more 4KB pages of type EfiReservedMemoryType.
63
64 Allocates the number of 4KB pages of type EfiReservedMemoryType and returns a pointer to the
65 allocated buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL
66 is returned. If there is not enough memory remaining to satisfy the request, then NULL is
67 returned.
68
69 @param Pages The number of 4 KB pages to allocate.
70
71 @return A pointer to the allocated buffer or NULL if allocation fails.
72
73 **/
74 VOID *
75 EFIAPI
76 AllocateReservedPages (
77 IN UINTN Pages
78 );
79
80 /**
81 Frees one or more 4KB pages that were previously allocated with one of the page allocation
82 functions in the Memory Allocation Library.
83
84 Frees the number of 4KB pages specified by Pages from the buffer specified by Buffer. Buffer
85 must have been allocated on a previous call to the page allocation services of the Memory
86 Allocation Library. If it is not possible to free allocated pages, then this function will
87 perform no actions.
88
89 If Buffer was not allocated with a page allocation function in the Memory Allocation Library,
90 then ASSERT().
91 If Pages is zero, then ASSERT().
92
93 @param Buffer Pointer to the buffer of pages to free.
94 @param Pages The number of 4 KB pages to free.
95
96 **/
97 VOID
98 EFIAPI
99 FreePages (
100 IN VOID *Buffer,
101 IN UINTN Pages
102 );
103
104 /**
105 Allocates one or more 4KB pages of type EfiBootServicesData at a specified alignment.
106
107 Allocates the number of 4KB pages specified by Pages of type EfiBootServicesData with an
108 alignment specified by Alignment. The allocated buffer is returned. If Pages is 0, then NULL is
109 returned. If there is not enough memory at the specified alignment remaining to satisfy the
110 request, then NULL is returned.
111
112 If Alignment is not a power of two and Alignment is not zero, then ASSERT().
113 If Pages plus EFI_SIZE_TO_PAGES (Alignment) overflows, then ASSERT().
114
115 @param Pages The number of 4 KB pages to allocate.
116 @param Alignment The requested alignment of the allocation. Must be a power of two.
117 If Alignment is zero, then byte alignment is used.
118
119 @return A pointer to the allocated buffer or NULL if allocation fails.
120
121 **/
122 VOID *
123 EFIAPI
124 AllocateAlignedPages (
125 IN UINTN Pages,
126 IN UINTN Alignment
127 );
128
129 /**
130 Allocates one or more 4KB pages of type EfiRuntimeServicesData at a specified alignment.
131
132 Allocates the number of 4KB pages specified by Pages of type EfiRuntimeServicesData with an
133 alignment specified by Alignment. The allocated buffer is returned. If Pages is 0, then NULL is
134 returned. If there is not enough memory at the specified alignment remaining to satisfy the
135 request, then NULL is returned.
136
137 If Alignment is not a power of two and Alignment is not zero, then ASSERT().
138 If Pages plus EFI_SIZE_TO_PAGES (Alignment) overflows, then ASSERT().
139
140 @param Pages The number of 4 KB pages to allocate.
141 @param Alignment The requested alignment of the allocation. Must be a power of two.
142 If Alignment is zero, then byte alignment is used.
143
144 @return A pointer to the allocated buffer or NULL if allocation fails.
145
146 **/
147 VOID *
148 EFIAPI
149 AllocateAlignedRuntimePages (
150 IN UINTN Pages,
151 IN UINTN Alignment
152 );
153
154 /**
155 Allocates one or more 4KB pages of type EfiReservedMemoryType at a specified alignment.
156
157 Allocates the number of 4KB pages specified by Pages of type EfiReservedMemoryType with an
158 alignment specified by Alignment. The allocated buffer is returned. If Pages is 0, then NULL is
159 returned. If there is not enough memory at the specified alignment remaining to satisfy the
160 request, then NULL is returned.
161
162 If Alignment is not a power of two and Alignment is not zero, then ASSERT().
163 If Pages plus EFI_SIZE_TO_PAGES (Alignment) overflows, then ASSERT().
164
165 @param Pages The number of 4 KB pages to allocate.
166 @param Alignment The requested alignment of the allocation. Must be a power of two.
167 If Alignment is zero, then byte alignment is used.
168
169 @return A pointer to the allocated buffer or NULL if allocation fails.
170
171 **/
172 VOID *
173 EFIAPI
174 AllocateAlignedReservedPages (
175 IN UINTN Pages,
176 IN UINTN Alignment
177 );
178
179 /**
180 Frees one or more 4KB pages that were previously allocated with one of the aligned page
181 allocation functions in the Memory Allocation Library.
182
183 Frees the number of 4KB pages specified by Pages from the buffer specified by Buffer. Buffer
184 must have been allocated on a previous call to the aligned page allocation services of the Memory
185 Allocation Library. If it is not possible to free allocated pages, then this function will
186 perform no actions.
187
188 If Buffer was not allocated with an aligned page allocation function in the Memory Allocation
189 Library, then ASSERT().
190 If Pages is zero, then ASSERT().
191
192 @param Buffer Pointer to the buffer of pages to free.
193 @param Pages The number of 4 KB pages to free.
194
195 **/
196 VOID
197 EFIAPI
198 FreeAlignedPages (
199 IN VOID *Buffer,
200 IN UINTN Pages
201 );
202
203 /**
204 Allocates a buffer of type EfiBootServicesData.
205
206 Allocates the number bytes specified by AllocationSize of type EfiBootServicesData and returns a
207 pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is
208 returned. If there is not enough memory remaining to satisfy the request, then NULL is returned.
209
210 @param AllocationSize The number of bytes to allocate.
211
212 @return A pointer to the allocated buffer or NULL if allocation fails.
213
214 **/
215 VOID *
216 EFIAPI
217 AllocatePool (
218 IN UINTN AllocationSize
219 );
220
221 /**
222 Allocates a buffer of type EfiRuntimeServicesData.
223
224 Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData and returns
225 a pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is
226 returned. If there is not enough memory remaining to satisfy the request, then NULL is returned.
227
228 @param AllocationSize The number of bytes to allocate.
229
230 @return A pointer to the allocated buffer or NULL if allocation fails.
231
232 **/
233 VOID *
234 EFIAPI
235 AllocateRuntimePool (
236 IN UINTN AllocationSize
237 );
238
239 /**
240 Allocates a buffer of type EfiReservedMemoryType.
241
242 Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType and returns
243 a pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is
244 returned. If there is not enough memory remaining to satisfy the request, then NULL is returned.
245
246 @param AllocationSize The number of bytes to allocate.
247
248 @return A pointer to the allocated buffer or NULL if allocation fails.
249
250 **/
251 VOID *
252 EFIAPI
253 AllocateReservedPool (
254 IN UINTN AllocationSize
255 );
256
257 /**
258 Allocates and zeros a buffer of type EfiBootServicesData.
259
260 Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, clears the
261 buffer with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a
262 valid buffer of 0 size is returned. If there is not enough memory remaining to satisfy the
263 request, then NULL is returned.
264
265 @param AllocationSize The number of bytes to allocate and zero.
266
267 @return A pointer to the allocated buffer or NULL if allocation fails.
268
269 **/
270 VOID *
271 EFIAPI
272 AllocateZeroPool (
273 IN UINTN AllocationSize
274 );
275
276 /**
277 Allocates and zeros a buffer of type EfiRuntimeServicesData.
278
279 Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData, clears the
280 buffer with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a
281 valid buffer of 0 size is returned. If there is not enough memory remaining to satisfy the
282 request, then NULL is returned.
283
284 @param AllocationSize The number of bytes to allocate and zero.
285
286 @return A pointer to the allocated buffer or NULL if allocation fails.
287
288 **/
289 VOID *
290 EFIAPI
291 AllocateRuntimeZeroPool (
292 IN UINTN AllocationSize
293 );
294
295 /**
296 Allocates and zeros a buffer of type EfiReservedMemoryType.
297
298 Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType, clears the
299 buffer with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a
300 valid buffer of 0 size is returned. If there is not enough memory remaining to satisfy the
301 request, then NULL is returned.
302
303 @param AllocationSize The number of bytes to allocate and zero.
304
305 @return A pointer to the allocated buffer or NULL if allocation fails.
306
307 **/
308 VOID *
309 EFIAPI
310 AllocateReservedZeroPool (
311 IN UINTN AllocationSize
312 );
313
314 /**
315 Copies a buffer to an allocated buffer of type EfiBootServicesData.
316
317 Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, copies
318 AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the
319 allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
320 is not enough memory remaining to satisfy the request, then NULL is returned.
321
322 If Buffer is NULL, then ASSERT().
323 If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
324
325 @param AllocationSize The number of bytes to allocate and zero.
326 @param Buffer The buffer to copy to the allocated buffer.
327
328 @return A pointer to the allocated buffer or NULL if allocation fails.
329
330 **/
331 VOID *
332 EFIAPI
333 AllocateCopyPool (
334 IN UINTN AllocationSize,
335 IN CONST VOID *Buffer
336 );
337
338 /**
339 Copies a buffer to an allocated buffer of type EfiRuntimeServicesData.
340
341 Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData, copies
342 AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the
343 allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
344 is not enough memory remaining to satisfy the request, then NULL is returned.
345
346 If Buffer is NULL, then ASSERT().
347 If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
348
349 @param AllocationSize The number of bytes to allocate and zero.
350 @param Buffer The buffer to copy to the allocated buffer.
351
352 @return A pointer to the allocated buffer or NULL if allocation fails.
353
354 **/
355 VOID *
356 EFIAPI
357 AllocateRuntimeCopyPool (
358 IN UINTN AllocationSize,
359 IN CONST VOID *Buffer
360 );
361
362 /**
363 Copies a buffer to an allocated buffer of type EfiReservedMemoryType.
364
365 Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType, copies
366 AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the
367 allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
368 is not enough memory remaining to satisfy the request, then NULL is returned.
369
370 If Buffer is NULL, then ASSERT().
371 If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
372
373 @param AllocationSize The number of bytes to allocate and zero.
374 @param Buffer The buffer to copy to the allocated buffer.
375
376 @return A pointer to the allocated buffer or NULL if allocation fails.
377
378 **/
379 VOID *
380 EFIAPI
381 AllocateReservedCopyPool (
382 IN UINTN AllocationSize,
383 IN CONST VOID *Buffer
384 );
385
386 /**
387 Reallocates a buffer of type EfiBootServicesData.
388
389 Allocates and zeros the number bytes specified by NewSize from memory of type
390 EfiBootServicesData. If OldBuffer is not NULL, then the smaller of OldSize and
391 NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
392 OldBuffer is freed. A pointer to the newly allocated buffer is returned.
393 If NewSize is 0, then a valid buffer of 0 size is returned. If there is not
394 enough memory remaining to satisfy the request, then NULL is returned.
395
396 If the allocation of the new buffer is successful and the smaller of NewSize and OldSize
397 is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT().
398
399 @param OldSize The size, in bytes, of OldBuffer.
400 @param NewSize The size, in bytes, of the buffer to reallocate.
401 @param OldBuffer The buffer to copy to the allocated buffer. This is an optional
402 parameter that may be NULL.
403
404 @return A pointer to the allocated buffer or NULL if allocation fails.
405
406 **/
407 VOID *
408 EFIAPI
409 ReallocatePool (
410 IN UINTN OldSize,
411 IN UINTN NewSize,
412 IN VOID *OldBuffer OPTIONAL
413 );
414
415 /**
416 Reallocates a buffer of type EfiRuntimeServicesData.
417
418 Allocates and zeros the number bytes specified by NewSize from memory of type
419 EfiRuntimeServicesData. If OldBuffer is not NULL, then the smaller of OldSize and
420 NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
421 OldBuffer is freed. A pointer to the newly allocated buffer is returned.
422 If NewSize is 0, then a valid buffer of 0 size is returned. If there is not
423 enough memory remaining to satisfy the request, then NULL is returned.
424
425 If the allocation of the new buffer is successful and the smaller of NewSize and OldSize
426 is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT().
427
428 @param OldSize The size, in bytes, of OldBuffer.
429 @param NewSize The size, in bytes, of the buffer to reallocate.
430 @param OldBuffer The buffer to copy to the allocated buffer. This is an optional
431 parameter that may be NULL.
432
433 @return A pointer to the allocated buffer or NULL if allocation fails.
434
435 **/
436 VOID *
437 EFIAPI
438 ReallocateRuntimePool (
439 IN UINTN OldSize,
440 IN UINTN NewSize,
441 IN VOID *OldBuffer OPTIONAL
442 );
443
444 /**
445 Reallocates a buffer of type EfiReservedMemoryType.
446
447 Allocates and zeros the number bytes specified by NewSize from memory of type
448 EfiReservedMemoryType. If OldBuffer is not NULL, then the smaller of OldSize and
449 NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
450 OldBuffer is freed. A pointer to the newly allocated buffer is returned.
451 If NewSize is 0, then a valid buffer of 0 size is returned. If there is not
452 enough memory remaining to satisfy the request, then NULL is returned.
453
454 If the allocation of the new buffer is successful and the smaller of NewSize and OldSize
455 is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT().
456
457 @param OldSize The size, in bytes, of OldBuffer.
458 @param NewSize The size, in bytes, of the buffer to reallocate.
459 @param OldBuffer The buffer to copy to the allocated buffer. This is an optional
460 parameter that may be NULL.
461
462 @return A pointer to the allocated buffer or NULL if allocation fails.
463
464 **/
465 VOID *
466 EFIAPI
467 ReallocateReservedPool (
468 IN UINTN OldSize,
469 IN UINTN NewSize,
470 IN VOID *OldBuffer OPTIONAL
471 );
472
473 /**
474 Frees a buffer that was previously allocated with one of the pool allocation functions in the
475 Memory Allocation Library.
476
477 Frees the buffer specified by Buffer. Buffer must have been allocated on a previous call to the
478 pool allocation services of the Memory Allocation Library. If it is not possible to free pool
479 resources, then this function will perform no actions.
480
481 If Buffer was not allocated with a pool allocation function in the Memory Allocation Library,
482 then ASSERT().
483
484 @param Buffer Pointer to the buffer to free.
485
486 **/
487 VOID
488 EFIAPI
489 FreePool (
490 IN VOID *Buffer
491 );
492
493 #endif