From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by ml01.01.org (Postfix) with ESMTP id 82CB61A1E01 for ; Wed, 17 Aug 2016 21:54:29 -0700 (PDT) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga101.fm.intel.com with ESMTP; 17 Aug 2016 21:54:29 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.28,537,1464678000"; d="scan'208";a="750256504" Received: from shwdeopenpsi014.ccr.corp.intel.com ([10.239.9.34]) by FMSMGA003.fm.intel.com with ESMTP; 17 Aug 2016 21:54:26 -0700 From: Hao Wu To: edk2-devel@lists.01.org, liming.gao@intel.com Cc: Hao Wu , Michael D Kinney , Jiewen Yao Date: Thu, 18 Aug 2016 12:53:58 +0800 Message-Id: <1471496040-11796-5-git-send-email-hao.a.wu@intel.com> X-Mailer: git-send-email 1.9.5.msysgit.0 In-Reply-To: <1471496040-11796-1-git-send-email-hao.a.wu@intel.com> References: <1471496040-11796-1-git-send-email-hao.a.wu@intel.com> Subject: [PATCH v2 4/6] MdePkg BaseMemoryLib: Add assembly implementation of API IsZeroBuffer() X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 18 Aug 2016 04:54:29 -0000 Add the implementation of API IsZeroBuffer() via assembly for the following library instances: BaseMemoryLibMmx BaseMemoryLibOptDxe BaseMemoryLibOptPei BaseMemoryLibRepStr Cc: Michael D Kinney Cc: Liming Gao Cc: Jiewen Yao Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Hao Wu --- .../Library/BaseMemoryLibMmx/BaseMemoryLibMmx.inf | 5 +- .../BaseMemoryLibMmx/Ia32/IsZeroBuffer.nasm | 55 ++++++++++++++++++++++ .../Library/BaseMemoryLibMmx/IsZeroBufferWrapper.c | 54 +++++++++++++++++++++ MdePkg/Library/BaseMemoryLibMmx/MemLibInternals.h | 19 +++++++- .../Library/BaseMemoryLibMmx/X64/IsZeroBuffer.nasm | 55 ++++++++++++++++++++++ .../BaseMemoryLibOptDxe/BaseMemoryLibOptDxe.inf | 6 ++- .../BaseMemoryLibOptDxe/Ia32/IsZeroBuffer.nasm | 55 ++++++++++++++++++++++ .../BaseMemoryLibOptDxe/IsZeroBufferWrapper.c | 54 +++++++++++++++++++++ .../Library/BaseMemoryLibOptDxe/MemLibInternals.h | 19 +++++++- .../BaseMemoryLibOptDxe/X64/IsZeroBuffer.nasm | 55 ++++++++++++++++++++++ .../BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf | 6 ++- .../BaseMemoryLibOptPei/Ia32/IsZeroBuffer.nasm | 55 ++++++++++++++++++++++ .../BaseMemoryLibOptPei/IsZeroBufferWrapper.c | 54 +++++++++++++++++++++ .../Library/BaseMemoryLibOptPei/MemLibInternals.h | 19 +++++++- .../BaseMemoryLibOptPei/X64/IsZeroBuffer.nasm | 55 ++++++++++++++++++++++ .../BaseMemoryLibRepStr/BaseMemoryLibRepStr.inf | 5 +- .../BaseMemoryLibRepStr/Ia32/IsZeroBuffer.nasm | 55 ++++++++++++++++++++++ .../BaseMemoryLibRepStr/IsZeroBufferWrapper.c | 54 +++++++++++++++++++++ .../Library/BaseMemoryLibRepStr/MemLibInternals.h | 19 +++++++- .../BaseMemoryLibRepStr/X64/IsZeroBuffer.nasm | 55 ++++++++++++++++++++++ 20 files changed, 746 insertions(+), 8 deletions(-) create mode 100644 MdePkg/Library/BaseMemoryLibMmx/Ia32/IsZeroBuffer.nasm create mode 100644 MdePkg/Library/BaseMemoryLibMmx/IsZeroBufferWrapper.c create mode 100644 MdePkg/Library/BaseMemoryLibMmx/X64/IsZeroBuffer.nasm create mode 100644 MdePkg/Library/BaseMemoryLibOptDxe/Ia32/IsZeroBuffer.nasm create mode 100644 MdePkg/Library/BaseMemoryLibOptDxe/IsZeroBufferWrapper.c create mode 100644 MdePkg/Library/BaseMemoryLibOptDxe/X64/IsZeroBuffer.nasm create mode 100644 MdePkg/Library/BaseMemoryLibOptPei/Ia32/IsZeroBuffer.nasm create mode 100644 MdePkg/Library/BaseMemoryLibOptPei/IsZeroBufferWrapper.c create mode 100644 MdePkg/Library/BaseMemoryLibOptPei/X64/IsZeroBuffer.nasm create mode 100644 MdePkg/Library/BaseMemoryLibRepStr/Ia32/IsZeroBuffer.nasm create mode 100644 MdePkg/Library/BaseMemoryLibRepStr/IsZeroBufferWrapper.c create mode 100644 MdePkg/Library/BaseMemoryLibRepStr/X64/IsZeroBuffer.nasm diff --git a/MdePkg/Library/BaseMemoryLibMmx/BaseMemoryLibMmx.inf b/MdePkg/Library/BaseMemoryLibMmx/BaseMemoryLibMmx.inf index a609073..af08b7d 100644 --- a/MdePkg/Library/BaseMemoryLibMmx/BaseMemoryLibMmx.inf +++ b/MdePkg/Library/BaseMemoryLibMmx/BaseMemoryLibMmx.inf @@ -4,7 +4,7 @@ # Base Memory Library that uses MMX registers for high performance. # Optimized for use in DXE. # -# Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
+# Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
# # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License @@ -46,6 +46,7 @@ SetMem16Wrapper.c SetMemWrapper.c CopyMemWrapper.c + IsZeroBufferWrapper.c MemLibGuid.c MemLibInternals.h @@ -94,6 +95,7 @@ Ia32/SetMem.asm Ia32/CopyMem.nasm Ia32/CopyMem.asm + Ia32/IsZeroBuffer.nasm [Sources.X64] X64/ZeroMem.nasm @@ -140,6 +142,7 @@ X64/SetMem.S X64/CopyMem.nasm X64/CopyMem.S + X64/IsZeroBuffer.nasm [LibraryClasses] diff --git a/MdePkg/Library/BaseMemoryLibMmx/Ia32/IsZeroBuffer.nasm b/MdePkg/Library/BaseMemoryLibMmx/Ia32/IsZeroBuffer.nasm new file mode 100644 index 0000000..a2e56a1 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibMmx/Ia32/IsZeroBuffer.nasm @@ -0,0 +1,55 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2016, Intel Corporation. All rights reserved.
+; This program and the accompanying materials +; are licensed and made available under the terms and conditions of the BSD License +; which accompanies this distribution. The full text of the license may be found at +; http://opensource.org/licenses/bsd-license.php. +; +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +; +; 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/MdePkg/Library/BaseMemoryLibMmx/IsZeroBufferWrapper.c b/MdePkg/Library/BaseMemoryLibMmx/IsZeroBufferWrapper.c new file mode 100644 index 0000000..c42c1aa --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibMmx/IsZeroBufferWrapper.c @@ -0,0 +1,54 @@ +/** @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.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#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/MdePkg/Library/BaseMemoryLibMmx/MemLibInternals.h b/MdePkg/Library/BaseMemoryLibMmx/MemLibInternals.h index 38bb975..cc89979 100644 --- a/MdePkg/Library/BaseMemoryLibMmx/MemLibInternals.h +++ b/MdePkg/Library/BaseMemoryLibMmx/MemLibInternals.h @@ -9,7 +9,7 @@ BaseMemoryLibOptDxe BaseMemoryLibOptPei - Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -231,4 +231,21 @@ InternalMemScanMem64 ( 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/MdePkg/Library/BaseMemoryLibMmx/X64/IsZeroBuffer.nasm b/MdePkg/Library/BaseMemoryLibMmx/X64/IsZeroBuffer.nasm new file mode 100644 index 0000000..00b1067 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibMmx/X64/IsZeroBuffer.nasm @@ -0,0 +1,55 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2016, Intel Corporation. All rights reserved.
+; This program and the accompanying materials +; are licensed and made available under the terms and conditions of the BSD License +; which accompanies this distribution. The full text of the license may be found at +; http://opensource.org/licenses/bsd-license.php. +; +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +; +; 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/MdePkg/Library/BaseMemoryLibOptDxe/BaseMemoryLibOptDxe.inf b/MdePkg/Library/BaseMemoryLibOptDxe/BaseMemoryLibOptDxe.inf index e637034..71691b9 100644 --- a/MdePkg/Library/BaseMemoryLibOptDxe/BaseMemoryLibOptDxe.inf +++ b/MdePkg/Library/BaseMemoryLibOptDxe/BaseMemoryLibOptDxe.inf @@ -4,7 +4,7 @@ # Base Memory Library that is optimized for use in DXE phase. # Uses REP, MMX, XMM registers as required for best performance. # -# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.
# # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License @@ -78,6 +78,7 @@ Ia32/SetMem.asm Ia32/CopyMem.nasm Ia32/CopyMem.asm + Ia32/IsZeroBuffer.nasm ScanMem64Wrapper.c ScanMem32Wrapper.c ScanMem16Wrapper.c @@ -89,6 +90,7 @@ SetMem16Wrapper.c SetMemWrapper.c CopyMemWrapper.c + IsZeroBufferWrapper.c MemLibGuid.c [Sources.X64] @@ -125,6 +127,7 @@ X64/CopyMem.nasm X64/CopyMem.asm X64/CopyMem.S + X64/IsZeroBuffer.nasm ScanMem64Wrapper.c ScanMem32Wrapper.c ScanMem16Wrapper.c @@ -136,6 +139,7 @@ SetMem16Wrapper.c SetMemWrapper.c CopyMemWrapper.c + IsZeroBufferWrapper.c MemLibGuid.c [Packages] diff --git a/MdePkg/Library/BaseMemoryLibOptDxe/Ia32/IsZeroBuffer.nasm b/MdePkg/Library/BaseMemoryLibOptDxe/Ia32/IsZeroBuffer.nasm new file mode 100644 index 0000000..a2e56a1 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibOptDxe/Ia32/IsZeroBuffer.nasm @@ -0,0 +1,55 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2016, Intel Corporation. All rights reserved.
+; This program and the accompanying materials +; are licensed and made available under the terms and conditions of the BSD License +; which accompanies this distribution. The full text of the license may be found at +; http://opensource.org/licenses/bsd-license.php. +; +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +; +; 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/MdePkg/Library/BaseMemoryLibOptDxe/IsZeroBufferWrapper.c b/MdePkg/Library/BaseMemoryLibOptDxe/IsZeroBufferWrapper.c new file mode 100644 index 0000000..c42c1aa --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibOptDxe/IsZeroBufferWrapper.c @@ -0,0 +1,54 @@ +/** @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.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#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/MdePkg/Library/BaseMemoryLibOptDxe/MemLibInternals.h b/MdePkg/Library/BaseMemoryLibOptDxe/MemLibInternals.h index b15e3c1..7d310bb 100644 --- a/MdePkg/Library/BaseMemoryLibOptDxe/MemLibInternals.h +++ b/MdePkg/Library/BaseMemoryLibOptDxe/MemLibInternals.h @@ -9,7 +9,7 @@ BaseMemoryLibOptDxe BaseMemoryLibOptPei - Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -231,4 +231,21 @@ InternalMemScanMem64 ( 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/MdePkg/Library/BaseMemoryLibOptDxe/X64/IsZeroBuffer.nasm b/MdePkg/Library/BaseMemoryLibOptDxe/X64/IsZeroBuffer.nasm new file mode 100644 index 0000000..00b1067 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibOptDxe/X64/IsZeroBuffer.nasm @@ -0,0 +1,55 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2016, Intel Corporation. All rights reserved.
+; This program and the accompanying materials +; are licensed and made available under the terms and conditions of the BSD License +; which accompanies this distribution. The full text of the license may be found at +; http://opensource.org/licenses/bsd-license.php. +; +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +; +; 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/MdePkg/Library/BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf b/MdePkg/Library/BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf index ff60e9e..21f060e 100644 --- a/MdePkg/Library/BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf +++ b/MdePkg/Library/BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf @@ -4,7 +4,7 @@ # Base Memory Library that is optimized for use in PEI phase. # Uses REP, MMX, XMM registers as required for best performance. # -# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.
# # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License @@ -78,6 +78,7 @@ Ia32/SetMem.asm Ia32/CopyMem.nasm Ia32/CopyMem.asm + Ia32/IsZeroBuffer.nasm ScanMem64Wrapper.c ScanMem32Wrapper.c ScanMem16Wrapper.c @@ -89,6 +90,7 @@ SetMem16Wrapper.c SetMemWrapper.c CopyMemWrapper.c + IsZeroBufferWrapper.c MemLibGuid.c [Sources.X64] @@ -125,6 +127,7 @@ X64/CopyMem.nasm X64/CopyMem.asm X64/CopyMem.S + X64/IsZeroBuffer.nasm ScanMem64Wrapper.c ScanMem32Wrapper.c ScanMem16Wrapper.c @@ -136,6 +139,7 @@ SetMem16Wrapper.c SetMemWrapper.c CopyMemWrapper.c + IsZeroBufferWrapper.c MemLibGuid.c diff --git a/MdePkg/Library/BaseMemoryLibOptPei/Ia32/IsZeroBuffer.nasm b/MdePkg/Library/BaseMemoryLibOptPei/Ia32/IsZeroBuffer.nasm new file mode 100644 index 0000000..a2e56a1 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibOptPei/Ia32/IsZeroBuffer.nasm @@ -0,0 +1,55 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2016, Intel Corporation. All rights reserved.
+; This program and the accompanying materials +; are licensed and made available under the terms and conditions of the BSD License +; which accompanies this distribution. The full text of the license may be found at +; http://opensource.org/licenses/bsd-license.php. +; +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +; +; 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/MdePkg/Library/BaseMemoryLibOptPei/IsZeroBufferWrapper.c b/MdePkg/Library/BaseMemoryLibOptPei/IsZeroBufferWrapper.c new file mode 100644 index 0000000..c42c1aa --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibOptPei/IsZeroBufferWrapper.c @@ -0,0 +1,54 @@ +/** @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.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#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/MdePkg/Library/BaseMemoryLibOptPei/MemLibInternals.h b/MdePkg/Library/BaseMemoryLibOptPei/MemLibInternals.h index 34eff54..72a51f3 100644 --- a/MdePkg/Library/BaseMemoryLibOptPei/MemLibInternals.h +++ b/MdePkg/Library/BaseMemoryLibOptPei/MemLibInternals.h @@ -9,7 +9,7 @@ BaseMemoryLibOptDxe BaseMemoryLibOptPei - Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -231,4 +231,21 @@ InternalMemScanMem64 ( 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/MdePkg/Library/BaseMemoryLibOptPei/X64/IsZeroBuffer.nasm b/MdePkg/Library/BaseMemoryLibOptPei/X64/IsZeroBuffer.nasm new file mode 100644 index 0000000..00b1067 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibOptPei/X64/IsZeroBuffer.nasm @@ -0,0 +1,55 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2016, Intel Corporation. All rights reserved.
+; This program and the accompanying materials +; are licensed and made available under the terms and conditions of the BSD License +; which accompanies this distribution. The full text of the license may be found at +; http://opensource.org/licenses/bsd-license.php. +; +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +; +; 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/MdePkg/Library/BaseMemoryLibRepStr/BaseMemoryLibRepStr.inf b/MdePkg/Library/BaseMemoryLibRepStr/BaseMemoryLibRepStr.inf index 9d7ce4b..729e26a 100644 --- a/MdePkg/Library/BaseMemoryLibRepStr/BaseMemoryLibRepStr.inf +++ b/MdePkg/Library/BaseMemoryLibRepStr/BaseMemoryLibRepStr.inf @@ -4,7 +4,7 @@ # Base Memory Library that uses REP string instructions for # high performance and small size. Optimized for use in PEI. # -# Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.
# # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License @@ -43,6 +43,7 @@ SetMem16Wrapper.c SetMemWrapper.c CopyMemWrapper.c + IsZeroBufferWrapper.c MemLibGuid.c [Sources.Ia32] @@ -90,6 +91,7 @@ Ia32/SetMem.asm Ia32/CopyMem.nasm Ia32/CopyMem.asm + Ia32/IsZeroBuffer.nasm [Sources.X64] X64/ScanMem64.nasm @@ -136,6 +138,7 @@ X64/SetMem.asm X64/CopyMem.nasm X64/CopyMem.asm + X64/IsZeroBuffer.nasm [Packages] MdePkg/MdePkg.dec diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/IsZeroBuffer.nasm b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/IsZeroBuffer.nasm new file mode 100644 index 0000000..a2e56a1 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/IsZeroBuffer.nasm @@ -0,0 +1,55 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2016, Intel Corporation. All rights reserved.
+; This program and the accompanying materials +; are licensed and made available under the terms and conditions of the BSD License +; which accompanies this distribution. The full text of the license may be found at +; http://opensource.org/licenses/bsd-license.php. +; +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +; +; 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/MdePkg/Library/BaseMemoryLibRepStr/IsZeroBufferWrapper.c b/MdePkg/Library/BaseMemoryLibRepStr/IsZeroBufferWrapper.c new file mode 100644 index 0000000..c42c1aa --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibRepStr/IsZeroBufferWrapper.c @@ -0,0 +1,54 @@ +/** @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.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#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/MdePkg/Library/BaseMemoryLibRepStr/MemLibInternals.h b/MdePkg/Library/BaseMemoryLibRepStr/MemLibInternals.h index cfca474..f795e83 100644 --- a/MdePkg/Library/BaseMemoryLibRepStr/MemLibInternals.h +++ b/MdePkg/Library/BaseMemoryLibRepStr/MemLibInternals.h @@ -9,7 +9,7 @@ BaseMemoryLibOptDxe BaseMemoryLibOptPei - Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -231,4 +231,21 @@ InternalMemScanMem64 ( 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/MdePkg/Library/BaseMemoryLibRepStr/X64/IsZeroBuffer.nasm b/MdePkg/Library/BaseMemoryLibRepStr/X64/IsZeroBuffer.nasm new file mode 100644 index 0000000..00b1067 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibRepStr/X64/IsZeroBuffer.nasm @@ -0,0 +1,55 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2016, Intel Corporation. All rights reserved.
+; This program and the accompanying materials +; are licensed and made available under the terms and conditions of the BSD License +; which accompanies this distribution. The full text of the license may be found at +; http://opensource.org/licenses/bsd-license.php. +; +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +; +; 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 + -- 1.9.5.msysgit.0