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