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