MdePkg BaseMemoryLib: Add C implementation of API IsZeroBuffer()

Add the implementation of API IsZeroBuffer() via C language for the
following library instances:
BaseMemoryLib
PeiMemoryLib
UefiMemoryLib

Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Hao Wu <hao.a.wu@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
diff --git a/MdePkg/Include/Library/BaseMemoryLib.h b/MdePkg/Include/Library/BaseMemoryLib.h
index ed7fa00..0e565c1 100644
--- a/MdePkg/Include/Library/BaseMemoryLib.h
+++ b/MdePkg/Include/Library/BaseMemoryLib.h
@@ -463,4 +463,27 @@
   IN CONST GUID  *Guid

   );

 

+/**

+  Checks if the contents of a buffer are all zeros.

+

+  This function checks whether the contents of a buffer are all zeros. If the

+  contents are all zeros, return TRUE. Otherwise, return FALSE.

+

+  If Length > 0 and Buffer is NULL, then ASSERT().

+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().

+

+  @param  Buffer      The pointer to the buffer to be checked.

+  @param  Length      The size of the buffer (in bytes) to be checked.

+

+  @retval TRUE        Contents of the buffer are all zeros.

+  @retval FALSE       Contents of the buffer are not all zeros.

+

+**/

+BOOLEAN

+EFIAPI

+IsZeroBuffer (

+  IN CONST VOID  *Buffer,

+  IN UINTN       Length

+  );

+

 #endif

diff --git a/MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf b/MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
index 5dfab35..6d906e9 100644
--- a/MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
+++ b/MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
@@ -3,7 +3,7 @@
 #

 #  Base Memory Library implementation - no ASM.

 #

-#  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

@@ -42,6 +42,7 @@
   SetMem16Wrapper.c

   SetMemWrapper.c

   CopyMemWrapper.c

+  IsZeroBufferWrapper.c

   MemLibGeneric.c

   MemLibGuid.c

   CopyMem.c

diff --git a/MdePkg/Library/BaseMemoryLib/IsZeroBufferWrapper.c b/MdePkg/Library/BaseMemoryLib/IsZeroBufferWrapper.c
new file mode 100644
index 0000000..c42c1aa
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLib/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/BaseMemoryLib/MemLibGeneric.c b/MdePkg/Library/BaseMemoryLib/MemLibGeneric.c
index a977c4a..b058be8 100644
--- a/MdePkg/Library/BaseMemoryLib/MemLibGeneric.c
+++ b/MdePkg/Library/BaseMemoryLib/MemLibGeneric.c
@@ -6,7 +6,7 @@
     PeiMemoryLib

     UefiMemoryLib

 

-  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

@@ -262,3 +262,32 @@
   } while (--Length != 0);

   return NULL;

 }

+

