| /** @file |
| Provides copy memory, fill memory, zero memory, and GUID functions. |
| |
| The Base Memory Library provides optimized implementations for common memory-based operations. |
| These functions should be used in place of coding your own loops to do equivalent common functions. |
| This allows optimized library implementations to help increase performance. |
| |
| Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> |
| SPDX-License-Identifier: BSD-2-Clause-Patent |
| |
| **/ |
| |
| #ifndef __BASE_MEMORY_LIB__ |
| #define __BASE_MEMORY_LIB__ |
| |
| /** |
| Copies a source buffer to a destination buffer, and returns the destination buffer. |
| |
| This function copies Length bytes from SourceBuffer to DestinationBuffer, and returns |
| DestinationBuffer. The implementation must be reentrant, and it must handle the case |
| where SourceBuffer overlaps DestinationBuffer. |
| |
| If Length is greater than (MAX_ADDRESS - DestinationBuffer + 1), then ASSERT(). |
| If Length is greater than (MAX_ADDRESS - SourceBuffer + 1), then ASSERT(). |
| |
| @param DestinationBuffer The pointer to the destination buffer of the memory copy. |
| @param SourceBuffer The pointer to the source buffer of the memory copy. |
| @param Length The number of bytes to copy from SourceBuffer to DestinationBuffer. |
| |
| @return DestinationBuffer. |
| |
| **/ |
| VOID * |
| EFIAPI |
| CopyMem ( |
| OUT VOID *DestinationBuffer, |
| IN CONST VOID *SourceBuffer, |
| IN UINTN Length |
| ); |
| |
| /** |
| Fills a target buffer with a byte value, and returns the target buffer. |
| |
| This function fills Length bytes of Buffer with Value, and returns Buffer. |
| |
| If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). |
| |
| @param Buffer The memory to set. |
| @param Length The number of bytes to set. |
| @param Value The value with which to fill Length bytes of Buffer. |
| |
| @return Buffer. |
| |
| **/ |
| VOID * |
| EFIAPI |
| SetMem ( |
| OUT VOID *Buffer, |
| IN UINTN Length, |
| IN UINT8 Value |
| ); |
| |
| /** |
| Fills a target buffer with a 16-bit value, and returns the target buffer. |
| |
| This function fills Length bytes of Buffer with the 16-bit value specified by |
| Value, and returns Buffer. Value is repeated every 16-bits in for Length |
| bytes of Buffer. |
| |
| If Length > 0 and Buffer is NULL, then ASSERT(). |
| If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). |
| If Buffer is not aligned on a 16-bit boundary, then ASSERT(). |
| If Length is not aligned on a 16-bit boundary, then ASSERT(). |
| |
| @param Buffer The pointer to the target buffer to fill. |
| @param Length The number of bytes in Buffer to fill. |
| @param Value The value with which to fill Length bytes of Buffer. |
| |
| @return Buffer. |
| |
| **/ |
| VOID * |
| EFIAPI |
| SetMem16 ( |
| OUT VOID *Buffer, |
| IN UINTN Length, |
| IN UINT16 Value |
| ); |
| |
| /** |
| Fills a target buffer with a 32-bit value, and returns the target buffer. |
| |
| This function fills Length bytes of Buffer with the 32-bit value specified by |
| Value, and returns Buffer. Value is repeated every 32-bits in for Length |
| bytes of Buffer. |
| |
| If Length > 0 and Buffer is NULL, then ASSERT(). |
| If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). |
| If Buffer is not aligned on a 32-bit boundary, then ASSERT(). |
| If Length is not aligned on a 32-bit boundary, then ASSERT(). |
| |
| @param Buffer The pointer to the target buffer to fill. |
| @param Length The number of bytes in Buffer to fill. |
| @param Value The value with which to fill Length bytes of Buffer. |
| |
| @return Buffer. |
| |
| **/ |
| VOID * |
| EFIAPI |
| SetMem32 ( |
| OUT VOID *Buffer, |
| IN UINTN Length, |
| IN UINT32 Value |
| ); |
| |
| /** |
| Fills a target buffer with a 64-bit value, and returns the target buffer. |
| |
| This function fills Length bytes of Buffer with the 64-bit value specified by |
| Value, and returns Buffer. Value is repeated every 64-bits in for Length |
| bytes of Buffer. |
| |
| If Length > 0 and Buffer is NULL, then ASSERT(). |
| If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). |
| If Buffer is not aligned on a 64-bit boundary, then ASSERT(). |
| If Length is not aligned on a 64-bit boundary, then ASSERT(). |
| |
| @param Buffer The pointer to the target buffer to fill. |
| @param Length The number of bytes in Buffer to fill. |
| @param Value The value with which to fill Length bytes of Buffer. |
| |
| @return Buffer. |
| |
| **/ |
| VOID * |
| EFIAPI |
| SetMem64 ( |
| OUT VOID *Buffer, |
| IN UINTN Length, |
| IN UINT64 Value |
| ); |
| |
| /** |
| Fills a target buffer with a value that is size UINTN, and returns the target buffer. |
| |
| This function fills Length bytes of Buffer with the UINTN sized value specified by |
| Value, and returns Buffer. Value is repeated every sizeof(UINTN) bytes for Length |
| bytes of Buffer. |
| |
| If Length > 0 and Buffer is NULL, then ASSERT(). |
| If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). |
| If Buffer is not aligned on a UINTN boundary, then ASSERT(). |
| If Length is not aligned on a UINTN boundary, then ASSERT(). |
| |
| @param Buffer The pointer to the target buffer to fill. |
| @param Length The number of bytes in Buffer to fill. |
| @param Value The value with which to fill Length bytes of Buffer. |
| |
| @return Buffer. |
| |
| **/ |
| VOID * |
| EFIAPI |
| SetMemN ( |
| OUT VOID *Buffer, |
| IN UINTN Length, |
| IN UINTN Value |
| ); |
| |
| /** |
| Fills a target buffer with zeros, and returns the target buffer. |
| |
| This function fills Length bytes of Buffer with zeros, and returns Buffer. |
| |
| If Length > 0 and Buffer is NULL, then ASSERT(). |
| If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). |
| |
| @param Buffer The pointer to the target buffer to fill with zeros. |
| @param Length The number of bytes in Buffer to fill with zeros. |
| |
| @return Buffer. |
| |
| **/ |
| VOID * |
| EFIAPI |
| ZeroMem ( |
| OUT VOID *Buffer, |
| IN UINTN Length |
| ); |
| |
| /** |
| Compares the contents of two buffers. |
| |
| This function compares Length bytes of SourceBuffer to Length bytes of DestinationBuffer. |
| If all Length bytes of the two buffers are identical, then 0 is returned. Otherwise, the |
| value returned is the first mismatched byte in SourceBuffer subtracted from the first |
| mismatched byte in DestinationBuffer. |
| |
| If Length > 0 and DestinationBuffer is NULL, then ASSERT(). |
| If Length > 0 and SourceBuffer is NULL, then ASSERT(). |
| If Length is greater than (MAX_ADDRESS - DestinationBuffer + 1), then ASSERT(). |
| If Length is greater than (MAX_ADDRESS - SourceBuffer + 1), then ASSERT(). |
| |
| @param DestinationBuffer The pointer to the destination buffer to compare. |
| @param SourceBuffer The pointer to the source buffer to compare. |
| @param Length The number of bytes to compare. |
| |
| @return 0 All Length bytes of the two buffers are identical. |
| @retval Non-zero The first mismatched byte in SourceBuffer subtracted from the first |
| mismatched byte in DestinationBuffer. |
| |
| **/ |
| INTN |
| EFIAPI |
| CompareMem ( |
| IN CONST VOID *DestinationBuffer, |
| IN CONST VOID *SourceBuffer, |
| IN UINTN Length |
| ); |
| |
| /** |
| Scans a target buffer for an 8-bit value, and returns a pointer to the matching 8-bit value |
| in the target buffer. |
| |
| This function searches target the buffer specified by Buffer and Length from the lowest |
| address to the highest address for an 8-bit value that matches Value. If a match is found, |
| then a pointer to the matching byte in the target buffer is returned. If no match is found, |
| then NULL is returned. If Length is 0, then NULL is returned. |
| |
| If Length > 0 and Buffer is NULL, then ASSERT(). |
| If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). |
| |
| @param Buffer The pointer to the target buffer to scan. |
| @param Length The number of bytes in Buffer to scan. |
| @param Value The value to search for in the target buffer. |
| |
| @return A pointer to the matching byte in the target buffer, otherwise NULL. |
| |
| **/ |
| VOID * |
| EFIAPI |
| ScanMem8 ( |
| IN CONST VOID *Buffer, |
| IN UINTN Length, |
| IN UINT8 Value |
| ); |
| |
| /** |
| Scans a target buffer for a 16-bit value, and returns a pointer to the matching 16-bit value |
| in the target buffer. |
| |
| This function searches target the buffer specified by Buffer and Length from the lowest |
| address to the highest address for a 16-bit value that matches Value. If a match is found, |
| then a pointer to the matching byte in the target buffer is returned. If no match is found, |
| then NULL is returned. If Length is 0, then NULL is returned. |
| |
| If Length > 0 and Buffer is NULL, then ASSERT(). |
| If Buffer is not aligned on a 16-bit boundary, then ASSERT(). |
| If Length is not aligned on a 16-bit boundary, then ASSERT(). |
| If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). |
| |
| @param Buffer The pointer to the target buffer to scan. |
| @param Length The number of bytes in Buffer to scan. |
| @param Value The value to search for in the target buffer. |
| |
| @return A pointer to the matching byte in the target buffer, otherwise NULL. |
| |
| **/ |
| VOID * |
| EFIAPI |
| ScanMem16 ( |
| IN CONST VOID *Buffer, |
| IN UINTN Length, |
| IN UINT16 Value |
| ); |
| |
| /** |
| Scans a target buffer for a 32-bit value, and returns a pointer to the matching 32-bit value |
| in the target buffer. |
| |
| This function searches target the buffer specified by Buffer and Length from the lowest |
| address to the highest address for a 32-bit value that matches Value. If a match is found, |
| then a pointer to the matching byte in the target buffer is returned. If no match is found, |
| then NULL is returned. If Length is 0, then NULL is returned. |
| |
| If Length > 0 and Buffer is NULL, then ASSERT(). |
| If Buffer is not aligned on a 32-bit boundary, then ASSERT(). |
| If Length is not aligned on a 32-bit boundary, then ASSERT(). |
| If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). |
| |
| @param Buffer The pointer to the target buffer to scan. |
| @param Length The number of bytes in Buffer to scan. |
| @param Value The value to search for in the target buffer. |
| |
| @return A pointer to the matching byte in the target buffer, otherwise NULL. |
| |
| **/ |
| VOID * |
| EFIAPI |
| ScanMem32 ( |
| IN CONST VOID *Buffer, |
| IN UINTN Length, |
| IN UINT32 Value |
| ); |
| |
| /** |
| Scans a target buffer for a 64-bit value, and returns a pointer to the matching 64-bit value |
| in the target buffer. |
| |
| This function searches target the buffer specified by Buffer and Length from the lowest |
| address to the highest address for a 64-bit value that matches Value. If a match is found, |
| then a pointer to the matching byte in the target buffer is returned. If no match is found, |
| then NULL is returned. If Length is 0, then NULL is returned. |
| |
| If Length > 0 and Buffer is NULL, then ASSERT(). |
| If Buffer is not aligned on a 64-bit boundary, then ASSERT(). |
| If Length is not aligned on a 64-bit boundary, then ASSERT(). |
| If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). |
| |
| @param Buffer The pointer to the target buffer to scan. |
| @param Length The number of bytes in Buffer to scan. |
| @param Value The value to search for in the target buffer. |
| |
| @return A pointer to the matching byte in the target buffer, otherwise NULL. |
| |
| **/ |
| VOID * |
| EFIAPI |
| ScanMem64 ( |
| IN CONST VOID *Buffer, |
| IN UINTN Length, |
| IN UINT64 Value |
| ); |
| |
| /** |
| Scans a target buffer for a UINTN sized value, and returns a pointer to the matching |
| UINTN sized value in the target buffer. |
| |
| This function searches target the buffer specified by Buffer and Length from the lowest |
| address to the highest address for a UINTN sized value that matches Value. If a match is found, |
| then a pointer to the matching byte in the target buffer is returned. If no match is found, |
| then NULL is returned. If Length is 0, then NULL is returned. |
| |
| If Length > 0 and Buffer is NULL, then ASSERT(). |
| If Buffer is not aligned on a UINTN boundary, then ASSERT(). |
| If Length is not aligned on a UINTN boundary, then ASSERT(). |
| If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). |
| |
| @param Buffer The pointer to the target buffer to scan. |
| @param Length The number of bytes in Buffer to scan. |
| @param Value The value to search for in the target buffer. |
| |
| @return A pointer to the matching byte in the target buffer, otherwise NULL. |
| |
| **/ |
| VOID * |
| EFIAPI |
| ScanMemN ( |
| IN CONST VOID *Buffer, |
| IN UINTN Length, |
| IN UINTN Value |
| ); |
| |
| /** |
| Copies a source GUID to a destination GUID. |
| |
| This function copies the contents of the 128-bit GUID specified by SourceGuid to |
| DestinationGuid, and returns DestinationGuid. |
| |
| If DestinationGuid is NULL, then ASSERT(). |
| If SourceGuid is NULL, then ASSERT(). |
| |
| @param DestinationGuid The pointer to the destination GUID. |
| @param SourceGuid The pointer to the source GUID. |
| |
| @return DestinationGuid. |
| |
| **/ |
| GUID * |
| EFIAPI |
| CopyGuid ( |
| OUT GUID *DestinationGuid, |
| IN CONST GUID *SourceGuid |
| ); |
| |
| /** |
| Compares two GUIDs. |
| |
| This function compares Guid1 to Guid2. If the GUIDs are identical then TRUE is returned. |
| If there are any bit differences in the two GUIDs, then FALSE is returned. |
| |
| If Guid1 is NULL, then ASSERT(). |
| If Guid2 is NULL, then ASSERT(). |
| |
| @param Guid1 A pointer to a 128 bit GUID. |
| @param Guid2 A pointer to a 128 bit GUID. |
| |
| @retval TRUE Guid1 and Guid2 are identical. |
| @retval FALSE Guid1 and Guid2 are not identical. |
| |
| **/ |
| BOOLEAN |
| EFIAPI |
| CompareGuid ( |
| IN CONST GUID *Guid1, |
| IN CONST GUID *Guid2 |
| ); |
| |
| /** |
| Scans a target buffer for a GUID, and returns a pointer to the matching GUID |
| in the target buffer. |
| |
| This function searches target the buffer specified by Buffer and Length from |
| the lowest address to the highest address at 128-bit increments for the 128-bit |
| GUID value that matches Guid. If a match is found, then a pointer to the matching |
| GUID in the target buffer is returned. If no match is found, then NULL is returned. |
| If Length is 0, then NULL is returned. |
| |
| If Length > 0 and Buffer is NULL, then ASSERT(). |
| If Buffer is not aligned on a 32-bit boundary, then ASSERT(). |
| If Length is not aligned on a 128-bit boundary, then ASSERT(). |
| If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). |
| |
| @param Buffer The pointer to the target buffer to scan. |
| @param Length The number of bytes in Buffer to scan. |
| @param Guid The value to search for in the target buffer. |
| |
| @return A pointer to the matching Guid in the target buffer, otherwise NULL. |
| |
| **/ |
| VOID * |
| EFIAPI |
| ScanGuid ( |
| IN CONST VOID *Buffer, |
| IN UINTN Length, |
| IN CONST GUID *Guid |
| ); |
| |
| /** |
| Checks if the given GUID is a zero GUID. |
| |
| This function checks whether the given GUID is a zero GUID. If the GUID is |
| identical to a zero GUID then TRUE is returned. Otherwise, FALSE is returned. |
| |
| If Guid is NULL, then ASSERT(). |
| |
| @param Guid The pointer to a 128 bit GUID. |
| |
| @retval TRUE Guid is a zero GUID. |
| @retval FALSE Guid is not a zero GUID. |
| |
| **/ |
| BOOLEAN |
| EFIAPI |
| IsZeroGuid ( |
| IN CONST GUID *Guid |
| ); |
| |
| /** |
| Checks if the contents of a buffer are all zeros. |
| |
| This function checks whether the contents of a buffer are all zeros. If the |
| contents are all zeros, return TRUE. Otherwise, return FALSE. |
| |
| If Length > 0 and Buffer is NULL, then ASSERT(). |
| If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). |
| |
| @param Buffer The pointer to the buffer to be checked. |
| @param Length The size of the buffer (in bytes) to be checked. |
| |
| @retval TRUE Contents of the buffer are all zeros. |
| @retval FALSE Contents of the buffer are not all zeros. |
| |
| **/ |
| BOOLEAN |
| EFIAPI |
| IsZeroBuffer ( |
| IN CONST VOID *Buffer, |
| IN UINTN Length |
| ); |
| |
| #endif |