MemoryAllocationLib.c revision 6e10b70a62dee17d7913b20f5323c1e75bd13417
1/** @file
2  Support routines for memory allocation routines
3  based on PeiService for PEI phase drivers.
4
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
10
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.
13
14**/
15
16
17#include <PiPei.h>
18
19
20#include <Library/MemoryAllocationLib.h>
21#include <Library/PeiServicesLib.h>
22#include <Library/BaseMemoryLib.h>
23#include <Library/DebugLib.h>
24
25
26/**
27  Allocates one or more 4KB pages of a certain memory type.
28
29  Allocates the number of 4KB pages of a certain memory type and returns a pointer to the allocated
30  buffer.  The buffer returned is aligned on a 4KB boundary.  If Pages is 0, then NULL is returned.
31  If there is not enough memory remaining to satisfy the request, then NULL is returned.
32
33  @param  MemoryType            The type of memory to allocate.
34  @param  Pages                 The number of 4 KB pages to allocate.
35
36  @return A pointer to the allocated buffer or NULL if allocation fails.
37
38**/
39VOID *
40InternalAllocatePages (
41  IN EFI_MEMORY_TYPE  MemoryType,
42  IN UINTN            Pages
43  )
44{
45  EFI_STATUS            Status;
46  EFI_PHYSICAL_ADDRESS  Memory;
47
48  if (Pages == 0) {
49    return NULL;
50  }
51
52  Status = PeiServicesAllocatePages (MemoryType, Pages, &Memory);
53  if (EFI_ERROR (Status)) {
54    return NULL;
55  }
56  return (VOID *) (UINTN) Memory;
57}
58
59/**
60  Allocates one or more 4KB pages of type EfiBootServicesData.
61
62  Allocates the number of 4KB pages of type EfiBootServicesData and returns a pointer to the
63  allocated buffer.  The buffer returned is aligned on a 4KB boundary.  If Pages is 0, then NULL
64  is returned.  If there is not enough memory remaining to satisfy the request, then NULL is
65  returned.
66
67  @param  Pages                 The number of 4 KB pages to allocate.
68
69  @return A pointer to the allocated buffer or NULL if allocation fails.
70
71**/
72VOID *
73EFIAPI
74AllocatePages (
75  IN UINTN  Pages
76  )
77{
78  return InternalAllocatePages (EfiBootServicesData, Pages);
79}
80
81/**
82  Allocates one or more 4KB pages of type EfiRuntimeServicesData.
83
84  Allocates the number of 4KB pages of type EfiRuntimeServicesData and returns a pointer to the
85  allocated buffer.  The buffer returned is aligned on a 4KB boundary.  If Pages is 0, then NULL
86  is returned.  If there is not enough memory remaining to satisfy the request, then NULL is
87  returned.
88
89  @param  Pages                 The number of 4 KB pages to allocate.
90
91  @return A pointer to the allocated buffer or NULL if allocation fails.
92
93**/
94VOID *
95EFIAPI
96AllocateRuntimePages (
97  IN UINTN  Pages
98  )
99{
100  return InternalAllocatePages (EfiRuntimeServicesData, Pages);
101}
102
103/**
104  Allocates one or more 4KB pages of type EfiReservedMemoryType.
105
106  Allocates the number of 4KB pages of type EfiReservedMemoryType and returns a pointer to the
107  allocated buffer.  The buffer returned is aligned on a 4KB boundary.  If Pages is 0, then NULL
108  is returned.  If there is not enough memory remaining to satisfy the request, then NULL is
109  returned.
110
111  @param  Pages                 The number of 4 KB pages to allocate.
112
113  @return A pointer to the allocated buffer or NULL if allocation fails.
114
115**/
116VOID *
117EFIAPI
118AllocateReservedPages (
119  IN UINTN  Pages
120  )
121{
122  return InternalAllocatePages (EfiReservedMemoryType, Pages);
123}
124
125/**
126  Frees one or more 4KB pages that were previously allocated with one of the page allocation
127  functions in the Memory Allocation Library.
128
129  Frees the number of 4KB pages specified by Pages from the buffer specified by Buffer.  Buffer
130  must have been allocated on a previous call to the page allocation services of the Memory
131  Allocation Library.  If it is not possible to free allocated pages, then this function will
132  peform no actions.
133
134  If Buffer was not allocated with a page allocation function in the Memory Allocation Library,
135  then ASSERT().
136  If Pages is zero, then ASSERT().
137
138  @param  Buffer                Pointer to the buffer of pages to free.
139  @param  Pages                 The number of 4 KB pages to free.
140
141**/
142VOID
143EFIAPI
144FreePages (
145  IN VOID   *Buffer,
146  IN UINTN  Pages
147  )
148{
149  ASSERT (Pages != 0);
150  //
151  // PEI phase does not support to free pages, so leave it as NOP.
152  //
153}
154
155/**
156  Allocates one or more 4KB pages of a certain memory type at a specified alignment.
157
158  Allocates the number of 4KB pages specified by Pages of a certain memory type with an alignment
159  specified by Alignment.  The allocated buffer is returned.  If Pages is 0, then NULL is returned.
160  If there is not enough memory at the specified alignment remaining to satisfy the request, then
161  NULL is returned.
162  If Alignment is not a power of two and Alignment is not zero, then ASSERT().
163
164  @param  MemoryType            The type of memory to allocate.
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**/
172VOID *
173InternalAllocateAlignedPages (
174  IN EFI_MEMORY_TYPE  MemoryType,
175  IN UINTN            Pages,
176  IN UINTN            Alignment
177  )
178{
179  VOID    *Memory;
180  UINTN   AlignmentMask;
181
182  //
183  // Alignment must be a power of two or zero.
184  //
185  ASSERT ((Alignment & (Alignment - 1)) == 0);
186
187  if (Pages == 0) {
188    return NULL;
189  }
190  //
191  // Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not overflow.
192  //
193  ASSERT (Pages <= (MAX_ADDRESS - EFI_SIZE_TO_PAGES (Alignment)));
194  //
195  // We would rather waste some memory to save PEI code size.
196  //
197  Memory = InternalAllocatePages (MemoryType, Pages + EFI_SIZE_TO_PAGES (Alignment));
198  if (Alignment == 0) {
199    AlignmentMask = Alignment;
200  } else {
201    AlignmentMask = Alignment - 1;
202  }
203  return (VOID *) (UINTN) (((UINTN) Memory + AlignmentMask) & ~AlignmentMask);
204}
205
206/**
207  Allocates one or more 4KB pages of type EfiBootServicesData at a specified alignment.
208
209  Allocates the number of 4KB pages specified by Pages of type EfiBootServicesData with an
210  alignment specified by Alignment.  The allocated buffer is returned.  If Pages is 0, then NULL is
211  returned.  If there is not enough memory at the specified alignment remaining to satisfy the
212  request, then NULL is returned.
213
214  If Alignment is not a power of two and Alignment is not zero, then ASSERT().
215
216  @param  Pages                 The number of 4 KB pages to allocate.
217  @param  Alignment             The requested alignment of the allocation.  Must be a power of two.
218                                If Alignment is zero, then byte alignment is used.
219
220  @return A pointer to the allocated buffer or NULL if allocation fails.
221
222**/
223VOID *
224EFIAPI
225AllocateAlignedPages (
226  IN UINTN  Pages,
227  IN UINTN  Alignment
228  )
229{
230  return InternalAllocateAlignedPages (EfiBootServicesData, Pages, Alignment);
231}
232
233/**
234  Allocates one or more 4KB pages of type EfiRuntimeServicesData at a specified alignment.
235
236  Allocates the number of 4KB pages specified by Pages of type EfiRuntimeServicesData with an
237  alignment specified by Alignment.  The allocated buffer is returned.  If Pages is 0, then NULL is
238  returned.  If there is not enough memory at the specified alignment remaining to satisfy the
239  request, then NULL is returned.
240
241  If Alignment is not a power of two and Alignment is not zero, then ASSERT().
242
243  @param  Pages                 The number of 4 KB pages to allocate.
244  @param  Alignment             The requested alignment of the allocation.  Must be a power of two.
245                                If Alignment is zero, then byte alignment is used.
246
247  @return A pointer to the allocated buffer or NULL if allocation fails.
248
249**/
250VOID *
251EFIAPI
252AllocateAlignedRuntimePages (
253  IN UINTN  Pages,
254  IN UINTN  Alignment
255  )
256{
257  return InternalAllocateAlignedPages (EfiRuntimeServicesData, Pages, Alignment);
258}
259
260/**
261  Allocates one or more 4KB pages of type EfiReservedMemoryType at a specified alignment.
262
263  Allocates the number of 4KB pages specified by Pages of type EfiReservedMemoryType with an
264  alignment specified by Alignment.  The allocated buffer is returned.  If Pages is 0, then NULL is
265  returned.  If there is not enough memory at the specified alignment remaining to satisfy the
266  request, then NULL is returned.
267
268  If Alignment is not a power of two and Alignment is not zero, then ASSERT().
269
270  @param  Pages                 The number of 4 KB pages to allocate.
271  @param  Alignment             The requested alignment of the allocation.  Must be a power of two.
272                                If Alignment is zero, then byte alignment is used.
273
274  @return A pointer to the allocated buffer or NULL if allocation fails.
275
276**/
277VOID *
278EFIAPI
279AllocateAlignedReservedPages (
280  IN UINTN  Pages,
281  IN UINTN  Alignment
282  )
283{
284  return InternalAllocateAlignedPages (EfiReservedMemoryType, Pages, Alignment);
285}
286
287/**
288  Frees one or more 4KB pages that were previously allocated with one of the aligned page
289  allocation functions in the Memory Allocation Library.
290
291  Frees the number of 4KB pages specified by Pages from the buffer specified by Buffer.  Buffer
292  must have been allocated on a previous call to the aligned page allocation services of the Memory
293  Allocation Library.  If it is not possible to free allocated pages, then this function will
294  peform no actions.
295
296  If Buffer was not allocated with an aligned page allocation function in the Memory Allocation
297  Library, then ASSERT().
298  If Pages is zero, then ASSERT().
299
300  @param  Buffer                Pointer to the buffer of pages to free.
301  @param  Pages                 The number of 4 KB pages to free.
302
303**/
304VOID
305EFIAPI
306FreeAlignedPages (
307  IN VOID   *Buffer,
308  IN UINTN  Pages
309  )
310{
311  ASSERT (Pages != 0);
312  //
313  // PEI phase does not support to free pages, so leave it as NOP.
314  //
315}
316
317/**
318  Allocates a buffer of a certain pool type.
319
320  Allocates the number bytes specified by AllocationSize of a certain pool type and returns a
321  pointer to the allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is
322  returned.  If there is not enough memory remaining to satisfy the request, then NULL is returned.
323
324  @param  MemoryType            The type of memory to allocate.
325  @param  AllocationSize        The number of bytes to allocate.
326
327  @return A pointer to the allocated buffer or NULL if allocation fails.
328
329**/
330VOID *
331InternalAllocatePool (
332  IN EFI_MEMORY_TYPE  MemoryType,
333  IN UINTN            AllocationSize
334  )
335{
336  //
337  // If we need lots of small runtime/reserved memory type from PEI in the future,
338  // we can consider providing a more complex algorithm that allocates runtime pages and
339  // provide pool allocations from those pages.
340  //
341  return InternalAllocatePages (MemoryType, EFI_SIZE_TO_PAGES (AllocationSize));
342}
343
344/**
345  Allocates a buffer of type EfiBootServicesData.
346
347  Allocates the number bytes specified by AllocationSize of type EfiBootServicesData and returns a
348  pointer to the allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is
349  returned.  If there is not enough memory remaining to satisfy the request, then NULL is returned.
350
351  @param  AllocationSize        The number of bytes to allocate.
352
353  @return A pointer to the allocated buffer or NULL if allocation fails.
354
355**/
356VOID *
357EFIAPI
358AllocatePool (
359  IN UINTN  AllocationSize
360  )
361{
362  EFI_STATUS        Status;
363  VOID              *Buffer;
364
365  Status = PeiServicesAllocatePool (AllocationSize, &Buffer);
366  if (EFI_ERROR (Status)) {
367    Buffer = NULL;
368  }
369  return Buffer;
370}
371
372/**
373  Allocates a buffer of type EfiRuntimeServicesData.
374
375  Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData and returns
376  a pointer to the allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is
377  returned.  If there is not enough memory remaining to satisfy the request, then NULL is returned.
378
379  @param  AllocationSize        The number of bytes to allocate.
380
381  @return A pointer to the allocated buffer or NULL if allocation fails.
382
383**/
384VOID *
385EFIAPI
386AllocateRuntimePool (
387  IN UINTN  AllocationSize
388  )
389{
390  return InternalAllocatePool (EfiRuntimeServicesData, AllocationSize);
391}
392
393/**
394  Allocates a buffer of type EfiReservedMemoryType.
395
396  Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType and returns
397  a pointer to the allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is
398  returned.  If there is not enough memory remaining to satisfy the request, then NULL is returned.
399
400  @param  AllocationSize        The number of bytes to allocate.
401
402  @return A pointer to the allocated buffer or NULL if allocation fails.
403
404**/
405VOID *
406EFIAPI
407AllocateReservedPool (
408  IN UINTN  AllocationSize
409  )
410{
411  return InternalAllocatePool (EfiReservedMemoryType, AllocationSize);
412}
413
414/**
415  Allocates and zeros a buffer of a certian pool type.
416
417  Allocates the number bytes specified by AllocationSize of a certian pool type, clears the buffer
418  with zeros, and returns a pointer to the allocated buffer.  If AllocationSize is 0, then a valid
419  buffer of 0 size is returned.  If there is not enough memory remaining to satisfy the request,
420  then NULL is returned.
421
422  @param  PoolType              The type of memory to allocate.
423  @param  AllocationSize        The number of bytes to allocate and zero.
424
425  @return A pointer to the allocated buffer or NULL if allocation fails.
426
427**/
428VOID *
429InternalAllocateZeroPool (
430  IN EFI_MEMORY_TYPE  PoolType,
431  IN UINTN            AllocationSize
432  )
433{
434  VOID  *Memory;
435
436  Memory = InternalAllocatePool (PoolType, AllocationSize);
437  if (Memory != NULL) {
438    Memory = ZeroMem (Memory, AllocationSize);
439  }
440  return Memory;
441}
442
443/**
444  Allocates and zeros a buffer of type EfiBootServicesData.
445
446  Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, clears the
447  buffer with zeros, and returns a pointer to the allocated buffer.  If AllocationSize is 0, then a
448  valid buffer of 0 size is returned.  If there is not enough memory remaining to satisfy the
449  request, then NULL is returned.
450
451  @param  AllocationSize        The number of bytes to allocate and zero.
452
453  @return A pointer to the allocated buffer or NULL if allocation fails.
454
455**/
456VOID *
457EFIAPI
458AllocateZeroPool (
459  IN UINTN  AllocationSize
460  )
461{
462  VOID  *Memory;
463
464  Memory = AllocatePool (AllocationSize);
465  if (Memory != NULL) {
466    Memory = ZeroMem (Memory, AllocationSize);
467  }
468  return Memory;
469}
470
471/**
472  Allocates and zeros a buffer of type EfiRuntimeServicesData.
473
474  Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData, 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.
478
479  @param  AllocationSize        The number of bytes to allocate and zero.
480
481  @return A pointer to the allocated buffer or NULL if allocation fails.
482
483**/
484VOID *
485EFIAPI
486AllocateRuntimeZeroPool (
487  IN UINTN  AllocationSize
488  )
489{
490  return InternalAllocateZeroPool (EfiRuntimeServicesData, AllocationSize);
491}
492
493/**
494  Allocates and zeros a buffer of type EfiReservedMemoryType.
495
496  Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType, 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.
500
501  @param  AllocationSize        The number of bytes to allocate and zero.
502
503  @return A pointer to the allocated buffer or NULL if allocation fails.
504
505**/
506VOID *
507EFIAPI
508AllocateReservedZeroPool (
509  IN UINTN  AllocationSize
510  )
511{
512  return InternalAllocateZeroPool (EfiReservedMemoryType, AllocationSize);
513}
514
515/**
516  Copies a buffer to an allocated buffer of a certian pool type.
517
518  Allocates the number bytes specified by AllocationSize of a certian pool type, copies
519  AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the
520  allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is returned.  If there
521  is not enough memory remaining to satisfy the request, then NULL is returned.
522  If Buffer is NULL, then ASSERT().
523  If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
524
525  @param  PoolType              The type of pool to allocate.
526  @param  AllocationSize        The number of bytes to allocate and zero.
527  @param  Buffer                The buffer to copy to the allocated buffer.
528
529  @return A pointer to the allocated buffer or NULL if allocation fails.
530
531**/
532VOID *
533InternalAllocateCopyPool (
534  IN EFI_MEMORY_TYPE  PoolType,
535  IN UINTN            AllocationSize,
536  IN CONST VOID       *Buffer
537  )
538{
539  VOID  *Memory;
540
541  ASSERT (Buffer != NULL);
542  ASSERT (AllocationSize <= (MAX_ADDRESS - (UINTN) Buffer + 1));
543
544  Memory = InternalAllocatePool (PoolType, AllocationSize);
545  if (Memory != NULL) {
546     Memory = CopyMem (Memory, Buffer, AllocationSize);
547  }
548  return Memory;
549}
550
551/**
552  Copies a buffer to an allocated buffer of type EfiBootServicesData.
553
554  Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, copies
555  AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the
556  allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is returned.  If there
557  is not enough memory remaining to satisfy the request, then NULL is returned.
558
559  If Buffer is NULL, then ASSERT().
560  If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
561
562  @param  AllocationSize        The number of bytes to allocate and zero.
563  @param  Buffer                The buffer to copy to the allocated buffer.
564
565  @return A pointer to the allocated buffer or NULL if allocation fails.
566
567**/
568VOID *
569EFIAPI
570AllocateCopyPool (
571  IN UINTN       AllocationSize,
572  IN CONST VOID  *Buffer
573  )
574{
575  VOID  *Memory;
576
577  ASSERT (Buffer != NULL);
578  ASSERT (AllocationSize <= (MAX_ADDRESS - (UINTN) Buffer + 1));
579
580  Memory = AllocatePool (AllocationSize);
581  if (Memory != NULL) {
582     Memory = CopyMem (Memory, Buffer, AllocationSize);
583  }
584  return Memory;
585}
586
587/**
588  Copies a buffer to an allocated buffer of type EfiRuntimeServicesData.
589
590  Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData, copies
591  AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the
592  allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is returned.  If there
593  is not enough memory remaining to satisfy the request, then NULL is returned.
594
595  If Buffer is NULL, then ASSERT().
596  If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
597
598  @param  AllocationSize        The number of bytes to allocate and zero.
599  @param  Buffer                The buffer to copy to the allocated buffer.
600
601  @return A pointer to the allocated buffer or NULL if allocation fails.
602
603**/
604VOID *
605EFIAPI
606AllocateRuntimeCopyPool (
607  IN UINTN       AllocationSize,
608  IN CONST VOID  *Buffer
609  )
610{
611  return InternalAllocateCopyPool (EfiRuntimeServicesData, AllocationSize, Buffer);
612}
613
614/**
615  Copies a buffer to an allocated buffer of type EfiReservedMemoryType.
616
617  Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType, copies
618  AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the
619  allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is returned.  If there
620  is not enough memory remaining to satisfy the request, then NULL is returned.
621
622  If Buffer is NULL, then ASSERT().
623  If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
624
625  @param  AllocationSize        The number of bytes to allocate and zero.
626  @param  Buffer                The buffer to copy to the allocated buffer.
627
628  @return A pointer to the allocated buffer or NULL if allocation fails.
629
630**/
631VOID *
632EFIAPI
633AllocateReservedCopyPool (
634  IN UINTN       AllocationSize,
635  IN CONST VOID  *Buffer
636  )
637{
638  return InternalAllocateCopyPool (EfiReservedMemoryType, AllocationSize, Buffer);
639}
640
641/**
642  Reallocates a buffer of a specified memory type.
643
644  Allocates and zeros the number bytes specified by NewSize from memory of the type
645  specified by PoolType.  If OldBuffer is not NULL, then the smaller of OldSize and
646  NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
647  OldBuffer is freed.  A pointer to the newly allocated buffer is returned.
648  If NewSize is 0, then a valid buffer of 0 size is  returned.  If there is not
649  enough memory remaining to satisfy the request, then NULL is returned.
650
651  If the smaller of NewSize and OldSize is greater than (MAX_ADDRESS - OldBuffer + 1),
652  then ASSERT().
653
654  @param  PoolType       The type of pool to allocate.
655  @param  OldSize        The size, in bytes, of OldBuffer.
656  @param  NewSize        The size, in bytes, of the buffer to reallocate.
657  @param  OldBuffer      The buffer to copy to the allocated buffer.  This is an optional
658                         parameter that may be NULL.
659
660  @return A pointer to the allocated buffer or NULL if allocation fails.
661
662**/
663VOID *
664InternalReallocatePool (
665  IN EFI_MEMORY_TYPE  PoolType,
666  IN UINTN            OldSize,
667  IN UINTN            NewSize,
668  IN VOID             *OldBuffer  OPTIONAL
669  )
670{
671  VOID  *NewBuffer;
672
673  NewBuffer = InternalAllocateZeroPool (PoolType, NewSize);
674  if (NewBuffer != NULL && OldBuffer != NULL) {
675    CopyMem (NewBuffer, OldBuffer, MIN (OldSize, NewSize));
676    FreePool (OldBuffer);
677  }
678  return NewBuffer;
679}
680
681/**
682  Reallocates a buffer of type EfiBootServicesData.
683
684  Allocates and zeros the number bytes specified by NewSize from memory of type
685  EfiBootServicesData.  If OldBuffer is not NULL, then the smaller of OldSize and
686  NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
687  OldBuffer is freed.  A pointer to the newly allocated buffer is returned.
688  If NewSize is 0, then a valid buffer of 0 size is  returned.  If there is not
689  enough memory remaining to satisfy the request, then NULL is returned.
690
691  If the smaller of NewSize and OldSize is greater than (MAX_ADDRESS - OldBuffer + 1),
692  then ASSERT().
693
694  @param  OldSize        The size, in bytes, of OldBuffer.
695  @param  NewSize        The size, in bytes, of the buffer to reallocate.
696  @param  OldBuffer      The buffer to copy to the allocated buffer.  This is an optional
697                         parameter that may be NULL.
698
699  @return A pointer to the allocated buffer or NULL if allocation fails.
700
701**/
702VOID *
703EFIAPI
704ReallocatePool (
705  IN UINTN  OldSize,
706  IN UINTN  NewSize,
707  IN VOID   *OldBuffer  OPTIONAL
708  )
709{
710  return InternalReallocatePool (EfiBootServicesData, OldSize, NewSize, OldBuffer);
711}
712
713/**
714  Reallocates a buffer of type EfiRuntimeServicesData.
715
716  Allocates and zeros the number bytes specified by NewSize from memory of type
717  EfiRuntimeServicesData.  If OldBuffer is not NULL, then the smaller of OldSize and
718  NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
719  OldBuffer is freed.  A pointer to the newly allocated buffer is returned.
720  If NewSize is 0, then a valid buffer of 0 size is  returned.  If there is not
721  enough memory remaining to satisfy the request, then NULL is returned.
722
723  If the smaller of NewSize and OldSize is greater than (MAX_ADDRESS - OldBuffer + 1),
724  then ASSERT().
725
726  @param  OldSize        The size, in bytes, of OldBuffer.
727  @param  NewSize        The size, in bytes, of the buffer to reallocate.
728  @param  OldBuffer      The buffer to copy to the allocated buffer.  This is an optional
729                         parameter that may be NULL.
730
731  @return A pointer to the allocated buffer or NULL if allocation fails.
732
733**/
734VOID *
735EFIAPI
736ReallocateRuntimePool (
737  IN UINTN  OldSize,
738  IN UINTN  NewSize,
739  IN VOID   *OldBuffer  OPTIONAL
740  )
741{
742  return InternalReallocatePool (EfiRuntimeServicesData, OldSize, NewSize, OldBuffer);
743}
744
745/**
746  Reallocates a buffer of type EfiReservedMemoryType.
747
748  Allocates and zeros the number bytes specified by NewSize from memory of type
749  EfiReservedMemoryType.  If OldBuffer is not NULL, then the smaller of OldSize and
750  NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
751  OldBuffer is freed.  A pointer to the newly allocated buffer is returned.
752  If NewSize is 0, then a valid buffer of 0 size is  returned.  If there is not
753  enough memory remaining to satisfy the request, then NULL is returned.
754
755  If the smaller of NewSize and OldSize is greater than (MAX_ADDRESS - OldBuffer + 1),
756  then ASSERT().
757
758  @param  OldSize        The size, in bytes, of OldBuffer.
759  @param  NewSize        The size, in bytes, of the buffer to reallocate.
760  @param  OldBuffer      The buffer to copy to the allocated buffer.  This is an optional
761                         parameter that may be NULL.
762
763  @return A pointer to the allocated buffer or NULL if allocation fails.
764
765**/
766VOID *
767EFIAPI
768ReallocateReservedPool (
769  IN UINTN  OldSize,
770  IN UINTN  NewSize,
771  IN VOID   *OldBuffer  OPTIONAL
772  )
773{
774  return InternalReallocatePool (EfiReservedMemoryType, OldSize, NewSize, OldBuffer);
775}
776
777/**
778  Frees a buffer that was previously allocated with one of the pool allocation functions in the
779  Memory Allocation Library.
780
781  Frees the buffer specified by Buffer.  Buffer must have been allocated on a previous call to the
782  pool allocation services of the Memory Allocation Library.  If it is not possible to free pool
783  resources, then this function will peform no actions.
784
785  If Buffer was not allocated with a pool allocation function in the Memory Allocation Library,
786  then ASSERT().
787
788  @param  Buffer                Pointer to the buffer to free.
789
790**/
791VOID
792EFIAPI
793FreePool (
794  IN VOID   *Buffer
795  )
796{
797  //
798  // PEI phase does not support to free pool, so leave it as NOP.
799  //
800}
801
802
803