From af1a266670d040d2f4083ff309d732d648afba2a Mon Sep 17 00:00:00 2001 From: Angelos Mouzakitis Date: Tue, 10 Oct 2023 14:33:42 +0000 Subject: Add submodule dependency files Change-Id: Iaf8d18082d3991dec7c0ebbea540f092188eb4ec --- .../Library/BaseMemoryLibMmx/BaseMemoryLibMmx.inf | 102 +++++++++ .../Library/BaseMemoryLibMmx/BaseMemoryLibMmx.uni | 17 ++ .../Library/BaseMemoryLibMmx/CompareMemWrapper.c | 60 +++++ .../Library/BaseMemoryLibMmx/CopyMemWrapper.c | 57 +++++ .../Library/BaseMemoryLibMmx/Ia32/CompareMem.nasm | 51 +++++ .../Library/BaseMemoryLibMmx/Ia32/CopyMem.nasm | 71 ++++++ .../BaseMemoryLibMmx/Ia32/IsZeroBuffer.nasm | 49 +++++ .../Library/BaseMemoryLibMmx/Ia32/ScanMem16.nasm | 48 ++++ .../Library/BaseMemoryLibMmx/Ia32/ScanMem32.nasm | 48 ++++ .../Library/BaseMemoryLibMmx/Ia32/ScanMem64.nasm | 57 +++++ .../Library/BaseMemoryLibMmx/Ia32/ScanMem8.nasm | 48 ++++ .../Library/BaseMemoryLibMmx/Ia32/SetMem.nasm | 62 ++++++ .../Library/BaseMemoryLibMmx/Ia32/SetMem16.nasm | 55 +++++ .../Library/BaseMemoryLibMmx/Ia32/SetMem32.nasm | 49 +++++ .../Library/BaseMemoryLibMmx/Ia32/SetMem64.nasm | 40 ++++ .../Library/BaseMemoryLibMmx/Ia32/ZeroMem.nasm | 48 ++++ .../Library/BaseMemoryLibMmx/IsZeroBufferWrapper.c | 48 ++++ .../MdePkg/Library/BaseMemoryLibMmx/MemLibGuid.c | 165 ++++++++++++++ .../Library/BaseMemoryLibMmx/MemLibInternals.h | 245 +++++++++++++++++++++ .../Library/BaseMemoryLibMmx/ScanMem16Wrapper.c | 61 +++++ .../Library/BaseMemoryLibMmx/ScanMem32Wrapper.c | 60 +++++ .../Library/BaseMemoryLibMmx/ScanMem64Wrapper.c | 61 +++++ .../Library/BaseMemoryLibMmx/ScanMem8Wrapper.c | 93 ++++++++ .../Library/BaseMemoryLibMmx/SetMem16Wrapper.c | 58 +++++ .../Library/BaseMemoryLibMmx/SetMem32Wrapper.c | 58 +++++ .../Library/BaseMemoryLibMmx/SetMem64Wrapper.c | 58 +++++ .../Library/BaseMemoryLibMmx/SetMemWrapper.c | 85 +++++++ .../Library/BaseMemoryLibMmx/X64/CompareMem.nasm | 52 +++++ .../Library/BaseMemoryLibMmx/X64/CopyMem.nasm | 68 ++++++ .../Library/BaseMemoryLibMmx/X64/IsZeroBuffer.nasm | 49 +++++ .../Library/BaseMemoryLibMmx/X64/ScanMem16.nasm | 49 +++++ .../Library/BaseMemoryLibMmx/X64/ScanMem32.nasm | 49 +++++ .../Library/BaseMemoryLibMmx/X64/ScanMem64.nasm | 49 +++++ .../Library/BaseMemoryLibMmx/X64/ScanMem8.nasm | 49 +++++ .../Library/BaseMemoryLibMmx/X64/SetMem.nasm | 54 +++++ .../Library/BaseMemoryLibMmx/X64/SetMem16.nasm | 53 +++++ .../Library/BaseMemoryLibMmx/X64/SetMem32.nasm | 47 ++++ .../Library/BaseMemoryLibMmx/X64/SetMem64.nasm | 40 ++++ .../Library/BaseMemoryLibMmx/X64/ZeroMem.nasm | 50 +++++ .../Library/BaseMemoryLibMmx/ZeroMemWrapper.c | 50 +++++ 40 files changed, 2513 insertions(+) create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/BaseMemoryLibMmx.inf create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/BaseMemoryLibMmx.uni create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/CompareMemWrapper.c create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/CopyMemWrapper.c create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/CompareMem.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/CopyMem.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/IsZeroBuffer.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ScanMem16.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ScanMem32.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ScanMem64.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ScanMem8.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/SetMem.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/SetMem16.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/SetMem32.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/SetMem64.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ZeroMem.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/IsZeroBufferWrapper.c create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/MemLibGuid.c create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/MemLibInternals.h create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ScanMem16Wrapper.c create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ScanMem32Wrapper.c create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ScanMem64Wrapper.c create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ScanMem8Wrapper.c create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/SetMem16Wrapper.c create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/SetMem32Wrapper.c create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/SetMem64Wrapper.c create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/SetMemWrapper.c create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/CompareMem.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/IsZeroBuffer.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ScanMem16.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ScanMem32.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ScanMem64.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ScanMem8.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/SetMem.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/SetMem16.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/SetMem32.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/SetMem64.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ZeroMem.nasm create mode 100644 roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ZeroMemWrapper.c (limited to 'roms/edk2/MdePkg/Library/BaseMemoryLibMmx') diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/BaseMemoryLibMmx.inf b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/BaseMemoryLibMmx.inf new file mode 100644 index 000000000..c470fa442 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/BaseMemoryLibMmx.inf @@ -0,0 +1,102 @@ +## @file +# Instance of Base Memory Library using MMX registers. +# +# Base Memory Library that uses MMX registers for high performance. +# Optimized for use in DXE. +# +# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BaseMemoryLibMmx + MODULE_UNI_FILE = BaseMemoryLibMmx.uni + FILE_GUID = d458a654-f64c-49db-b8d1-3821306bf1f6 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = BaseMemoryLib + + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Packages] + MdePkg/MdePkg.dec + + +[Sources] + ScanMem64Wrapper.c + ScanMem32Wrapper.c + ScanMem16Wrapper.c + ScanMem8Wrapper.c + ZeroMemWrapper.c + CompareMemWrapper.c + SetMem64Wrapper.c + SetMem32Wrapper.c + SetMem16Wrapper.c + SetMemWrapper.c + CopyMemWrapper.c + IsZeroBufferWrapper.c + MemLibGuid.c + MemLibInternals.h + +[Sources.Ia32] + Ia32/ScanMem64.nasm + Ia32/ScanMem32.nasm + Ia32/ScanMem16.nasm + Ia32/ScanMem8.nasm + Ia32/CompareMem.nasm + Ia32/SetMem64.nasm + Ia32/SetMem32.nasm + Ia32/SetMem16.nasm + Ia32/ZeroMem.nasm + Ia32/SetMem.nasm + Ia32/CopyMem.nasm + Ia32/ScanMem64.nasm + Ia32/ScanMem32.nasm + Ia32/ScanMem16.nasm + Ia32/ScanMem8.nasm + Ia32/CompareMem.nasm + Ia32/SetMem64.nasm + Ia32/SetMem32.nasm + Ia32/SetMem16.nasm + Ia32/ZeroMem.nasm + Ia32/SetMem.nasm + Ia32/CopyMem.nasm + Ia32/IsZeroBuffer.nasm + +[Sources.X64] + X64/ZeroMem.nasm + X64/ScanMem64.nasm + X64/ScanMem32.nasm + X64/ScanMem16.nasm + X64/ScanMem8.nasm + X64/CompareMem.nasm + X64/SetMem64.nasm + X64/SetMem32.nasm + X64/SetMem16.nasm + X64/SetMem.nasm + X64/CopyMem.nasm + X64/ScanMem64.nasm + X64/ScanMem32.nasm + X64/ScanMem16.nasm + X64/ScanMem8.nasm + X64/CompareMem.nasm + X64/SetMem64.nasm + X64/SetMem32.nasm + X64/SetMem16.nasm + X64/ZeroMem.nasm + X64/SetMem.nasm + X64/CopyMem.nasm + X64/IsZeroBuffer.nasm + + +[LibraryClasses] + DebugLib + BaseLib + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/BaseMemoryLibMmx.uni b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/BaseMemoryLibMmx.uni new file mode 100644 index 000000000..798c1b6f9 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/BaseMemoryLibMmx.uni @@ -0,0 +1,17 @@ +// /** @file +// Instance of Base Memory Library using MMX registers. +// +// Base Memory Library that uses MMX registers for high performance. +// Optimized for use in DXE. +// +// Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
+// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// **/ + + +#string STR_MODULE_ABSTRACT #language en-US "Instance of Base Memory Library using MMX registers" + +#string STR_MODULE_DESCRIPTION #language en-US "Base Memory Library that uses MMX registers for high performance. Optimized for use in DXE." + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/CompareMemWrapper.c b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/CompareMemWrapper.c new file mode 100644 index 000000000..6c539a685 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/CompareMemWrapper.c @@ -0,0 +1,60 @@ +/** @file + CompareMem() implementation. + + The following BaseMemoryLib instances contain the same copy of this file: + BaseMemoryLib + BaseMemoryLibMmx + BaseMemoryLibSse2 + BaseMemoryLibRepStr + BaseMemoryLibOptDxe + BaseMemoryLibOptPei + PeiMemoryLib + UefiMemoryLib + +Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "MemLibInternals.h" + +/** + 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 + ) +{ + if (Length == 0 || DestinationBuffer == SourceBuffer) { + return 0; + } + ASSERT (DestinationBuffer != NULL); + ASSERT (SourceBuffer != NULL); + ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)DestinationBuffer)); + ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)SourceBuffer)); + + return InternalMemCompareMem (DestinationBuffer, SourceBuffer, Length); +} diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/CopyMemWrapper.c b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/CopyMemWrapper.c new file mode 100644 index 000000000..438abf4e8 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/CopyMemWrapper.c @@ -0,0 +1,57 @@ +/** @file + CopyMem() implementation. + + The following BaseMemoryLib instances contain the same copy of this file: + + BaseMemoryLib + BaseMemoryLibMmx + BaseMemoryLibSse2 + BaseMemoryLibRepStr + BaseMemoryLibOptDxe + BaseMemoryLibOptPei + PeiMemoryLib + UefiMemoryLib + + Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "MemLibInternals.h" + +/** + 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 + ) +{ + if (Length == 0) { + return DestinationBuffer; + } + ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)DestinationBuffer)); + ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)SourceBuffer)); + + if (DestinationBuffer == SourceBuffer) { + return DestinationBuffer; + } + return InternalMemCopyMem (DestinationBuffer, SourceBuffer, Length); +} diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/CompareMem.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/CompareMem.nasm new file mode 100644 index 000000000..6d56d48f6 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/CompareMem.nasm @@ -0,0 +1,51 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; CompareMem.Asm +; +; Abstract: +; +; CompareMem function +; +; Notes: +; +; The following BaseMemoryLib instances contain the same copy of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; BaseMemoryLibOptDxe +; BaseMemoryLibOptPei +; +;------------------------------------------------------------------------------ + + SECTION .text + +;------------------------------------------------------------------------------ +; INTN +; EFIAPI +; InternalMemCompareMem ( +; IN CONST VOID *DestinationBuffer, +; IN CONST VOID *SourceBuffer, +; IN UINTN Length +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemCompareMem) +ASM_PFX(InternalMemCompareMem): + push esi + push edi + mov esi, [esp + 12] + mov edi, [esp + 16] + mov ecx, [esp + 20] + repe cmpsb + movzx eax, byte [esi - 1] + movzx edx, byte [edi - 1] + sub eax, edx + pop edi + pop esi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/CopyMem.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/CopyMem.nasm new file mode 100644 index 000000000..5cace177d --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/CopyMem.nasm @@ -0,0 +1,71 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; CopyMem.nasm +; +; Abstract: +; +; CopyMem function +; +; Notes: +; +;------------------------------------------------------------------------------ + + SECTION .text + +;------------------------------------------------------------------------------ +; VOID * +; EFIAPI +; InternalMemCopyMem ( +; IN VOID *Destination, +; IN VOID *Source, +; IN UINTN Count +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemCopyMem) +ASM_PFX(InternalMemCopyMem): + push esi + push edi + mov esi, [esp + 16] ; esi <- Source + mov edi, [esp + 12] ; edi <- Destination + mov edx, [esp + 20] ; edx <- Count + lea eax, [esi + edx - 1] ; eax <- End of Source + cmp esi, edi + jae .0 + cmp eax, edi ; Overlapped? + jae @CopyBackward ; Copy backward if overlapped +.0: + mov ecx, edx + and edx, 7 + shr ecx, 3 ; ecx <- # of Qwords to copy + jz @CopyBytes + push eax + push eax + movq [esp], mm0 ; save mm0 +.1: + movq mm0, [esi] + movq [edi], mm0 + add esi, 8 + add edi, 8 + loop .1 + movq mm0, [esp] ; restore mm0 + pop ecx ; stack cleanup + pop ecx ; stack cleanup + jmp @CopyBytes +@CopyBackward: + mov esi, eax ; esi <- Last byte in Source + lea edi, [edi + edx - 1] ; edi <- Last byte in Destination + std +@CopyBytes: + mov ecx, edx + rep movsb + cld + mov eax, [esp + 12] + pop edi + pop esi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/IsZeroBuffer.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/IsZeroBuffer.nasm new file mode 100644 index 000000000..67288cdff --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/IsZeroBuffer.nasm @@ -0,0 +1,49 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2016, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; IsZeroBuffer.nasm +; +; Abstract: +; +; IsZeroBuffer function +; +; Notes: +; +;------------------------------------------------------------------------------ + + SECTION .text + +;------------------------------------------------------------------------------ +; BOOLEAN +; EFIAPI +; InternalMemIsZeroBuffer ( +; IN CONST VOID *Buffer, +; IN UINTN Length +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemIsZeroBuffer) +ASM_PFX(InternalMemIsZeroBuffer): + push edi + mov edi, [esp + 8] ; edi <- Buffer + mov ecx, [esp + 12] ; ecx <- Length + mov edx, ecx ; edx <- ecx + shr ecx, 2 ; ecx <- number of dwords + and edx, 3 ; edx <- number of trailing bytes + xor eax, eax ; eax <- 0, also set ZF + repe scasd + jnz @ReturnFalse ; ZF=0 means non-zero element found + mov ecx, edx + repe scasb + jnz @ReturnFalse + pop edi + mov eax, 1 ; return TRUE + ret +@ReturnFalse: + pop edi + xor eax, eax + ret ; return FALSE + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ScanMem16.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ScanMem16.nasm new file mode 100644 index 000000000..7a3332b53 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ScanMem16.nasm @@ -0,0 +1,48 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; ScanMem16.Asm +; +; Abstract: +; +; ScanMem16 function +; +; Notes: +; +; The following BaseMemoryLib instances contain the same copy of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; BaseMemoryLibOptDxe +; BaseMemoryLibOptPei +; +;------------------------------------------------------------------------------ + + SECTION .text + +;------------------------------------------------------------------------------ +; CONST VOID * +; EFIAPI +; InternalMemScanMem16 ( +; IN CONST VOID *Buffer, +; IN UINTN Length, +; IN UINT16 Value +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemScanMem16) +ASM_PFX(InternalMemScanMem16): + push edi + mov ecx, [esp + 12] + mov edi, [esp + 8] + mov eax, [esp + 16] + repne scasw + lea eax, [edi - 2] + cmovnz eax, ecx + pop edi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ScanMem32.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ScanMem32.nasm new file mode 100644 index 000000000..9d602f0f4 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ScanMem32.nasm @@ -0,0 +1,48 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; ScanMem32.Asm +; +; Abstract: +; +; ScanMem32 function +; +; Notes: +; +; The following BaseMemoryLib instances contain the same copy of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; BaseMemoryLibOptDxe +; BaseMemoryLibOptPei +; +;------------------------------------------------------------------------------ + + SECTION .text + +;------------------------------------------------------------------------------ +; CONST VOID * +; EFIAPI +; InternalMemScanMem32 ( +; IN CONST VOID *Buffer, +; IN UINTN Length, +; IN UINT32 Value +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemScanMem32) +ASM_PFX(InternalMemScanMem32): + push edi + mov ecx, [esp + 12] + mov edi, [esp + 8] + mov eax, [esp + 16] + repne scasd + lea eax, [edi - 4] + cmovnz eax, ecx + pop edi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ScanMem64.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ScanMem64.nasm new file mode 100644 index 000000000..674bcf03e --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ScanMem64.nasm @@ -0,0 +1,57 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; ScanMem64.Asm +; +; Abstract: +; +; ScanMem64 function +; +; Notes: +; +; The following BaseMemoryLib instances contain the same copy of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; BaseMemoryLibOptDxe +; BaseMemoryLibOptPei +; +;------------------------------------------------------------------------------ + + SECTION .text + +;------------------------------------------------------------------------------ +; CONST VOID * +; EFIAPI +; InternalMemScanMem64 ( +; IN CONST VOID *Buffer, +; IN UINTN Length, +; IN UINT64 Value +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemScanMem64) +ASM_PFX(InternalMemScanMem64): + push edi + mov ecx, [esp + 12] + mov eax, [esp + 16] + mov edx, [esp + 20] + mov edi, [esp + 8] +.0: + cmp eax, [edi] + lea edi, [edi + 8] + loopne .0 + jne .1 + cmp edx, [edi - 4] + jecxz .1 + jne .0 +.1: + lea eax, [edi - 8] + cmovne eax, ecx + pop edi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ScanMem8.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ScanMem8.nasm new file mode 100644 index 000000000..9244e559b --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ScanMem8.nasm @@ -0,0 +1,48 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; ScanMem8.Asm +; +; Abstract: +; +; ScanMem8 function +; +; Notes: +; +; The following BaseMemoryLib instances contain the same copy of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; BaseMemoryLibOptDxe +; BaseMemoryLibOptPei +; +;------------------------------------------------------------------------------ + + SECTION .text + +;------------------------------------------------------------------------------ +; CONST VOID * +; EFIAPI +; InternalMemScanMem8 ( +; IN CONST VOID *Buffer, +; IN UINTN Length, +; IN UINT8 Value +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemScanMem8) +ASM_PFX(InternalMemScanMem8): + push edi + mov ecx, [esp + 12] + mov edi, [esp + 8] + mov al, [esp + 16] + repne scasb + lea eax, [edi - 1] + cmovnz eax, ecx + pop edi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/SetMem.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/SetMem.nasm new file mode 100644 index 000000000..8af2ea552 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/SetMem.nasm @@ -0,0 +1,62 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; SetMem.nasm +; +; Abstract: +; +; SetMem function +; +; Notes: +; +;------------------------------------------------------------------------------ + + SECTION .text + +;------------------------------------------------------------------------------ +; VOID * +; EFIAPI +; InternalMemSetMem ( +; IN VOID *Buffer, +; IN UINTN Count, +; IN UINT8 Value +; ) +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemSetMem) +ASM_PFX(InternalMemSetMem): + push edi + mov al, [esp + 16] + mov ah, al + shrd edx, eax, 16 + shld eax, edx, 16 + mov ecx, [esp + 12] ; ecx <- Count + mov edi, [esp + 8] ; edi <- Buffer + mov edx, ecx + and edx, 7 + shr ecx, 3 ; # of Qwords to set + jz @SetBytes + add esp, -0x10 + movq [esp], mm0 ; save mm0 + movq [esp + 8], mm1 ; save mm1 + movd mm0, eax + movd mm1, eax + psllq mm0, 32 + por mm0, mm1 ; fill mm0 with 8 Value's +.0: + movq [edi], mm0 + add edi, 8 + loop .0 + movq mm0, [esp] ; restore mm0 + movq mm1, [esp + 8] ; restore mm1 + add esp, 0x10 ; stack cleanup +@SetBytes: + mov ecx, edx + rep stosb + mov eax, [esp + 8] ; eax <- Buffer as return value + pop edi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/SetMem16.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/SetMem16.nasm new file mode 100644 index 000000000..065bbe3b9 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/SetMem16.nasm @@ -0,0 +1,55 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; SetMem16.nasm +; +; Abstract: +; +; SetMem16 function +; +; Notes: +; +;------------------------------------------------------------------------------ + + SECTION .text + +;------------------------------------------------------------------------------ +; VOID * +; EFIAPI +; InternalMemSetMem16 ( +; IN VOID *Buffer, +; IN UINTN Count, +; IN UINT16 Value +; ) +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemSetMem16) +ASM_PFX(InternalMemSetMem16): + push edi + mov eax, [esp + 16] + shrd edx, eax, 16 + shld eax, edx, 16 + mov edx, [esp + 12] + mov edi, [esp + 8] + mov ecx, edx + and edx, 3 + shr ecx, 2 + jz @SetWords + movd mm0, eax + movd mm1, eax + psllq mm0, 32 + por mm0, mm1 +.0: + movq [edi], mm0 + add edi, 8 + loop .0 +@SetWords: + mov ecx, edx + rep stosw + mov eax, [esp + 8] + pop edi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/SetMem32.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/SetMem32.nasm new file mode 100644 index 000000000..3ee7b431e --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/SetMem32.nasm @@ -0,0 +1,49 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; SetMem32.nasm +; +; Abstract: +; +; SetMem32 function +; +; Notes: +; +;------------------------------------------------------------------------------ + + SECTION .text + +;------------------------------------------------------------------------------ +; VOID * +; EFIAPI +; InternalMemSetMem32 ( +; IN VOID *Buffer, +; IN UINTN Count, +; IN UINT32 Value +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemSetMem32) +ASM_PFX(InternalMemSetMem32): + mov eax, [esp + 4] ; eax <- Buffer as return value + mov ecx, [esp + 8] ; ecx <- Count + movd mm0, dword [esp + 12] ; mm0 <- Value + shr ecx, 1 ; ecx <- number of qwords to set + mov edx, eax ; edx <- Buffer + jz @SetDwords + movq mm1, mm0 + psllq mm1, 32 + por mm0, mm1 +.0: + movq qword [edx], mm0 + lea edx, [edx + 8] ; use "lea" to avoid change in flags + loop .0 +@SetDwords: + jnc .1 + movd dword [edx], mm0 +.1: + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/SetMem64.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/SetMem64.nasm new file mode 100644 index 000000000..2338cf0ab --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/SetMem64.nasm @@ -0,0 +1,40 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; SetMem64.nasm +; +; Abstract: +; +; SetMem64 function +; +; Notes: +; +;------------------------------------------------------------------------------ + + SECTION .text + +;------------------------------------------------------------------------------ +; VOID * +; EFIAPI +; InternalMemSetMem64 ( +; IN VOID *Buffer, +; IN UINTN Count, +; IN UINT64 Value +; ) +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemSetMem64) +ASM_PFX(InternalMemSetMem64): + mov eax, [esp + 4] + mov ecx, [esp + 8] + movq mm0, [esp + 12] + mov edx, eax +.0: + movq [edx], mm0 + add edx, 8 + loop .0 + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ZeroMem.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ZeroMem.nasm new file mode 100644 index 000000000..3f5a28e3a --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/Ia32/ZeroMem.nasm @@ -0,0 +1,48 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; ZeroMem.nasm +; +; Abstract: +; +; ZeroMem function +; +; Notes: +; +;------------------------------------------------------------------------------ + + SECTION .text + +;------------------------------------------------------------------------------ +; VOID * +; InternalMemZeroMem ( +; IN VOID *Buffer, +; IN UINTN Count +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemZeroMem) +ASM_PFX(InternalMemZeroMem): + push edi + mov edi, [esp + 8] + mov ecx, [esp + 12] + mov edx, ecx + shr ecx, 3 + jz @ZeroBytes + pxor mm0, mm0 +.0: + movq [edi], mm0 + add edi, 8 + loop .0 +@ZeroBytes: + and edx, 7 + xor eax, eax + mov ecx, edx + rep stosb + mov eax, [esp + 8] + pop edi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/IsZeroBufferWrapper.c b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/IsZeroBufferWrapper.c new file mode 100644 index 000000000..10be08107 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/IsZeroBufferWrapper.c @@ -0,0 +1,48 @@ +/** @file + Implementation of IsZeroBuffer function. + + The following BaseMemoryLib instances contain the same copy of this file: + + BaseMemoryLib + BaseMemoryLibMmx + BaseMemoryLibSse2 + BaseMemoryLibRepStr + BaseMemoryLibOptDxe + BaseMemoryLibOptPei + PeiMemoryLib + UefiMemoryLib + + Copyright (c) 2016, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "MemLibInternals.h" + +/** + 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 + ) +{ + ASSERT (!(Buffer == NULL && Length > 0)); + ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer)); + return InternalMemIsZeroBuffer (Buffer, Length); +} diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/MemLibGuid.c b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/MemLibGuid.c new file mode 100644 index 000000000..319487dda --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/MemLibGuid.c @@ -0,0 +1,165 @@ +/** @file + Implementation of GUID functions. + + The following BaseMemoryLib instances contain the same copy of this file: + + BaseMemoryLib + BaseMemoryLibMmx + BaseMemoryLibSse2 + BaseMemoryLibRepStr + BaseMemoryLibOptDxe + BaseMemoryLibOptPei + PeiMemoryLib + UefiMemoryLib + + Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "MemLibInternals.h" + +/** + 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 + ) +{ + WriteUnaligned64 ( + (UINT64*)DestinationGuid, + ReadUnaligned64 ((CONST UINT64*)SourceGuid) + ); + WriteUnaligned64 ( + (UINT64*)DestinationGuid + 1, + ReadUnaligned64 ((CONST UINT64*)SourceGuid + 1) + ); + return DestinationGuid; +} + +/** + 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 + ) +{ + UINT64 LowPartOfGuid1; + UINT64 LowPartOfGuid2; + UINT64 HighPartOfGuid1; + UINT64 HighPartOfGuid2; + + LowPartOfGuid1 = ReadUnaligned64 ((CONST UINT64*) Guid1); + LowPartOfGuid2 = ReadUnaligned64 ((CONST UINT64*) Guid2); + HighPartOfGuid1 = ReadUnaligned64 ((CONST UINT64*) Guid1 + 1); + HighPartOfGuid2 = ReadUnaligned64 ((CONST UINT64*) Guid2 + 1); + + return (BOOLEAN) (LowPartOfGuid1 == LowPartOfGuid2 && HighPartOfGuid1 == HighPartOfGuid2); +} + +/** + Scans a target buffer for a GUID, and returns a pointer to the matching GUID + in the target buffer. + + This function searches the target 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 or NULL otherwise. + +**/ +VOID * +EFIAPI +ScanGuid ( + IN CONST VOID *Buffer, + IN UINTN Length, + IN CONST GUID *Guid + ) +{ + CONST GUID *GuidPtr; + + ASSERT (((UINTN)Buffer & (sizeof (Guid->Data1) - 1)) == 0); + ASSERT (Length <= (MAX_ADDRESS - (UINTN)Buffer + 1)); + ASSERT ((Length & (sizeof (*GuidPtr) - 1)) == 0); + + GuidPtr = (GUID*)Buffer; + Buffer = GuidPtr + Length / sizeof (*GuidPtr); + while (GuidPtr < (CONST GUID*)Buffer) { + if (CompareGuid (GuidPtr, Guid)) { + return (VOID*)GuidPtr; + } + GuidPtr++; + } + return NULL; +} + +/** + 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 + ) +{ + UINT64 LowPartOfGuid; + UINT64 HighPartOfGuid; + + LowPartOfGuid = ReadUnaligned64 ((CONST UINT64*) Guid); + HighPartOfGuid = ReadUnaligned64 ((CONST UINT64*) Guid + 1); + + return (BOOLEAN) (LowPartOfGuid == 0 && HighPartOfGuid == 0); +} diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/MemLibInternals.h b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/MemLibInternals.h new file mode 100644 index 000000000..ae3dbaadc --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/MemLibInternals.h @@ -0,0 +1,245 @@ +/** @file + Declaration of internal functions for Base Memory Library. + + The following BaseMemoryLib instances contain the same copy of this file: + BaseMemoryLib + BaseMemoryLibMmx + BaseMemoryLibSse2 + BaseMemoryLibRepStr + BaseMemoryLibOptDxe + BaseMemoryLibOptPei + + Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef __MEM_LIB_INTERNALS__ +#define __MEM_LIB_INTERNALS__ + +#include +#include +#include +#include + +/** + Copy Length bytes from Source to Destination. + + @param DestinationBuffer The target of the copy request. + @param SourceBuffer The place to copy from. + @param Length The number of bytes to copy + + @return Destination + +**/ +VOID * +EFIAPI +InternalMemCopyMem ( + OUT VOID *DestinationBuffer, + IN CONST VOID *SourceBuffer, + IN UINTN Length + ); + +/** + Set Buffer to Value for Size bytes. + + @param Buffer The memory to set. + @param Length The number of bytes to set + @param Value The value of the set operation. + + @return Buffer + +**/ +VOID * +EFIAPI +InternalMemSetMem ( + OUT VOID *Buffer, + IN UINTN Length, + IN UINT8 Value + ); + +/** + Fills a target buffer with a 16-bit value, and returns the target buffer. + + @param Buffer The pointer to the target buffer to fill. + @param Length The count of 16-bit value to fill. + @param Value The value with which to fill Length bytes of Buffer. + + @return Buffer + +**/ +VOID * +EFIAPI +InternalMemSetMem16 ( + OUT VOID *Buffer, + IN UINTN Length, + IN UINT16 Value + ); + +/** + Fills a target buffer with a 32-bit value, and returns the target buffer. + + @param Buffer The pointer to the target buffer to fill. + @param Length The count of 32-bit value to fill. + @param Value The value with which to fill Length bytes of Buffer. + + @return Buffer + +**/ +VOID * +EFIAPI +InternalMemSetMem32 ( + OUT VOID *Buffer, + IN UINTN Length, + IN UINT32 Value + ); + +/** + Fills a target buffer with a 64-bit value, and returns the target buffer. + + @param Buffer The pointer to the target buffer to fill. + @param Length The count of 64-bit value to fill. + @param Value The value with which to fill Length bytes of Buffer. + + @return Buffer + +**/ +VOID * +EFIAPI +InternalMemSetMem64 ( + OUT VOID *Buffer, + IN UINTN Length, + IN UINT64 Value + ); + +/** + Set Buffer to 0 for Size bytes. + + @param Buffer The memory to set. + @param Length The number of bytes to set. + + @return Buffer + +**/ +VOID * +EFIAPI +InternalMemZeroMem ( + OUT VOID *Buffer, + IN UINTN Length + ); + +/** + Compares two memory buffers of a given length. + + @param DestinationBuffer The first memory buffer. + @param SourceBuffer The second memory buffer. + @param Length The length of DestinationBuffer and SourceBuffer memory + regions to compare. Must be non-zero. + + @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 +InternalMemCompareMem ( + 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. + + @param Buffer The pointer to the target buffer to scan. + @param Length The count of 8-bit value to scan. Must be non-zero. + @param Value The value to search for in the target buffer. + + @return The pointer to the first occurrence or NULL if not found. + +**/ +CONST VOID * +EFIAPI +InternalMemScanMem8 ( + 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. + + @param Buffer The pointer to the target buffer to scan. + @param Length The count of 16-bit value to scan. Must be non-zero. + @param Value The value to search for in the target buffer. + + @return The pointer to the first occurrence or NULL if not found. + +**/ +CONST VOID * +EFIAPI +InternalMemScanMem16 ( + 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. + + @param Buffer The pointer to the target buffer to scan. + @param Length The count of 32-bit value to scan. Must be non-zero. + @param Value The value to search for in the target buffer. + + @return The pointer to the first occurrence or NULL if not found. + +**/ +CONST VOID * +EFIAPI +InternalMemScanMem32 ( + 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. + + @param Buffer The pointer to the target buffer to scan. + @param Length The count of 64-bit value to scan. Must be non-zero. + @param Value The value to search for in the target buffer. + + @return The pointer to the first occurrence or NULL if not found. + +**/ +CONST VOID * +EFIAPI +InternalMemScanMem64 ( + IN CONST VOID *Buffer, + IN UINTN Length, + IN UINT64 Value + ); + +/** + Checks whether the contents of a buffer are all zeros. + + @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 +InternalMemIsZeroBuffer ( + IN CONST VOID *Buffer, + IN UINTN Length + ); + +#endif diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ScanMem16Wrapper.c b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ScanMem16Wrapper.c new file mode 100644 index 000000000..820131352 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ScanMem16Wrapper.c @@ -0,0 +1,61 @@ +/** @file + ScanMem16() implementation. + + The following BaseMemoryLib instances contain the same copy of this file: + + BaseMemoryLib + BaseMemoryLibMmx + BaseMemoryLibSse2 + BaseMemoryLibRepStr + BaseMemoryLibOptDxe + BaseMemoryLibOptPei + PeiMemoryLib + UefiMemoryLib + + Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "MemLibInternals.h" + +/** + 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 the target 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 or NULL otherwise. + +**/ +VOID * +EFIAPI +ScanMem16 ( + IN CONST VOID *Buffer, + IN UINTN Length, + IN UINT16 Value + ) +{ + if (Length == 0) { + return NULL; + } + + ASSERT (Buffer != NULL); + ASSERT (((UINTN)Buffer & (sizeof (Value) - 1)) == 0); + ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer)); + ASSERT ((Length & (sizeof (Value) - 1)) == 0); + + return (VOID*)InternalMemScanMem16 (Buffer, Length / sizeof (Value), Value); +} diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ScanMem32Wrapper.c b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ScanMem32Wrapper.c new file mode 100644 index 000000000..7b66ccdcb --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ScanMem32Wrapper.c @@ -0,0 +1,60 @@ +/** @file + ScanMem32() implementation. + + The following BaseMemoryLib instances contain the same copy of this file: + BaseMemoryLib + BaseMemoryLibMmx + BaseMemoryLibSse2 + BaseMemoryLibRepStr + BaseMemoryLibOptDxe + BaseMemoryLibOptPei + PeiMemoryLib + UefiMemoryLib + + Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "MemLibInternals.h" + +/** + 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 the target 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 Thevalue to search for in the target buffer. + + @return A pointer to the matching byte in the target buffer or NULL otherwise. + +**/ +VOID * +EFIAPI +ScanMem32 ( + IN CONST VOID *Buffer, + IN UINTN Length, + IN UINT32 Value + ) +{ + if (Length == 0) { + return NULL; + } + + ASSERT (Buffer != NULL); + ASSERT (((UINTN)Buffer & (sizeof (Value) - 1)) == 0); + ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer)); + ASSERT ((Length & (sizeof (Value) - 1)) == 0); + + return (VOID*)InternalMemScanMem32 (Buffer, Length / sizeof (Value), Value); +} diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ScanMem64Wrapper.c b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ScanMem64Wrapper.c new file mode 100644 index 000000000..a617d870a --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ScanMem64Wrapper.c @@ -0,0 +1,61 @@ +/** @file + ScanMem64() implementation. + + The following BaseMemoryLib instances contain the same copy of this file: + + BaseMemoryLib + BaseMemoryLibMmx + BaseMemoryLibSse2 + BaseMemoryLibRepStr + BaseMemoryLibOptDxe + BaseMemoryLibOptPei + PeiMemoryLib + UefiMemoryLib + + Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "MemLibInternals.h" + +/** + 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 the target 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 or NULL otherwise. + +**/ +VOID * +EFIAPI +ScanMem64 ( + IN CONST VOID *Buffer, + IN UINTN Length, + IN UINT64 Value + ) +{ + if (Length == 0) { + return NULL; + } + + ASSERT (Buffer != NULL); + ASSERT (((UINTN)Buffer & (sizeof (Value) - 1)) == 0); + ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer)); + ASSERT ((Length & (sizeof (Value) - 1)) == 0); + + return (VOID*)InternalMemScanMem64 (Buffer, Length / sizeof (Value), Value); +} diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ScanMem8Wrapper.c b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ScanMem8Wrapper.c new file mode 100644 index 000000000..f2bf7d6f6 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ScanMem8Wrapper.c @@ -0,0 +1,93 @@ +/** @file + ScanMem8() and ScanMemN() implementation. + + The following BaseMemoryLib instances contain the same copy of this file: + + BaseMemoryLib + BaseMemoryLibMmx + BaseMemoryLibSse2 + BaseMemoryLibRepStr + BaseMemoryLibOptDxe + BaseMemoryLibOptPei + PeiMemoryLib + UefiMemoryLib + + Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "MemLibInternals.h" + +/** + 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 the target 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 or NULL otherwise. + +**/ +VOID * +EFIAPI +ScanMem8 ( + IN CONST VOID *Buffer, + IN UINTN Length, + IN UINT8 Value + ) +{ + if (Length == 0) { + return NULL; + } + ASSERT (Buffer != NULL); + ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer)); + + return (VOID*)InternalMemScanMem8 (Buffer, Length, 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 the target 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 or NULL otherwise. + +**/ +VOID * +EFIAPI +ScanMemN ( + IN CONST VOID *Buffer, + IN UINTN Length, + IN UINTN Value + ) +{ + if (sizeof (UINTN) == sizeof (UINT64)) { + return ScanMem64 (Buffer, Length, (UINT64)Value); + } else { + return ScanMem32 (Buffer, Length, (UINT32)Value); + } +} + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/SetMem16Wrapper.c b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/SetMem16Wrapper.c new file mode 100644 index 000000000..9ac46416a --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/SetMem16Wrapper.c @@ -0,0 +1,58 @@ +/** @file + SetMem16() implementation. + + The following BaseMemoryLib instances contain the same copy of this file: + BaseMemoryLib + BaseMemoryLibMmx + BaseMemoryLibSse2 + BaseMemoryLibRepStr + BaseMemoryLibOptDxe + BaseMemoryLibOptPei + PeiMemoryLib + UefiMemoryLib + + Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "MemLibInternals.h" + +/** + 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 + ) +{ + if (Length == 0) { + return Buffer; + } + + ASSERT (Buffer != NULL); + ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer)); + ASSERT ((((UINTN)Buffer) & (sizeof (Value) - 1)) == 0); + ASSERT ((Length & (sizeof (Value) - 1)) == 0); + + return InternalMemSetMem16 (Buffer, Length / sizeof (Value), Value); +} diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/SetMem32Wrapper.c b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/SetMem32Wrapper.c new file mode 100644 index 000000000..e504deb9e --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/SetMem32Wrapper.c @@ -0,0 +1,58 @@ +/** @file + SetMem32() implementation. + + The following BaseMemoryLib instances contain the same copy of this file: + BaseMemoryLib + BaseMemoryLibMmx + BaseMemoryLibSse2 + BaseMemoryLibRepStr + BaseMemoryLibOptDxe + BaseMemoryLibOptPei + PeiMemoryLib + UefiMemoryLib + + Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "MemLibInternals.h" + +/** + 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 + ) +{ + if (Length == 0) { + return Buffer; + } + + ASSERT (Buffer != NULL); + ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer)); + ASSERT ((((UINTN)Buffer) & (sizeof (Value) - 1)) == 0); + ASSERT ((Length & (sizeof (Value) - 1)) == 0); + + return InternalMemSetMem32 (Buffer, Length / sizeof (Value), Value); +} diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/SetMem64Wrapper.c b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/SetMem64Wrapper.c new file mode 100644 index 000000000..fbb376236 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/SetMem64Wrapper.c @@ -0,0 +1,58 @@ +/** @file + SetMem64() implementation. + + The following BaseMemoryLib instances contain the same copy of this file: + BaseMemoryLib + BaseMemoryLibMmx + BaseMemoryLibSse2 + BaseMemoryLibRepStr + BaseMemoryLibOptDxe + BaseMemoryLibOptPei + PeiMemoryLib + UefiMemoryLib + + Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "MemLibInternals.h" + +/** + 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 + ) +{ + if (Length == 0) { + return Buffer; + } + + ASSERT (Buffer != NULL); + ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer)); + ASSERT ((((UINTN)Buffer) & (sizeof (Value) - 1)) == 0); + ASSERT ((Length & (sizeof (Value) - 1)) == 0); + + return InternalMemSetMem64 (Buffer, Length / sizeof (Value), Value); +} diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/SetMemWrapper.c b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/SetMemWrapper.c new file mode 100644 index 000000000..39ec8cb0d --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/SetMemWrapper.c @@ -0,0 +1,85 @@ +/** @file + SetMem() and SetMemN() implementation. + + The following BaseMemoryLib instances contain the same copy of this file: + + BaseMemoryLib + BaseMemoryLibMmx + BaseMemoryLibSse2 + BaseMemoryLibRepStr + BaseMemoryLibOptDxe + BaseMemoryLibOptPei + PeiMemoryLib + UefiMemoryLib + + Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "MemLibInternals.h" + +/** + 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 + ) +{ + if (Length == 0) { + return Buffer; + } + + ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer)); + + return InternalMemSetMem (Buffer, Length, 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 + ) +{ + if (sizeof (UINTN) == sizeof (UINT64)) { + return SetMem64 (Buffer, Length, (UINT64)Value); + } else { + return SetMem32 (Buffer, Length, (UINT32)Value); + } +} diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/CompareMem.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/CompareMem.nasm new file mode 100644 index 000000000..5514ab663 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/CompareMem.nasm @@ -0,0 +1,52 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; CompareMem.Asm +; +; Abstract: +; +; CompareMem function +; +; Notes: +; +; The following BaseMemoryLib instances contain the same copy of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; BaseMemoryLibOptDxe +; BaseMemoryLibOptPei +; +;------------------------------------------------------------------------------ + + DEFAULT REL + SECTION .text + +;------------------------------------------------------------------------------ +; INTN +; EFIAPI +; InternalMemCompareMem ( +; IN CONST VOID *DestinationBuffer, +; IN CONST VOID *SourceBuffer, +; IN UINTN Length +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemCompareMem) +ASM_PFX(InternalMemCompareMem): + push rsi + push rdi + mov rsi, rcx + mov rdi, rdx + mov rcx, r8 + repe cmpsb + movzx rax, byte [rsi - 1] + movzx rdx, byte [rdi - 1] + sub rax, rdx + pop rdi + pop rsi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.nasm new file mode 100644 index 000000000..5769c00bf --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.nasm @@ -0,0 +1,68 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; CopyMem.nasm +; +; Abstract: +; +; CopyMem function +; +; Notes: +; +;------------------------------------------------------------------------------ + + DEFAULT REL + SECTION .text + +;------------------------------------------------------------------------------ +; VOID * +; EFIAPI +; InternalMemCopyMem ( +; OUT VOID *DestinationBuffer, +; IN CONST VOID *SourceBuffer, +; IN UINTN Length +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemCopyMem) +ASM_PFX(InternalMemCopyMem): + push rsi + push rdi + mov rsi, rdx ; rsi <- Source + mov rdi, rcx ; rdi <- Destination + lea r9, [rsi + r8 - 1] ; r9 <- End of Source + cmp rsi, rdi + mov rax, rdi ; rax <- Destination as return value + jae .0 + cmp r9, rdi + jae @CopyBackward ; Copy backward if overlapped +.0: + mov rcx, r8 + and r8, 7 + shr rcx, 3 ; rcx <- # of Qwords to copy + jz @CopyBytes + DB 0x49, 0xf, 0x7e, 0xc2 ; movd r10, mm0 (Save mm0 in r10) +.1: + DB 0xf, 0x6f, 0x6 ; movd mm0, [rsi] + DB 0xf, 0xe7, 0x7 ; movntq [rdi], mm0 + add rsi, 8 + add rdi, 8 + loop .1 + mfence + DB 0x49, 0xf, 0x6e, 0xc2 ; movd mm0, r10 (Restore mm0) + jmp @CopyBytes +@CopyBackward: + mov rsi, r9 ; rsi <- End of Source + lea rdi, [rdi + r8 - 1] ; rdi <- End of Destination + std ; set direction flag +@CopyBytes: + mov rcx, r8 + rep movsb ; Copy bytes backward + cld + pop rdi + pop rsi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/IsZeroBuffer.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/IsZeroBuffer.nasm new file mode 100644 index 000000000..a6e1d817f --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/IsZeroBuffer.nasm @@ -0,0 +1,49 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2016, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; IsZeroBuffer.nasm +; +; Abstract: +; +; IsZeroBuffer function +; +; Notes: +; +;------------------------------------------------------------------------------ + + DEFAULT REL + SECTION .text + +;------------------------------------------------------------------------------ +; BOOLEAN +; EFIAPI +; InternalMemIsZeroBuffer ( +; IN CONST VOID *Buffer, +; IN UINTN Length +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemIsZeroBuffer) +ASM_PFX(InternalMemIsZeroBuffer): + push rdi + mov rdi, rcx ; rdi <- Buffer + mov rcx, rdx ; rcx <- Length + shr rcx, 3 ; rcx <- number of qwords + and rdx, 7 ; rdx <- number of trailing bytes + xor rax, rax ; rax <- 0, also set ZF + repe scasq + jnz @ReturnFalse ; ZF=0 means non-zero element found + mov rcx, rdx + repe scasb + jnz @ReturnFalse + pop rdi + mov rax, 1 ; return TRUE + ret +@ReturnFalse: + pop rdi + xor rax, rax + ret ; return FALSE + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ScanMem16.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ScanMem16.nasm new file mode 100644 index 000000000..eb385a4a2 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ScanMem16.nasm @@ -0,0 +1,49 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; ScanMem16.Asm +; +; Abstract: +; +; ScanMem16 function +; +; Notes: +; +; The following BaseMemoryLib instances contain the same copy of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; BaseMemoryLibOptDxe +; BaseMemoryLibOptPei +; +;------------------------------------------------------------------------------ + + DEFAULT REL + SECTION .text + +;------------------------------------------------------------------------------ +; CONST VOID * +; EFIAPI +; InternalMemScanMem16 ( +; IN CONST VOID *Buffer, +; IN UINTN Length, +; IN UINT16 Value +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemScanMem16) +ASM_PFX(InternalMemScanMem16): + push rdi + mov rdi, rcx + mov rax, r8 + mov rcx, rdx + repne scasw + lea rax, [rdi - 2] + cmovnz rax, rcx + pop rdi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ScanMem32.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ScanMem32.nasm new file mode 100644 index 000000000..6fccdf2d1 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ScanMem32.nasm @@ -0,0 +1,49 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; ScanMem32.Asm +; +; Abstract: +; +; ScanMem32 function +; +; Notes: +; +; The following BaseMemoryLib instances contain the same copy of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; BaseMemoryLibOptDxe +; BaseMemoryLibOptPei +; +;------------------------------------------------------------------------------ + + DEFAULT REL + SECTION .text + +;------------------------------------------------------------------------------ +; CONST VOID * +; EFIAPI +; InternalMemScanMem32 ( +; IN CONST VOID *Buffer, +; IN UINTN Length, +; IN UINT32 Value +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemScanMem32) +ASM_PFX(InternalMemScanMem32): + push rdi + mov rdi, rcx + mov rax, r8 + mov rcx, rdx + repne scasd + lea rax, [rdi - 4] + cmovnz rax, rcx + pop rdi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ScanMem64.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ScanMem64.nasm new file mode 100644 index 000000000..6659aef44 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ScanMem64.nasm @@ -0,0 +1,49 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; ScanMem64.Asm +; +; Abstract: +; +; ScanMem64 function +; +; Notes: +; +; The following BaseMemoryLib instances contain the same copy of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; BaseMemoryLibOptDxe +; BaseMemoryLibOptPei +; +;------------------------------------------------------------------------------ + + DEFAULT REL + SECTION .text + +;------------------------------------------------------------------------------ +; CONST VOID * +; EFIAPI +; InternalMemScanMem64 ( +; IN CONST VOID *Buffer, +; IN UINTN Length, +; IN UINT64 Value +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemScanMem64) +ASM_PFX(InternalMemScanMem64): + push rdi + mov rdi, rcx + mov rax, r8 + mov rcx, rdx + repne scasq + lea rax, [rdi - 8] + cmovnz rax, rcx + pop rdi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ScanMem8.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ScanMem8.nasm new file mode 100644 index 000000000..16fd931c0 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ScanMem8.nasm @@ -0,0 +1,49 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; ScanMem8.Asm +; +; Abstract: +; +; ScanMem8 function +; +; Notes: +; +; The following BaseMemoryLib instances contain the same copy of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; BaseMemoryLibOptDxe +; BaseMemoryLibOptPei +; +;------------------------------------------------------------------------------ + + DEFAULT REL + SECTION .text + +;------------------------------------------------------------------------------ +; CONST VOID * +; EFIAPI +; InternalMemScanMem8 ( +; IN CONST VOID *Buffer, +; IN UINTN Length, +; IN UINT8 Value +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemScanMem8) +ASM_PFX(InternalMemScanMem8): + push rdi + mov rdi, rcx + mov rcx, rdx + mov rax, r8 + repne scasb + lea rax, [rdi - 1] + cmovnz rax, rcx ; set rax to 0 if not found + pop rdi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/SetMem.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/SetMem.nasm new file mode 100644 index 000000000..450113ba8 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/SetMem.nasm @@ -0,0 +1,54 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; SetMem.nasm +; +; Abstract: +; +; SetMem function +; +; Notes: +; +;------------------------------------------------------------------------------ + + DEFAULT REL + SECTION .text + +;------------------------------------------------------------------------------ +; VOID * +; EFIAPI +; InternalMemSetMem ( +; OUT VOID *Buffer, +; IN UINTN Length, +; IN UINT8 Value +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemSetMem) +ASM_PFX(InternalMemSetMem): + push rdi + mov rax, r8 + mov ah, al + DB 0x48, 0xf, 0x6e, 0xc0 ; movd mm0, rax + mov r8, rcx + mov rdi, r8 ; rdi <- Buffer + mov rcx, rdx + and edx, 7 + shr rcx, 3 + jz @SetBytes + DB 0xf, 0x70, 0xC0, 0x0 ; pshufw mm0, mm0, 0h +.0: + DB 0xf, 0xe7, 0x7 ; movntq [rdi], mm0 + add rdi, 8 + loop .0 + mfence +@SetBytes: + mov ecx, edx + rep stosb + mov rax, r8 + pop rdi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/SetMem16.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/SetMem16.nasm new file mode 100644 index 000000000..4e1f4be2b --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/SetMem16.nasm @@ -0,0 +1,53 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; SetMem16.nasm +; +; Abstract: +; +; SetMem16 function +; +; Notes: +; +;------------------------------------------------------------------------------ + + DEFAULT REL + SECTION .text + +;------------------------------------------------------------------------------ +; VOID * +; EFIAPI +; InternalMemSetMem16 ( +; OUT VOID *Buffer, +; IN UINTN Length, +; IN UINT16 Value +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemSetMem16) +ASM_PFX(InternalMemSetMem16): + push rdi + mov rax, r8 + DB 0x48, 0xf, 0x6e, 0xc0 ; movd mm0, rax + mov r8, rcx + mov rdi, r8 + mov rcx, rdx + and edx, 3 + shr rcx, 2 + jz @SetWords + DB 0xf, 0x70, 0xC0, 0x0 ; pshufw mm0, mm0, 0h +.0: + DB 0xf, 0xe7, 0x7 ; movntq [rdi], mm0 + add rdi, 8 + loop .0 + mfence +@SetWords: + mov ecx, edx + rep stosw + mov rax, r8 + pop rdi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/SetMem32.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/SetMem32.nasm new file mode 100644 index 000000000..b3a738589 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/SetMem32.nasm @@ -0,0 +1,47 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; SetMem32.nasm +; +; Abstract: +; +; SetMem32 function +; +; Notes: +; +;------------------------------------------------------------------------------ + + DEFAULT REL + SECTION .text + +;------------------------------------------------------------------------------ +; VOID * +; InternalMemSetMem32 ( +; IN VOID *Buffer, +; IN UINTN Count, +; IN UINT32 Value +; ) +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemSetMem32) +ASM_PFX(InternalMemSetMem32): + DB 0x49, 0xf, 0x6e, 0xc0 ; movd mm0, r8 (Value) + mov rax, rcx ; rax <- Buffer + xchg rcx, rdx ; rcx <- Count rdx <- Buffer + shr rcx, 1 ; rcx <- # of qwords to set + jz @SetDwords + DB 0xf, 0x70, 0xC0, 0x44 ; pshufw mm0, mm0, 44h +.0: + DB 0xf, 0xe7, 0x2 ; movntq [rdx], mm0 + lea rdx, [rdx + 8] ; use "lea" to avoid flag changes + loop .0 + mfence +@SetDwords: + jnc .1 + DB 0xf, 0x7e, 0x2 ; movd [rdx], mm0 +.1: + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/SetMem64.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/SetMem64.nasm new file mode 100644 index 000000000..f517e1d23 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/SetMem64.nasm @@ -0,0 +1,40 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; SetMem64.nasm +; +; Abstract: +; +; SetMem64 function +; +; Notes: +; +;------------------------------------------------------------------------------ + + DEFAULT REL + SECTION .text + +;------------------------------------------------------------------------------ +; VOID * +; InternalMemSetMem64 ( +; IN VOID *Buffer, +; IN UINTN Count, +; IN UINT64 Value +; ) +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemSetMem64) +ASM_PFX(InternalMemSetMem64): + DB 0x49, 0xf, 0x6e, 0xc0 ; movd mm0, r8 (Value) + mov rax, rcx ; rax <- Buffer + xchg rcx, rdx ; rcx <- Count +.0: + DB 0xf, 0xe7, 0x2 ; movntq [rdx], mm0 + add rdx, 8 + loop .0 + mfence + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ZeroMem.nasm b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ZeroMem.nasm new file mode 100644 index 000000000..2a85f15b5 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/X64/ZeroMem.nasm @@ -0,0 +1,50 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; ZeroMem.nasm +; +; Abstract: +; +; ZeroMem function +; +; Notes: +; +;------------------------------------------------------------------------------ + + DEFAULT REL + SECTION .text + +;------------------------------------------------------------------------------ +; VOID * +; InternalMemZeroMem ( +; IN VOID *Buffer, +; IN UINTN Count +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(InternalMemZeroMem) +ASM_PFX(InternalMemZeroMem): + push rdi + mov rdi, rcx + mov rcx, rdx + mov r8, rdi + and edx, 7 + shr rcx, 3 + jz @ZeroBytes + DB 0xf, 0xef, 0xc0 ; pxor mm0, mm0 +.0: + DB 0xf, 0xe7, 7 ; movntq [rdi], mm0 + add rdi, 8 + loop .0 + DB 0xf, 0xae, 0xf0 ; mfence +@ZeroBytes: + xor eax, eax + mov ecx, edx + rep stosb + mov rax, r8 + pop rdi + ret + diff --git a/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ZeroMemWrapper.c b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ZeroMemWrapper.c new file mode 100644 index 000000000..596411896 --- /dev/null +++ b/roms/edk2/MdePkg/Library/BaseMemoryLibMmx/ZeroMemWrapper.c @@ -0,0 +1,50 @@ +/** @file + ZeroMem() implementation. + + The following BaseMemoryLib instances contain the same copy of this file: + + BaseMemoryLib + BaseMemoryLibMmx + BaseMemoryLibSse2 + BaseMemoryLibRepStr + BaseMemoryLibOptDxe + BaseMemoryLibOptPei + PeiMemoryLib + UefiMemoryLib + + Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "MemLibInternals.h" + +/** + 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 + ) +{ + if (Length == 0) { + return Buffer; + } + + ASSERT (Buffer != NULL); + ASSERT (Length <= (MAX_ADDRESS - (UINTN)Buffer + 1)); + return InternalMemZeroMem (Buffer, Length); +} -- cgit 1.2.3-korg