Home | History | Annotate | Download | only in Library
      1 /** @file
      2 
      3   Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
      4 
      5   This program and the accompanying materials
      6   are licensed and made available under the terms and conditions of the BSD License
      7   which accompanies this distribution.  The full text of the license may be found at
      8   http://opensource.org/licenses/bsd-license.php
      9 
     10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #ifndef __UNCACHED_MEMORY_ALLOCATION_LIB_H__
     16 #define __UNCACHED_MEMORY_ALLOCATION_LIB_H__
     17 
     18 /**
     19   Converts a cached or uncached address to a physical address suitable for use in SoC registers.
     20 
     21   @param  VirtualAddress                 The pointer to convert.
     22 
     23   @return The physical address of the supplied virtual pointer.
     24 
     25 **/
     26 EFI_PHYSICAL_ADDRESS
     27 ConvertToPhysicalAddress (
     28   IN VOID *VirtualAddress
     29   );
     30 
     31 /**
     32   Converts a cached or uncached address to a cached address.
     33 
     34   @param  Address                 The pointer to convert.
     35 
     36   @return The address of the cached memory location corresponding to the input address.
     37 
     38 **/
     39 VOID *
     40 ConvertToCachedAddress (
     41   IN VOID *Address
     42   );
     43 
     44 /**
     45   Converts a cached or uncached address to an uncached address.
     46 
     47   @param  Address                 The pointer to convert.
     48 
     49   @return The address of the uncached memory location corresponding to the input address.
     50 
     51 **/
     52 VOID *
     53 ConvertToUncachedAddress (
     54   IN VOID *Address
     55   );
     56 
     57 /**
     58   Allocates one or more 4KB pages of type EfiBootServicesData.
     59 
     60   Allocates the number of 4KB pages of type EfiBootServicesData and returns a pointer to the
     61   allocated buffer.  The buffer returned is aligned on a 4KB boundary.  If Pages is 0, then NULL
     62   is returned.  If there is not enough memory remaining to satisfy the request, then NULL is
     63   returned.
     64 
     65   @param  Pages                 The number of 4 KB pages to allocate.
     66 
     67   @return A pointer to the allocated buffer or NULL if allocation fails.
     68 
     69 **/
     70 VOID *
     71 EFIAPI
     72 UncachedAllocatePages (
     73   IN UINTN  Pages
     74   );
     75 
     76 /**
     77   Allocates one or more 4KB pages of type EfiRuntimeServicesData.
     78 
     79   Allocates the number of 4KB pages of type EfiRuntimeServicesData and returns a pointer to the
     80   allocated buffer.  The buffer returned is aligned on a 4KB boundary.  If Pages is 0, then NULL
     81   is returned.  If there is not enough memory remaining to satisfy the request, then NULL is
     82   returned.
     83 
     84   @param  Pages                 The number of 4 KB pages to allocate.
     85 
     86   @return A pointer to the allocated buffer or NULL if allocation fails.
     87 
     88 **/
     89 VOID *
     90 EFIAPI
     91 UncachedAllocateRuntimePages (
     92   IN UINTN  Pages
     93   );
     94 
     95 /**
     96   Allocates one or more 4KB pages of type EfiReservedMemoryType.
     97 
     98   Allocates the number of 4KB pages of type EfiReservedMemoryType and returns a pointer to the
     99   allocated buffer.  The buffer returned is aligned on a 4KB boundary.  If Pages is 0, then NULL
    100   is returned.  If there is not enough memory remaining to satisfy the request, then NULL is
    101   returned.
    102 
    103   @param  Pages                 The number of 4 KB pages to allocate.
    104 
    105   @return A pointer to the allocated buffer or NULL if allocation fails.
    106 
    107 **/
    108 VOID *
    109 EFIAPI
    110 UncachedAllocateReservedPages (
    111   IN UINTN  Pages
    112   );
    113 
    114 /**
    115   Frees one or more 4KB pages that were previously allocated with one of the page allocation
    116   functions in the Memory Allocation Library.
    117 
    118   Frees the number of 4KB pages specified by Pages from the buffer specified by Buffer.  Buffer
    119   must have been allocated on a previous call to the page allocation services of the Memory
    120   Allocation Library.
    121   If Buffer was not allocated with a page allocation function in the Memory Allocation Library,
    122   then ASSERT().
    123   If Pages is zero, then ASSERT().
    124 
    125   @param  Buffer                Pointer to the buffer of pages to free.
    126   @param  Pages                 The number of 4 KB pages to free.
    127 
    128 **/
    129 VOID
    130 EFIAPI
    131 UncachedFreePages (
    132   IN VOID   *Buffer,
    133   IN UINTN  Pages
    134   );
    135 
    136 /**
    137   Allocates one or more 4KB pages of type EfiBootServicesData at a specified alignment.
    138 
    139   Allocates the number of 4KB pages specified by Pages of type EfiBootServicesData with an
    140   alignment specified by Alignment.  The allocated buffer is returned.  If Pages is 0, then NULL is
    141   returned.  If there is not enough memory at the specified alignment remaining to satisfy the
    142   request, then NULL is returned.
    143   If Alignment is not a power of two and Alignment is not zero, then ASSERT().
    144 
    145   @param  Pages                 The number of 4 KB pages to allocate.
    146   @param  Alignment             The requested alignment of the allocation.  Must be a power of two.
    147                                 If Alignment is zero, then byte alignment is used.
    148 
    149   @return A pointer to the allocated buffer or NULL if allocation fails.
    150 
    151 **/
    152 VOID *
    153 EFIAPI
    154 UncachedAllocateAlignedPages (
    155   IN UINTN  Pages,
    156   IN UINTN  Alignment
    157   );
    158 
    159 /**
    160   Allocates one or more 4KB pages of type EfiRuntimeServicesData at a specified alignment.
    161 
    162   Allocates the number of 4KB pages specified by Pages of type EfiRuntimeServicesData with an
    163   alignment specified by Alignment.  The allocated buffer is returned.  If Pages is 0, then NULL is
    164   returned.  If there is not enough memory at the specified alignment remaining to satisfy the
    165   request, then NULL is returned.
    166   If Alignment is not a power of two and Alignment is not zero, then ASSERT().
    167 
    168   @param  Pages                 The number of 4 KB pages to allocate.
    169   @param  Alignment             The requested alignment of the allocation.  Must be a power of two.
    170                                 If Alignment is zero, then byte alignment is used.
    171 
    172   @return A pointer to the allocated buffer or NULL if allocation fails.
    173 
    174 **/
    175 VOID *
    176 EFIAPI
    177 UncachedAllocateAlignedRuntimePages (
    178   IN UINTN  Pages,
    179   IN UINTN  Alignment
    180   );
    181 
    182 /**
    183   Allocates one or more 4KB pages of type EfiReservedMemoryType at a specified alignment.
    184 
    185   Allocates the number of 4KB pages specified by Pages of type EfiReservedMemoryType with an
    186   alignment specified by Alignment.  The allocated buffer is returned.  If Pages is 0, then NULL is
    187   returned.  If there is not enough memory at the specified alignment remaining to satisfy the
    188   request, then NULL is returned.
    189   If Alignment is not a power of two and Alignment is not zero, then ASSERT().
    190 
    191   @param  Pages                 The number of 4 KB pages to allocate.
    192   @param  Alignment             The requested alignment of the allocation.  Must be a power of two.
    193                                 If Alignment is zero, then byte alignment is used.
    194 
    195   @return A pointer to the allocated buffer or NULL if allocation fails.
    196 
    197 **/
    198 VOID *
    199 EFIAPI
    200 UncachedAllocateAlignedReservedPages (
    201   IN UINTN  Pages,
    202   IN UINTN  Alignment
    203   );
    204 
    205 /**
    206   Frees one or more 4KB pages that were previously allocated with one of the aligned page
    207   allocation functions in the Memory Allocation Library.
    208 
    209   Frees the number of 4KB pages specified by Pages from the buffer specified by Buffer.  Buffer
    210   must have been allocated on a previous call to the aligned page allocation services of the Memory
    211   Allocation Library.
    212   If Buffer was not allocated with an aligned page allocation function in the Memory Allocation
    213   Library, then ASSERT().
    214   If Pages is zero, then ASSERT().
    215 
    216   @param  Buffer                Pointer to the buffer of pages to free.
    217   @param  Pages                 The number of 4 KB pages to free.
    218 
    219 **/
    220 VOID
    221 EFIAPI
    222 UncachedFreeAlignedPages (
    223   IN VOID   *Buffer,
    224   IN UINTN  Pages
    225   );
    226 
    227 /**
    228   Allocates a buffer of type EfiBootServicesData.
    229 
    230   Allocates the number bytes specified by AllocationSize of type EfiBootServicesData and returns a
    231   pointer to the allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is
    232   returned.  If there is not enough memory remaining to satisfy the request, then NULL is returned.
    233 
    234   @param  AllocationSize        The number of bytes to allocate.
    235 
    236   @return A pointer to the allocated buffer or NULL if allocation fails.
    237 
    238 **/
    239 VOID *
    240 EFIAPI
    241 UncachedAllocatePool (
    242   IN UINTN  AllocationSize
    243   );
    244 
    245 /**
    246   Allocates a buffer of type EfiRuntimeServicesData.
    247 
    248   Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData and returns
    249   a pointer to the allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is
    250   returned.  If there is not enough memory remaining to satisfy the request, then NULL is returned.
    251 
    252   @param  AllocationSize        The number of bytes to allocate.
    253 
    254   @return A pointer to the allocated buffer or NULL if allocation fails.
    255 
    256 **/
    257 VOID *
    258 EFIAPI
    259 UncachedAllocateRuntimePool (
    260   IN UINTN  AllocationSize
    261   );
    262 
    263 /**
    264   Allocates a buffer of type EfieservedMemoryType.
    265 
    266   Allocates the number bytes specified by AllocationSize of type EfieservedMemoryType and returns
    267   a pointer to the allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is
    268   returned.  If there is not enough memory remaining to satisfy the request, then NULL is returned.
    269 
    270   @param  AllocationSize        The number of bytes to allocate.
    271 
    272   @return A pointer to the allocated buffer or NULL if allocation fails.
    273 
    274 **/
    275 VOID *
    276 EFIAPI
    277 UncachedAllocateReservedPool (
    278   IN UINTN  AllocationSize
    279   );
    280 
    281 /**
    282   Allocates and zeros a buffer of type EfiBootServicesData.
    283 
    284   Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, clears the
    285   buffer with zeros, and returns a pointer to the allocated buffer.  If AllocationSize is 0, then a
    286   valid buffer of 0 size is returned.  If there is not enough memory remaining to satisfy the
    287   request, then NULL is returned.
    288 
    289   @param  AllocationSize        The number of bytes to allocate and zero.
    290 
    291   @return A pointer to the allocated buffer or NULL if allocation fails.
    292 
    293 **/
    294 VOID *
    295 EFIAPI
    296 UncachedAllocateZeroPool (
    297   IN UINTN  AllocationSize
    298   );
    299 
    300 /**
    301   Allocates and zeros a buffer of type EfiRuntimeServicesData.
    302 
    303   Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData, clears the
    304   buffer with zeros, and returns a pointer to the allocated buffer.  If AllocationSize is 0, then a
    305   valid buffer of 0 size is returned.  If there is not enough memory remaining to satisfy the
    306   request, then NULL is returned.
    307 
    308   @param  AllocationSize        The number of bytes to allocate and zero.
    309 
    310   @return A pointer to the allocated buffer or NULL if allocation fails.
    311 
    312 **/
    313 VOID *
    314 EFIAPI
    315 UncachedAllocateRuntimeZeroPool (
    316   IN UINTN  AllocationSize
    317   );
    318 
    319 /**
    320   Allocates and zeros a buffer of type EfiReservedMemoryType.
    321 
    322   Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType, clears the
    323   buffer with zeros, and returns a pointer to the allocated buffer.  If AllocationSize is 0, then a
    324   valid buffer of 0 size is returned.  If there is not enough memory remaining to satisfy the
    325   request, then NULL is returned.
    326 
    327   @param  AllocationSize        The number of bytes to allocate and zero.
    328 
    329   @return A pointer to the allocated buffer or NULL if allocation fails.
    330 
    331 **/
    332 VOID *
    333 EFIAPI
    334 UncachedAllocateReservedZeroPool (
    335   IN UINTN  AllocationSize
    336   );
    337 
    338 /**
    339   Copies a buffer to an allocated buffer of type EfiBootServicesData.
    340 
    341   Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, 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   If Buffer is NULL, then ASSERT().
    346   If AllocationSize is greater than (MAX_ADDRESS ? Buffer + 1), then ASSERT().
    347 
    348   @param  AllocationSize        The number of bytes to allocate and zero.
    349   @param  Buffer                The buffer to copy to the allocated buffer.
    350 
    351   @return A pointer to the allocated buffer or NULL if allocation fails.
    352 
    353 **/
    354 VOID *
    355 EFIAPI
    356 UncachedAllocateCopyPool (
    357   IN UINTN       AllocationSize,
    358   IN CONST VOID  *Buffer
    359   );
    360 
    361 /**
    362   Copies a buffer to an allocated buffer of type EfiRuntimeServicesData.
    363 
    364   Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData, copies
    365   AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the
    366   allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is returned.  If there
    367   is not enough memory remaining to satisfy the request, then NULL is returned.
    368   If Buffer is NULL, then ASSERT().
    369   If AllocationSize is greater than (MAX_ADDRESS ? Buffer + 1), then ASSERT().
    370 
    371   @param  AllocationSize        The number of bytes to allocate and zero.
    372   @param  Buffer                The buffer to copy to the allocated buffer.
    373 
    374   @return A pointer to the allocated buffer or NULL if allocation fails.
    375 
    376 **/
    377 VOID *
    378 EFIAPI
    379 UncachedAllocateRuntimeCopyPool (
    380   IN UINTN       AllocationSize,
    381   IN CONST VOID  *Buffer
    382   );
    383 
    384 /**
    385   Copies a buffer to an allocated buffer of type EfiReservedMemoryType.
    386 
    387   Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType, copies
    388   AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the
    389   allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is returned.  If there
    390   is not enough memory remaining to satisfy the request, then NULL is returned.
    391   If Buffer is NULL, then ASSERT().
    392   If AllocationSize is greater than (MAX_ADDRESS ? Buffer + 1), then ASSERT().
    393 
    394   @param  AllocationSize        The number of bytes to allocate and zero.
    395   @param  Buffer                The buffer to copy to the allocated buffer.
    396 
    397   @return A pointer to the allocated buffer or NULL if allocation fails.
    398 
    399 **/
    400 VOID *
    401 EFIAPI
    402 UncachedAllocateReservedCopyPool (
    403   IN UINTN       AllocationSize,
    404   IN CONST VOID  *Buffer
    405   );
    406 
    407 /**
    408   Frees a buffer that was previously allocated with one of the pool allocation functions in the
    409   Memory Allocation Library.
    410 
    411   Frees the buffer specified by Buffer.  Buffer must have been allocated on a previous call to the
    412   pool allocation services of the Memory Allocation Library.
    413   If Buffer was not allocated with a pool allocation function in the Memory Allocation Library,
    414   then ASSERT().
    415 
    416   @param  Buffer                Pointer to the buffer to free.
    417 
    418 **/
    419 VOID
    420 EFIAPI
    421 UncachedFreePool (
    422   IN VOID   *Buffer
    423   );
    424 
    425 /**
    426   Allocates a buffer of type EfiBootServicesData at a specified alignment.
    427 
    428   Allocates the number bytes specified by AllocationSize of type EfiBootServicesData with an
    429   alignment specified by Alignment.  The allocated buffer is returned.  If AllocationSize is 0,
    430   then a valid buffer of 0 size is returned.  If there is not enough memory at the specified
    431   alignment remaining to satisfy the request, then NULL is returned.
    432   If Alignment is not a power of two and Alignment is not zero, then ASSERT().
    433 
    434   @param  AllocationSize        The number of bytes to allocate.
    435   @param  Alignment             The requested alignment of the allocation.  Must be a power of two.
    436                                 If Alignment is zero, then byte alignment is used.
    437 
    438   @return A pointer to the allocated buffer or NULL if allocation fails.
    439 
    440 **/
    441 VOID *
    442 EFIAPI
    443 UncachedAllocateAlignedPool (
    444   IN UINTN  AllocationSize,
    445   IN UINTN  Alignment
    446   );
    447 
    448 /**
    449   Allocates a buffer of type EfiRuntimeServicesData at a specified alignment.
    450 
    451   Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData with an
    452   alignment specified by Alignment.  The allocated buffer is returned.  If AllocationSize is 0,
    453   then a valid buffer of 0 size is returned.  If there is not enough memory at the specified
    454   alignment remaining to satisfy the request, then NULL is returned.
    455   If Alignment is not a power of two and Alignment is not zero, then ASSERT().
    456 
    457   @param  AllocationSize        The number of bytes to allocate.
    458   @param  Alignment             The requested alignment of the allocation.  Must be a power of two.
    459                                 If Alignment is zero, then byte alignment is used.
    460 
    461   @return A pointer to the allocated buffer or NULL if allocation fails.
    462 
    463 **/
    464 VOID *
    465 EFIAPI
    466 UncachedAllocateAlignedRuntimePool (
    467   IN UINTN  AllocationSize,
    468   IN UINTN  Alignment
    469   );
    470 
    471 /**
    472   Allocates a buffer of type EfieservedMemoryType at a specified alignment.
    473 
    474   Allocates the number bytes specified by AllocationSize of type EfieservedMemoryType with an
    475   alignment specified by Alignment.  The allocated buffer is returned.  If AllocationSize is 0,
    476   then a valid buffer of 0 size is returned.  If there is not enough memory at the specified
    477   alignment remaining to satisfy the request, then NULL is returned.
    478   If Alignment is not a power of two and Alignment is not zero, then ASSERT().
    479 
    480   @param  AllocationSize        The number of bytes to allocate.
    481   @param  Alignment             The requested alignment of the allocation.  Must be a power of two.
    482                                 If Alignment is zero, then byte alignment is used.
    483 
    484   @return A pointer to the allocated buffer or NULL if allocation fails.
    485 
    486 **/
    487 VOID *
    488 EFIAPI
    489 UncachedAllocateAlignedReservedPool (
    490   IN UINTN  AllocationSize,
    491   IN UINTN  Alignment
    492   );
    493 
    494 /**
    495   Allocates and zeros a buffer of type EfiBootServicesData at a specified alignment.
    496 
    497   Allocates the number bytes specified by AllocationSize of type EfiBootServicesData with an
    498   alignment specified by Alignment, clears the buffer with zeros, and returns a pointer to the
    499   allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is returned.  If there
    500   is not enough memory at the specified alignment remaining to satisfy the request, then NULL is
    501   returned.
    502   If Alignment is not a power of two and Alignment is not zero, then ASSERT().
    503 
    504   @param  AllocationSize        The number of bytes to allocate.
    505   @param  Alignment             The requested alignment of the allocation.  Must be a power of two.
    506                                 If Alignment is zero, then byte alignment is used.
    507 
    508   @return A pointer to the allocated buffer or NULL if allocation fails.
    509 
    510 **/
    511 VOID *
    512 EFIAPI
    513 UncachedAllocateAlignedZeroPool (
    514   IN UINTN  AllocationSize,
    515   IN UINTN  Alignment
    516   );
    517 
    518 /**
    519   Allocates and zeros a buffer of type EfiRuntimeServicesData at a specified alignment.
    520 
    521   Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData with an
    522   alignment specified by Alignment, clears the buffer with zeros, and returns a pointer to the
    523   allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is returned.  If there
    524   is not enough memory at the specified alignment remaining to satisfy the request, then NULL is
    525   returned.
    526   If Alignment is not a power of two and Alignment is not zero, then ASSERT().
    527 
    528   @param  AllocationSize        The number of bytes to allocate.
    529   @param  Alignment             The requested alignment of the allocation.  Must be a power of two.
    530                                 If Alignment is zero, then byte alignment is used.
    531 
    532   @return A pointer to the allocated buffer or NULL if allocation fails.
    533 
    534 **/
    535 VOID *
    536 EFIAPI
    537 UncachedAllocateAlignedRuntimeZeroPool (
    538   IN UINTN  AllocationSize,
    539   IN UINTN  Alignment
    540   );
    541 
    542 /**
    543   Allocates and zeros a buffer of type EfieservedMemoryType at a specified alignment.
    544 
    545   Allocates the number bytes specified by AllocationSize of type EfieservedMemoryType with an
    546   alignment specified by Alignment, clears the buffer with zeros, and returns a pointer to the
    547   allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is returned.  If there
    548   is not enough memory at the specified alignment remaining to satisfy the request, then NULL is
    549   returned.
    550   If Alignment is not a power of two and Alignment is not zero, then ASSERT().
    551 
    552   @param  AllocationSize        The number of bytes to allocate.
    553   @param  Alignment             The requested alignment of the allocation.  Must be a power of two.
    554                                 If Alignment is zero, then byte alignment is used.
    555 
    556   @return A pointer to the allocated buffer or NULL if allocation fails.
    557 
    558 **/
    559 VOID *
    560 EFIAPI
    561 UncachedAllocateAlignedReservedZeroPool (
    562   IN UINTN  AllocationSize,
    563   IN UINTN  Alignment
    564   );
    565 
    566 /**
    567   Copies a buffer to an allocated buffer of type EfiBootServicesData at a specified alignment.
    568 
    569   Allocates the number bytes specified by AllocationSize of type EfiBootServicesData type with an
    570   alignment specified by Alignment.  The allocated buffer is returned.  If AllocationSize is 0,
    571   then a valid buffer of 0 size is returned.  If there is not enough memory at the specified
    572   alignment remaining to satisfy the request, then NULL is returned.
    573   If Alignment is not a power of two and Alignment is not zero, then ASSERT().
    574 
    575   @param  AllocationSize        The number of bytes to allocate.
    576   @param  Buffer                The buffer to copy to the allocated buffer.
    577   @param  Alignment             The requested alignment of the allocation.  Must be a power of two.
    578                                 If Alignment is zero, then byte alignment is used.
    579 
    580   @return A pointer to the allocated buffer or NULL if allocation fails.
    581 
    582 **/
    583 VOID *
    584 EFIAPI
    585 UncachedAllocateAlignedCopyPool (
    586   IN UINTN       AllocationSize,
    587   IN CONST VOID  *Buffer,
    588   IN UINTN       Alignment
    589   );
    590 
    591 /**
    592   Copies a buffer to an allocated buffer of type EfiRuntimeServicesData at a specified alignment.
    593 
    594   Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData type with an
    595   alignment specified by Alignment.  The allocated buffer is returned.  If AllocationSize is 0,
    596   then a valid buffer of 0 size is returned.  If there is not enough memory at the specified
    597   alignment remaining to satisfy the request, then NULL is returned.
    598   If Alignment is not a power of two and Alignment is not zero, then ASSERT().
    599 
    600   @param  AllocationSize        The number of bytes to allocate.
    601   @param  Buffer                The buffer to copy to the allocated buffer.
    602   @param  Alignment             The requested alignment of the allocation.  Must be a power of two.
    603                                 If Alignment is zero, then byte alignment is used.
    604 
    605   @return A pointer to the allocated buffer or NULL if allocation fails.
    606 
    607 **/
    608 VOID *
    609 EFIAPI
    610 UncachedAllocateAlignedRuntimeCopyPool (
    611   IN UINTN       AllocationSize,
    612   IN CONST VOID  *Buffer,
    613   IN UINTN       Alignment
    614   );
    615 
    616 /**
    617   Copies a buffer to an allocated buffer of type EfiReservedMemoryType at a specified alignment.
    618 
    619   Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType type with an
    620   alignment specified by Alignment.  The allocated buffer is returned.  If AllocationSize is 0,
    621   then a valid buffer of 0 size is returned.  If there is not enough memory at the specified
    622   alignment remaining to satisfy the request, then NULL is returned.
    623   If Alignment is not a power of two and Alignment is not zero, then ASSERT().
    624 
    625   @param  AllocationSize        The number of bytes to allocate.
    626   @param  Buffer                The buffer to copy to the allocated buffer.
    627   @param  Alignment             The requested alignment of the allocation.  Must be a power of two.
    628                                 If Alignment is zero, then byte alignment is used.
    629 
    630   @return A pointer to the allocated buffer or NULL if allocation fails.
    631 
    632 **/
    633 VOID *
    634 EFIAPI
    635 UncachedAllocateAlignedReservedCopyPool (
    636   IN UINTN       AllocationSize,
    637   IN CONST VOID  *Buffer,
    638   IN UINTN       Alignment
    639   );
    640 
    641 /**
    642   Frees a buffer that was previously allocated with one of the aligned pool allocation functions
    643   in the Memory Allocation Library.
    644 
    645   Frees the buffer specified by Buffer.  Buffer must have been allocated on a previous call to the
    646   aligned pool allocation services of the Memory Allocation Library.
    647   If Buffer was not allocated with an aligned pool allocation function in the Memory Allocation
    648   Library, then ASSERT().
    649 
    650   @param  Buffer                Pointer to the buffer to free.
    651 
    652 **/
    653 VOID
    654 EFIAPI
    655 UncachedFreeAlignedPool (
    656   IN VOID   *Buffer
    657   );
    658 
    659 VOID
    660 EFIAPI
    661 UncachedSafeFreePool (
    662   IN VOID   *Buffer
    663   );
    664 
    665 #endif // __UNCACHED_MEMORY_ALLOCATION_LIB_H__
    666