+/**

+  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

+  )

+{

+  CONST UINT8 *BufferData;

+  UINTN       Index;

+

+  BufferData = Buffer;

+  for (Index = 0; Index < Length; Index++) {

+    if (BufferData[Index] != 0) {

+      return FALSE;

+    }

+  }

+  return TRUE;

+}

diff --git a/MdePkg/Library/BaseMemoryLib/MemLibInternals.h b/MdePkg/Library/BaseMemoryLib/MemLibInternals.h
index 6f75839..7d8ecbe 100644
--- a/MdePkg/Library/BaseMemoryLib/MemLibInternals.h
+++ b/MdePkg/Library/BaseMemoryLib/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 @@
   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/PeiMemoryLib/IsZeroBufferWrapper.c b/MdePkg/Library/PeiMemoryLib/IsZeroBufferWrapper.c
new file mode 100644
index 0000000..c42c1aa
--- /dev/null
+++ b/MdePkg/Library/PeiMemoryLib/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/PeiMemoryLib/MemLibGeneric.c b/MdePkg/Library/PeiMemoryLib/MemLibGeneric.c
index 53f1caf..490b244 100644
--- a/MdePkg/Library/PeiMemoryLib/MemLibGeneric.c
+++ b/MdePkg/Library/PeiMemoryLib/MemLibGeneric.c
@@ -6,7 +6,7 @@
     PeiMemoryLib

     UefiMemoryLib

 

-  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

@@ -258,3 +258,32 @@
   } while (--Length != 0);

   return NULL;

 }

+

+/**

+  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

+  )

+{

+  CONST UINT8 *BufferData;

+  UINTN       Index;

+

+  BufferData = Buffer;

+  for (Index = 0; Index < Length; Index++) {

+    if (BufferData[Index] != 0) {

+      return FALSE;

+    }

+  }

+  return TRUE;

+}

diff --git a/MdePkg/Library/PeiMemoryLib/MemLibInternals.h b/MdePkg/Library/PeiMemoryLib/MemLibInternals.h
index 8a1e1df..85b4292 100644
--- a/MdePkg/Library/PeiMemoryLib/MemLibInternals.h
+++ b/MdePkg/Library/PeiMemoryLib/MemLibInternals.h
@@ -1,7 +1,7 @@
 /** @file

   Declaration of internal functions for Base Memory Library.

 

-  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

@@ -229,4 +229,21 @@
   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/PeiMemoryLib/PeiMemoryLib.inf b/MdePkg/Library/PeiMemoryLib/PeiMemoryLib.inf
index 58af9d0..56d584d 100644
--- a/MdePkg/Library/PeiMemoryLib/PeiMemoryLib.inf
+++ b/MdePkg/Library/PeiMemoryLib/PeiMemoryLib.inf
@@ -4,7 +4,7 @@
 # Base Memory Library implementation that uses PEI Services

 #  where possible for size reduction.

 #

-# 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

@@ -42,6 +42,7 @@
   SetMem16Wrapper.c

   SetMemWrapper.c

   CopyMemWrapper.c

+  IsZeroBufferWrapper.c

   MemLibGeneric.c

   MemLibGuid.c

   MemLib.c

diff --git a/MdePkg/Library/UefiMemoryLib/IsZeroBufferWrapper.c b/MdePkg/Library/UefiMemoryLib/IsZeroBufferWrapper.c
new file mode 100644
index 0000000..c42c1aa
--- /dev/null
+++ b/MdePkg/Library/UefiMemoryLib/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/UefiMemoryLib/MemLibGeneric.c b/MdePkg/Library/UefiMemoryLib/MemLibGeneric.c
index 1ec8bf6..da02b6c 100644
--- a/MdePkg/Library/UefiMemoryLib/MemLibGeneric.c
+++ b/MdePkg/Library/UefiMemoryLib/MemLibGeneric.c
@@ -6,7 +6,7 @@
     PeiMemoryLib

     UefiMemoryLib

 

-  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

@@ -258,3 +258,32 @@
   } while (--Length != 0);

   return NULL;

 }

+

+/**

+  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

+  )

+{

+  CONST UINT8 *BufferData;

+  UINTN       Index;

+

+  BufferData = Buffer;

+  for (Index = 0; Index < Length; Index++) {

+    if (BufferData[Index] != 0) {

+      return FALSE;

+    }

+  }

+  return TRUE;

+}

diff --git a/MdePkg/Library/UefiMemoryLib/MemLibInternals.h b/MdePkg/Library/UefiMemoryLib/MemLibInternals.h
index 0443b50..cafbb4d 100644
--- a/MdePkg/Library/UefiMemoryLib/MemLibInternals.h
+++ b/MdePkg/Library/UefiMemoryLib/MemLibInternals.h
@@ -1,7 +1,7 @@
 /** @file

   Declaration of internal functions for Base Memory Library.

 

-  Copyright (c) 2006 - 2009, 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

@@ -229,4 +229,21 @@
   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/UefiMemoryLib/UefiMemoryLib.inf b/MdePkg/Library/UefiMemoryLib/UefiMemoryLib.inf
index e82732f..7382204 100644
--- a/MdePkg/Library/UefiMemoryLib/UefiMemoryLib.inf
+++ b/MdePkg/Library/UefiMemoryLib/UefiMemoryLib.inf
@@ -4,7 +4,7 @@
 # Base Memory Library implementation that uses EFI Boot Services

 #  where possible for size reduction.

 #

-# 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

@@ -42,6 +42,7 @@
   SetMem16Wrapper.c

   SetMemWrapper.c

   CopyMemWrapper.c

+  IsZeroBufferWrapper.c

   MemLibGeneric.c

   MemLibGuid.c

   MemLib.c