summaryrefslogtreecommitdiff
path: root/MdeModulePkg/Library/BaseMemoryTestLib
diff options
context:
space:
mode:
authorxli24 <xli24@6f19259b-4bc3-4df7-8a09-765794883524>2009-03-06 03:34:25 +0000
committerxli24 <xli24@6f19259b-4bc3-4df7-8a09-765794883524>2009-03-06 03:34:25 +0000
commitb6ee92ecea373505b056379ce168b4627a5cb265 (patch)
treee972d924b050af89ef83366cd4f7d1eefa0b15b8 /MdeModulePkg/Library/BaseMemoryTestLib
parent9075e543711c9d7e44c7f89517367c77ea57d2d7 (diff)
downloadedk2-b6ee92ecea373505b056379ce168b4627a5cb265.zip
edk2-b6ee92ecea373505b056379ce168b4627a5cb265.tar.gz
edk2-b6ee92ecea373505b056379ce168b4627a5cb265.tar.bz2
Refine BaseMemoryTestLib and add instance with full functionality.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7831 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdeModulePkg/Library/BaseMemoryTestLib')
-rw-r--r--MdeModulePkg/Library/BaseMemoryTestLib/BaseMemoryTestLib.c227
-rw-r--r--MdeModulePkg/Library/BaseMemoryTestLib/BaseMemoryTestLib.inf46
2 files changed, 273 insertions, 0 deletions
diff --git a/MdeModulePkg/Library/BaseMemoryTestLib/BaseMemoryTestLib.c b/MdeModulePkg/Library/BaseMemoryTestLib/BaseMemoryTestLib.c
new file mode 100644
index 0000000..0b89d59
--- /dev/null
+++ b/MdeModulePkg/Library/BaseMemoryTestLib/BaseMemoryTestLib.c
@@ -0,0 +1,227 @@
+/** @file
+ Null instance of Memory Test Library.
+
+Copyright (c) 2009, Intel Corporation.<BR>
+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 <Base.h>
+#include <Library/BaseMemoryTestLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/CacheMaintenanceLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+#include <Library/ReportStatusCodeLib.h>
+
+
+UINT32 TestPattern[] = {
+ 0x5a5a5a5a,
+ 0xa5a5a5a5,
+ 0x5a5a5a5a,
+ 0xa5a5a5a5,
+ 0x5a5a5a5a,
+ 0xa5a5a5a5,
+ 0x5a5a5a5a,
+ 0xa5a5a5a5,
+ 0x5a5a5a5a,
+ 0xa5a5a5a5,
+ 0x5a5a5a5a,
+ 0xa5a5a5a5,
+ 0x5a5a5a5a,
+ 0xa5a5a5a5,
+ 0x5a5a5a5a,
+ 0xa5a5a5a5
+};
+
+/**
+ Internal worker function for system memory range test.
+
+ This function is the internal worker function for system memory range test.
+ It writes test pattern to memory range and then reads back to check if memory
+ works well.
+
+ @param StartAddress Start address of the memory range to test.
+ @param Length Length of the memory range to test.
+ @param ErrorAddress Address of the memory where error is encountered.
+
+ @retval RETURN_SUCCESS The memory range passes test.
+ @retval RETURN_DEVICE_ERROR The memory range does not pass test.
+
+**/
+RETURN_STATUS
+MemoryTestWorker (
+ IN VOID *StartAddress,
+ IN UINT64 Length,
+ IN UINTN SpanSize,
+ OUT VOID **ErrorAddress
+ )
+{
+ VOID *TempAddress;
+
+ //
+ // Make sure we don't try and test anything above the max physical address range
+ //
+ ASSERT ((UINTN) StartAddress + Length < MAX_ADDRESS);
+
+ REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdStatusCodeValueMemoryTestStarted));
+
+ //
+ // Write the test pattern into memory range
+ //
+ TempAddress = StartAddress;
+ while ((UINTN) TempAddress < (UINTN) StartAddress + Length) {
+ CopyMem (TempAddress, TestPattern, sizeof (TestPattern));
+ TempAddress = (VOID *) ((UINTN) TempAddress + SpanSize);
+ }
+
+ //
+ // Write back and invalidate cache to make sure data is in memory
+ //
+ WriteBackInvalidateDataCacheRange (StartAddress, (UINTN) Length);
+
+ //
+ // Read pattern from memory and compare it
+ //
+ TempAddress = StartAddress;
+ while ((UINTN) TempAddress < (UINTN) StartAddress + Length) {
+ if (CompareMem (TempAddress, TestPattern, sizeof (TestPattern)) != 0) {
+ //
+ // Value read back does not equal to the value written, so error is detected.
+ //
+ *ErrorAddress = TempAddress;
+ REPORT_STATUS_CODE (EFI_ERROR_CODE | EFI_ERROR_UNRECOVERED, PcdGet32 (PcdStatusCodeValueUncorrectableMemoryError));
+
+ return RETURN_DEVICE_ERROR;
+ }
+
+ TempAddress = (VOID *) ((UINTN) TempAddress + SpanSize);
+ }
+
+ return RETURN_SUCCESS;
+}
+
+/**
+ Perform a quick system memory range test.
+
+ This function performs a quick system memory range test. It leads to quick performance
+ but least reliability.
+
+ @param StartAddress Start address of the memory range to test.
+ @param Length Length of the memory range to test.
+ @param ErrorAddress Address of the memory where error is encountered.
+
+ @retval RETURN_SUCCESS The memory range passes test.
+ @retval RETURN_DEVICE_ERROR The memory range does not pass test.
+
+**/
+RETURN_STATUS
+EFIAPI
+QuickMemoryTest (
+ IN VOID *StartAddress,
+ IN UINT64 Length,
+ OUT VOID **ErrorAddress
+ )
+{
+ RETURN_STATUS Status;
+
+ Status = MemoryTestWorker (
+ StartAddress,
+ Length,
+ sizeof (TestPattern) * 0x20000,
+ ErrorAddress
+ );
+
+ return Status;
+}
+
+/**
+ Test a system memory range with sparsely sampled memory units.
+
+ This function tests a system memory range, whose memory units
+ are sampled sparsely. It leads to relatively good performance
+ and partial reliability.
+
+ @param StartAddress Start address of the memory range to test.
+ @param Length Length of the memory range to test.
+ @param ErrorAddress Address of the memory where error is encountered.
+
+ @retval RETURN_SUCCESS The memory range passes test.
+ @retval RETURN_DEVICE_ERROR The memory range does not pass test.
+
+**/
+RETURN_STATUS
+EFIAPI
+SparseMemoryTest (
+ IN VOID *StartAddress,
+ IN UINT64 Length,
+ OUT VOID **ErrorAddress
+ )
+{
+ RETURN_STATUS Status;
+
+ Status = MemoryTestWorker (
+ StartAddress,
+ Length,
+ sizeof (TestPattern) * 0x8000,
+ ErrorAddress
+ );
+
+ return Status;
+}
+
+/**
+ Test a system memory range with extensively sampled memory units.
+
+ This function tests a system memory range, whose memory units
+ are sampled extensively. Compared with SparseMemoryTest, it achieves
+ more reliability and less performance.
+
+ @param StartAddress Start address of the memory range to test.
+ @param Length Length of the memory range to test.
+ @param ErrorAddress Address of the memory where error is encountered.
+
+ @retval RETURN_SUCCESS The memory range passes test.
+ @retval RETURN_DEVICE_ERROR The memory range does not pass test.
+
+**/
+RETURN_STATUS
+EFIAPI
+ExtensiveMemoryTest (
+ IN VOID *StartAddress,
+ IN UINT64 Length,
+ OUT VOID **ErrorAddress
+ )
+{
+ RETURN_STATUS Status;
+
+ Status = MemoryTestWorker (
+ StartAddress,
+ Length,
+ sizeof (TestPattern),
+ ErrorAddress
+ );
+
+ return Status;
+}
+
+/**
+ Check if soft ECC initialzation is needed for system
+
+ @retval TRUE Soft ECC initialzation is needed.
+ @retval FALSE Soft ECC initialzation is not needed.
+
+**/
+BOOLEAN
+EFIAPI
+IsSoftEccInitRequired (
+ VOID
+ )
+{
+ return FALSE;
+}
diff --git a/MdeModulePkg/Library/BaseMemoryTestLib/BaseMemoryTestLib.inf b/MdeModulePkg/Library/BaseMemoryTestLib/BaseMemoryTestLib.inf
new file mode 100644
index 0000000..f1bd888
--- /dev/null
+++ b/MdeModulePkg/Library/BaseMemoryTestLib/BaseMemoryTestLib.inf
@@ -0,0 +1,46 @@
+/** @file
+ Instance of Memory Test Library.
+
+Copyright (c) 2009, Intel Corporation.<BR>
+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.
+
+**/
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = BaseMemoryTestLib
+ FILE_GUID = 216CAA56-AF75-4BBB-9D74-CC0960E92ECB
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = BaseMemoryTestLib
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC
+#
+
+[Sources.common]
+ BaseMemoryTestLib.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+
+[LibraryClasses]
+ BaseMemoryTestLib
+ BaseMemoryLib
+ CacheMaintenanceLib
+ DebugLib
+ PcdLib
+ ReportStatusCodeLib
+
+[FixedPcd]
+ gEfiMdePkgTokenSpaceGuid.PcdStatusCodeValueMemoryTestStarted
+ gEfiMdePkgTokenSpaceGuid.PcdStatusCodeValueUncorrectableMemoryError