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
494