Add the implementation of API IsZeroBuffer() via assembly for the
following library instances:
BaseMemoryLibMmx
BaseMemoryLibOptDxe
BaseMemoryLibOptPei
BaseMemoryLibRepStr

Cc: Michael D Kinney <[email protected]>
Cc: Liming Gao <[email protected]>
Cc: Jiewen Yao <[email protected]>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Hao Wu <[email protected]>
---
 .../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.<BR>
+#  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
 #
 #  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.<BR>
+; 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.<BR>
+  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.<BR>
+  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
   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.<BR>
+; 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.<BR>
+#  Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
 #
 #  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.<BR>
+; 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.<BR>
+  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.<BR>
+  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
   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.<BR>
+; 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.<BR>
+#  Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
 #
 #  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.<BR>
+; 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.<BR>
+  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.<BR>
+  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
   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.<BR>
+; 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.<BR>
+#  Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
 #
 #  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.<BR>
+; 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.<BR>
+  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.<BR>
+  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
   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.<BR>
+; 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

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to