2 Support routines for memory allocation routines based
3 on boot services for Dxe phase drivers.
5 Copyright (c) 2006 - 2008, Intel Corporation<BR>
6 All rights reserved. This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
20 #include <Library/MemoryAllocationLib.h>
21 #include <Library/UefiBootServicesTableLib.h>
22 #include <Library/BaseMemoryLib.h>
23 #include <Library/DebugLib.h>
26 Allocates one or more 4KB pages of a certain memory type.
28 Allocates the number of 4KB pages of a certain memory type and returns a pointer to the allocated
29 buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL is returned.
30 If there is not enough memory remaining to satisfy the request, then NULL is returned.
32 @param MemoryType The type of memory to allocate.
33 @param Pages The number of 4 KB pages to allocate.
35 @return A pointer to the allocated buffer or NULL if allocation fails.
39 InternalAllocatePages (
40 IN EFI_MEMORY_TYPE MemoryType
,
45 EFI_PHYSICAL_ADDRESS Memory
;
51 Status
= gBS
->AllocatePages (AllocateAnyPages
, MemoryType
, Pages
, &Memory
);
52 if (EFI_ERROR (Status
)) {
55 return (VOID
*) (UINTN
) Memory
;
59 Allocates one or more 4KB pages of type EfiBootServicesData.
61 Allocates the number of 4KB pages of type EfiBootServicesData and returns a pointer to the
62 allocated buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL
63 is returned. If there is not enough memory remaining to satisfy the request, then NULL is
66 @param Pages The number of 4 KB pages to allocate.
68 @return A pointer to the allocated buffer or NULL if allocation fails.
77 return InternalAllocatePages (EfiBootServicesData
, Pages
);
81 Allocates one or more 4KB pages of type EfiRuntimeServicesData.
83 Allocates the number of 4KB pages of type EfiRuntimeServicesData and returns a pointer to the
84 allocated buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL
85 is returned. If there is not enough memory remaining to satisfy the request, then NULL is
88 @param Pages The number of 4 KB pages to allocate.
90 @return A pointer to the allocated buffer or NULL if allocation fails.
95 AllocateRuntimePages (
99 return InternalAllocatePages (EfiRuntimeServicesData
, Pages
);
103 Allocates one or more 4KB pages of type EfiReservedMemoryType.
105 Allocates the number of 4KB pages of type EfiReservedMemoryType and returns a pointer to the
106 allocated buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL
107 is returned. If there is not enough memory remaining to satisfy the request, then NULL is
110 @param Pages The number of 4 KB pages to allocate.
112 @return A pointer to the allocated buffer or NULL if allocation fails.
117 AllocateReservedPages (
121 return InternalAllocatePages (EfiReservedMemoryType
, Pages
);
125 Frees one or more 4KB pages that were previously allocated with one of the page allocation
126 functions in the Memory Allocation Library.
128 Frees the number of 4KB pages specified by Pages from the buffer specified by Buffer. Buffer
129 must have been allocated on a previous call to the page allocation services of the Memory
132 If Buffer was not allocated with a page allocation function in the Memory Allocation Library,
134 If Pages is zero, then ASSERT().
136 @param Buffer Pointer to the buffer of pages to free.
137 @param Pages The number of 4 KB pages to free.
150 Status
= gBS
->FreePages ((EFI_PHYSICAL_ADDRESS
) (UINTN
) Buffer
, Pages
);
151 ASSERT_EFI_ERROR (Status
);
155 Allocates one or more 4KB pages of a certain memory type at a specified alignment.
157 Allocates the number of 4KB pages specified by Pages of a certain memory type with an alignment
158 specified by Alignment. The allocated buffer is returned. If Pages is 0, then NULL is returned.
159 If there is not enough memory at the specified alignment remaining to satisfy the request, then
161 If Alignment is not a power of two and Alignment is not zero, then ASSERT().
163 @param MemoryType The type of memory to allocate.
164 @param Pages The number of 4 KB pages to allocate.
165 @param Alignment The requested alignment of the allocation. Must be a power of two.
166 If Alignment is zero, then byte alignment is used.
168 @return A pointer to the allocated buffer or NULL if allocation fails.
172 InternalAllocateAlignedPages (
173 IN EFI_MEMORY_TYPE MemoryType
,
179 EFI_PHYSICAL_ADDRESS Memory
;
182 UINTN UnalignedPages
;
186 // Alignment must be a power of two or zero.
188 ASSERT ((Alignment
& (Alignment
- 1)) == 0);
193 if (Alignment
> EFI_PAGE_SIZE
) {
195 // Caculate the total number of pages since alignment is larger than page size.
197 AlignmentMask
= Alignment
- 1;
198 RealPages
= Pages
+ EFI_SIZE_TO_PAGES (Alignment
);
200 // Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not overflow.
202 ASSERT (RealPages
> Pages
);
204 Status
= gBS
->AllocatePages (AllocateAnyPages
, MemoryType
, RealPages
, &Memory
);
205 if (EFI_ERROR (Status
)) {
208 AlignedMemory
= ((UINTN
) Memory
+ AlignmentMask
) & ~AlignmentMask
;
209 UnalignedPages
= EFI_SIZE_TO_PAGES (AlignedMemory
- (UINTN
) Memory
);
210 if (UnalignedPages
> 0) {
212 // Free first unaligned page(s).
214 Status
= gBS
->FreePages (Memory
, UnalignedPages
);
215 ASSERT_EFI_ERROR (Status
);
217 Memory
= (EFI_PHYSICAL_ADDRESS
) (AlignedMemory
+ EFI_PAGES_TO_SIZE (Pages
));
218 UnalignedPages
= RealPages
- Pages
- UnalignedPages
;
219 if (UnalignedPages
> 0) {
221 // Free last unaligned page(s).
223 Status
= gBS
->FreePages (Memory
, UnalignedPages
);
224 ASSERT_EFI_ERROR (Status
);
228 // Do not over-allocate pages in this case.
230 Status
= gBS
->AllocatePages (AllocateAnyPages
, MemoryType
, Pages
, &Memory
);
231 if (EFI_ERROR (Status
)) {
234 AlignedMemory
= (UINTN
) Memory
;
236 return (VOID
*) AlignedMemory
;
240 Allocates one or more 4KB pages of type EfiBootServicesData at a specified alignment.
242 Allocates the number of 4KB pages specified by Pages of type EfiBootServicesData with an
243 alignment specified by Alignment. The allocated buffer is returned. If Pages is 0, then NULL is
244 returned. If there is not enough memory at the specified alignment remaining to satisfy the
245 request, then NULL is returned.
247 If Alignment is not a power of two and Alignment is not zero, then ASSERT().
249 @param Pages The number of 4 KB pages to allocate.
250 @param Alignment The requested alignment of the allocation. Must be a power of two.
251 If Alignment is zero, then byte alignment is used.
253 @return A pointer to the allocated buffer or NULL if allocation fails.
258 AllocateAlignedPages (
263 return InternalAllocateAlignedPages (EfiBootServicesData
, Pages
, Alignment
);
267 Allocates one or more 4KB pages of type EfiRuntimeServicesData at a specified alignment.
269 Allocates the number of 4KB pages specified by Pages of type EfiRuntimeServicesData with an
270 alignment specified by Alignment. The allocated buffer is returned. If Pages is 0, then NULL is
271 returned. If there is not enough memory at the specified alignment remaining to satisfy the
272 request, then NULL is returned.
274 If Alignment is not a power of two and Alignment is not zero, then ASSERT().
276 @param Pages The number of 4 KB pages to allocate.
277 @param Alignment The requested alignment of the allocation. Must be a power of two.
278 If Alignment is zero, then byte alignment is used.
280 @return A pointer to the allocated buffer or NULL if allocation fails.
285 AllocateAlignedRuntimePages (
290 return InternalAllocateAlignedPages (EfiRuntimeServicesData
, Pages
, Alignment
);
294 Allocates one or more 4KB pages of type EfiReservedMemoryType at a specified alignment.
296 Allocates the number of 4KB pages specified by Pages of type EfiReservedMemoryType with an
297 alignment specified by Alignment. The allocated buffer is returned. If Pages is 0, then NULL is
298 returned. If there is not enough memory at the specified alignment remaining to satisfy the
299 request, then NULL is returned.
301 If Alignment is not a power of two and Alignment is not zero, then ASSERT().
303 @param Pages The number of 4 KB pages to allocate.
304 @param Alignment The requested alignment of the allocation. Must be a power of two.
305 If Alignment is zero, then byte alignment is used.
307 @return A pointer to the allocated buffer or NULL if allocation fails.
312 AllocateAlignedReservedPages (
317 return InternalAllocateAlignedPages (EfiReservedMemoryType
, Pages
, Alignment
);
321 Frees one or more 4KB pages that were previously allocated with one of the aligned page
322 allocation functions in the Memory Allocation Library.
324 Frees the number of 4KB pages specified by Pages from the buffer specified by Buffer. Buffer
325 must have been allocated on a previous call to the aligned page allocation services of the Memory
328 If Buffer was not allocated with an aligned page allocation function in the Memory Allocation
329 Library, then ASSERT().
330 If Pages is zero, then ASSERT().
332 @param Buffer Pointer to the buffer of pages to free.
333 @param Pages The number of 4 KB pages to free.
346 Status
= gBS
->FreePages ((EFI_PHYSICAL_ADDRESS
) (UINTN
) Buffer
, Pages
);
347 ASSERT_EFI_ERROR (Status
);
351 Allocates a buffer of a certain pool type.
353 Allocates the number bytes specified by AllocationSize of a certain pool type and returns a
354 pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is
355 returned. If there is not enough memory remaining to satisfy the request, then NULL is returned.
357 @param MemoryType The type of memory to allocate.
358 @param AllocationSize The number of bytes to allocate.
360 @return A pointer to the allocated buffer or NULL if allocation fails.
364 InternalAllocatePool (
365 IN EFI_MEMORY_TYPE MemoryType
,
366 IN UINTN AllocationSize
372 Status
= gBS
->AllocatePool (MemoryType
, AllocationSize
, &Memory
);
373 if (EFI_ERROR (Status
)) {
380 Allocates a buffer of type EfiBootServicesData.
382 Allocates the number bytes specified by AllocationSize of type EfiBootServicesData and returns a
383 pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is
384 returned. If there is not enough memory remaining to satisfy the request, then NULL is returned.
386 @param AllocationSize The number of bytes to allocate.
388 @return A pointer to the allocated buffer or NULL if allocation fails.
394 IN UINTN AllocationSize
397 return InternalAllocatePool (EfiBootServicesData
, AllocationSize
);
401 Allocates a buffer of type EfiRuntimeServicesData.
403 Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData and returns
404 a pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is
405 returned. If there is not enough memory remaining to satisfy the request, then NULL is returned.
407 @param AllocationSize The number of bytes to allocate.
409 @return A pointer to the allocated buffer or NULL if allocation fails.
414 AllocateRuntimePool (
415 IN UINTN AllocationSize
418 return InternalAllocatePool (EfiRuntimeServicesData
, AllocationSize
);
422 Allocates a buffer of type EfiReservedMemoryType.
424 Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType and returns
425 a pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is
426 returned. If there is not enough memory remaining to satisfy the request, then NULL is returned.
428 @param AllocationSize The number of bytes to allocate.
430 @return A pointer to the allocated buffer or NULL if allocation fails.
435 AllocateReservedPool (
436 IN UINTN AllocationSize
439 return InternalAllocatePool (EfiReservedMemoryType
, AllocationSize
);
443 Allocates and zeros a buffer of a certian pool type.
445 Allocates the number bytes specified by AllocationSize of a certian pool type, clears the buffer
446 with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a valid
447 buffer of 0 size is returned. If there is not enough memory remaining to satisfy the request,
448 then NULL is returned.
450 @param PoolType The type of memory to allocate.
451 @param AllocationSize The number of bytes to allocate and zero.
453 @return A pointer to the allocated buffer or NULL if allocation fails.
457 InternalAllocateZeroPool (
458 IN EFI_MEMORY_TYPE PoolType
,
459 IN UINTN AllocationSize
464 Memory
= InternalAllocatePool (PoolType
, AllocationSize
);
465 if (Memory
!= NULL
) {
466 Memory
= ZeroMem (Memory
, AllocationSize
);
472 Allocates and zeros a buffer of type EfiBootServicesData.
474 Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, clears the
475 buffer with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a
476 valid buffer of 0 size is returned. If there is not enough memory remaining to satisfy the
477 request, then NULL is returned.
479 @param AllocationSize The number of bytes to allocate and zero.
481 @return A pointer to the allocated buffer or NULL if allocation fails.
487 IN UINTN AllocationSize
490 return InternalAllocateZeroPool (EfiBootServicesData
, AllocationSize
);
494 Allocates and zeros a buffer of type EfiRuntimeServicesData.
496 Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData, clears the
497 buffer with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a
498 valid buffer of 0 size is returned. If there is not enough memory remaining to satisfy the
499 request, then NULL is returned.
501 @param AllocationSize The number of bytes to allocate and zero.
503 @return A pointer to the allocated buffer or NULL if allocation fails.
508 AllocateRuntimeZeroPool (
509 IN UINTN AllocationSize
512 return InternalAllocateZeroPool (EfiRuntimeServicesData
, AllocationSize
);
516 Allocates and zeros a buffer of type EfiReservedMemoryType.
518 Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType, clears the
519 buffer with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a
520 valid buffer of 0 size is returned. If there is not enough memory remaining to satisfy the
521 request, then NULL is returned.
523 @param AllocationSize The number of bytes to allocate and zero.
525 @return A pointer to the allocated buffer or NULL if allocation fails.
530 AllocateReservedZeroPool (
531 IN UINTN AllocationSize
534 return InternalAllocateZeroPool (EfiReservedMemoryType
, AllocationSize
);
538 Copies a buffer to an allocated buffer of a certian pool type.
540 Allocates the number bytes specified by AllocationSize of a certian pool type, copies
541 AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the
542 allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
543 is not enough memory remaining to satisfy the request, then NULL is returned.
544 If Buffer is NULL, then ASSERT().
545 If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
547 @param PoolType The type of pool to allocate.
548 @param AllocationSize The number of bytes to allocate and zero.
549 @param Buffer The buffer to copy to the allocated buffer.
551 @return A pointer to the allocated buffer or NULL if allocation fails.
555 InternalAllocateCopyPool (
556 IN EFI_MEMORY_TYPE PoolType
,
557 IN UINTN AllocationSize
,
558 IN CONST VOID
*Buffer
563 ASSERT (Buffer
!= NULL
);
564 ASSERT (AllocationSize
<= (MAX_ADDRESS
- (UINTN
) Buffer
+ 1));
566 Memory
= InternalAllocatePool (PoolType
, AllocationSize
);
567 if (Memory
!= NULL
) {
568 Memory
= CopyMem (Memory
, Buffer
, AllocationSize
);
574 Copies a buffer to an allocated buffer of type EfiBootServicesData.
576 Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, copies
577 AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the
578 allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
579 is not enough memory remaining to satisfy the request, then NULL is returned.
581 If Buffer is NULL, then ASSERT().
582 If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
584 @param AllocationSize The number of bytes to allocate and zero.
585 @param Buffer The buffer to copy to the allocated buffer.
587 @return A pointer to the allocated buffer or NULL if allocation fails.
593 IN UINTN AllocationSize
,
594 IN CONST VOID
*Buffer
597 return InternalAllocateCopyPool (EfiBootServicesData
, AllocationSize
, Buffer
);
601 Copies a buffer to an allocated buffer of type EfiRuntimeServicesData.
603 Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData, copies
604 AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the
605 allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
606 is not enough memory remaining to satisfy the request, then NULL is returned.
608 If Buffer is NULL, then ASSERT().
609 If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
611 @param AllocationSize The number of bytes to allocate and zero.
612 @param Buffer The buffer to copy to the allocated buffer.
614 @return A pointer to the allocated buffer or NULL if allocation fails.
619 AllocateRuntimeCopyPool (
620 IN UINTN AllocationSize
,
621 IN CONST VOID
*Buffer
624 return InternalAllocateCopyPool (EfiRuntimeServicesData
, AllocationSize
, Buffer
);
628 Copies a buffer to an allocated buffer of type EfiReservedMemoryType.
630 Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType, copies
631 AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the
632 allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
633 is not enough memory remaining to satisfy the request, then NULL is returned.
635 If Buffer is NULL, then ASSERT().
636 If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
638 @param AllocationSize The number of bytes to allocate and zero.
639 @param Buffer The buffer to copy to the allocated buffer.
641 @return A pointer to the allocated buffer or NULL if allocation fails.
646 AllocateReservedCopyPool (
647 IN UINTN AllocationSize
,
648 IN CONST VOID
*Buffer
651 return InternalAllocateCopyPool (EfiReservedMemoryType
, AllocationSize
, Buffer
);
655 Reallocates a buffer of a specified memory type.
657 Allocates and zeros the number bytes specified by NewSize from memory of the type
658 specified by PoolType. If OldBuffer is not NULL, then the smaller of OldSize and
659 NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
660 OldBuffer is freed. A pointer to the newly allocated buffer is returned.
661 If NewSize is 0, then a valid buffer of 0 size is returned. If there is not
662 enough memory remaining to satisfy the request, then NULL is returned.
664 If OldBuffer is NULL, then ASSERT().
665 If NewSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
666 If OldSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
668 @param PoolType The type of pool to allocate.
669 @param OldSize The size, in bytes, of OldBuffer.
670 @param NewSize The size, in bytes, of the buffer to reallocate.
671 @param OldBuffer The buffer to copy to the allocated buffer. This is an optional
672 parameter that may be NULL.
674 @return A pointer to the allocated buffer or NULL if allocation fails.
679 InternalReallocatePool (
680 IN EFI_MEMORY_TYPE PoolType
,
683 IN VOID
*OldBuffer OPTIONAL
688 NewBuffer
= AllocateZeroPool (NewSize
);
689 if (NewBuffer
!= NULL
&& OldBuffer
!= NULL
) {
690 CopyMem (NewBuffer
, OldBuffer
, MIN (OldSize
, NewSize
));
691 FreePool (OldBuffer
);
697 Reallocates a buffer of type EfiBootServicesData.
699 Allocates and zeros the number bytes specified by NewSize from memory of type
700 EfiBootServicesData. If OldBuffer is not NULL, then the smaller of OldSize and
701 NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
702 OldBuffer is freed. A pointer to the newly allocated buffer is returned.
703 If NewSize is 0, then a valid buffer of 0 size is returned. If there is not
704 enough memory remaining to satisfy the request, then NULL is returned.
706 If OldBuffer is NULL, then ASSERT().
707 If NewSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
708 If OldSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
710 @param OldSize The size, in bytes, of OldBuffer.
711 @param NewSize The size, in bytes, of the buffer to reallocate.
712 @param OldBuffer The buffer to copy to the allocated buffer. This is an optional
713 parameter that may be NULL.
715 @return A pointer to the allocated buffer or NULL if allocation fails.
723 IN VOID
*OldBuffer OPTIONAL
726 return InternalReallocatePool (EfiBootServicesData
, OldSize
, NewSize
, OldBuffer
);
730 Reallocates a buffer of type EfiRuntimeServicesData.
732 Allocates and zeros the number bytes specified by NewSize from memory of type
733 EfiRuntimeServicesData. If OldBuffer is not NULL, then the smaller of OldSize and
734 NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
735 OldBuffer is freed. A pointer to the newly allocated buffer is returned.
736 If NewSize is 0, then a valid buffer of 0 size is returned. If there is not
737 enough memory remaining to satisfy the request, then NULL is returned.
739 If OldBuffer is NULL, then ASSERT().
740 If NewSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
741 If OldSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
743 @param OldSize The size, in bytes, of OldBuffer.
744 @param NewSize The size, in bytes, of the buffer to reallocate.
745 @param OldBuffer The buffer to copy to the allocated buffer. This is an optional
746 parameter that may be NULL.
748 @return A pointer to the allocated buffer or NULL if allocation fails.
753 ReallocateRuntimePool (
756 IN VOID
*OldBuffer OPTIONAL
759 return InternalReallocatePool (EfiRuntimeServicesData
, OldSize
, NewSize
, OldBuffer
);
763 Reallocates a buffer of type EfiReservedMemoryType.
765 Allocates and zeros the number bytes specified by NewSize from memory of type
766 EfiReservedMemoryType. If OldBuffer is not NULL, then the smaller of OldSize and
767 NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
768 OldBuffer is freed. A pointer to the newly allocated buffer is returned.
769 If NewSize is 0, then a valid buffer of 0 size is returned. If there is not
770 enough memory remaining to satisfy the request, then NULL is returned.
772 If OldBuffer is NULL, then ASSERT().
773 If NewSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
774 If OldSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
776 @param OldSize The size, in bytes, of OldBuffer.
777 @param NewSize The size, in bytes, of the buffer to reallocate.
778 @param OldBuffer The buffer to copy to the allocated buffer. This is an optional
779 parameter that may be NULL.
781 @return A pointer to the allocated buffer or NULL if allocation fails.
786 ReallocateReservedPool (
789 IN VOID
*OldBuffer OPTIONAL
792 return InternalReallocatePool (EfiReservedMemoryType
, OldSize
, NewSize
, OldBuffer
);
796 Frees a buffer that was previously allocated with one of the pool allocation functions in the
797 Memory Allocation Library.
799 Frees the buffer specified by Buffer. Buffer must have been allocated on a previous call to the
800 pool allocation services of the Memory Allocation Library.
802 If Buffer was not allocated with a pool allocation function in the Memory Allocation Library,
805 @param Buffer Pointer to the buffer to free.
816 Status
= gBS
->FreePool (Buffer
);
817 ASSERT_EFI_ERROR (Status
);