From b6ee92ecea373505b056379ce168b4627a5cb265 Mon Sep 17 00:00:00 2001 From: xli24 Date: Fri, 6 Mar 2009 03:34:25 +0000 Subject: 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 --- .../Library/BaseMemoryTestLib/BaseMemoryTestLib.c | 227 +++++++++++++++++++++ .../BaseMemoryTestLib/BaseMemoryTestLib.inf | 46 +++++ .../BaseMemoryTestLibNull/BaseMemoryTestLibNull.c | 47 +++-- .../BaseMemoryTestLibNull.inf | 4 +- 4 files changed, 306 insertions(+), 18 deletions(-) create mode 100644 MdeModulePkg/Library/BaseMemoryTestLib/BaseMemoryTestLib.c create mode 100644 MdeModulePkg/Library/BaseMemoryTestLib/BaseMemoryTestLib.inf (limited to 'MdeModulePkg/Library') 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.
+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 +#include +#include +#include +#include +#include +#include + + +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.
+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 diff --git a/MdeModulePkg/Library/BaseMemoryTestLibNull/BaseMemoryTestLibNull.c b/MdeModulePkg/Library/BaseMemoryTestLibNull/BaseMemoryTestLibNull.c index 4163e61..e88a225 100644 --- a/MdeModulePkg/Library/BaseMemoryTestLibNull/BaseMemoryTestLibNull.c +++ b/MdeModulePkg/Library/BaseMemoryTestLibNull/BaseMemoryTestLibNull.c @@ -15,23 +15,22 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include /** - Test a system memory range with sparsely sampled memory units. + Perform a quick system memory range test. - This function tests a system memory range, whose memory units - are sampled sparsely. It leads to quick performance but less - reliability. + 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 RETURNEFI_DEVICE_ERROR The memory range does not pass test. + @retval RETURN_DEVICE_ERROR The memory range does not pass test. **/ RETURN_STATUS EFIAPI -SparseMemoryTest ( +QuickMemoryTest ( IN VOID *StartAddress, IN UINT64 Length, OUT VOID **ErrorAddress @@ -41,23 +40,23 @@ SparseMemoryTest ( } /** - Test a system memory range with extensively sampled memory units. + Test a system memory range with sparsely 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. + 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 RETURNEFI_DEVICE_ERROR The memory range does not pass test. + @retval RETURN_DEVICE_ERROR The memory range does not pass test. **/ RETURN_STATUS EFIAPI -ExtensiveMemoryTest ( +SparseMemoryTest ( IN VOID *StartAddress, IN UINT64 Length, OUT VOID **ErrorAddress @@ -67,23 +66,23 @@ ExtensiveMemoryTest ( } /** - Test a system memory range with every memory unit checked. + Test a system memory range with extensively sampled memory units. This function tests a system memory range, whose memory units - are fully checked. It leads to complete reliability with the - cost of performance. + 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 RETURNEFI_DEVICE_ERROR The memory range does not pass test. + @retval RETURN_DEVICE_ERROR The memory range does not pass test. **/ RETURN_STATUS EFIAPI -FullMemoryTest ( +ExtensiveMemoryTest ( IN VOID *StartAddress, IN UINT64 Length, OUT VOID **ErrorAddress @@ -91,3 +90,19 @@ FullMemoryTest ( { return RETURN_SUCCESS; } + +/** + 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/BaseMemoryTestLibNull/BaseMemoryTestLibNull.inf b/MdeModulePkg/Library/BaseMemoryTestLibNull/BaseMemoryTestLibNull.inf index 3587516..79f1395f 100644 --- a/MdeModulePkg/Library/BaseMemoryTestLibNull/BaseMemoryTestLibNull.inf +++ b/MdeModulePkg/Library/BaseMemoryTestLibNull/BaseMemoryTestLibNull.inf @@ -18,7 +18,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. FILE_GUID = D519E511-9C1C-47F5-AE01-FD216E779269 MODULE_TYPE = BASE VERSION_STRING = 1.0 - LIBRARY_CLASS = MemoryTestLib + LIBRARY_CLASS = BaseMemoryTestLib # # The following information is for reference only and not required by the build tools. @@ -34,4 +34,4 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. MdeModulePkg/MdeModulePkg.dec [LibraryClasses] - MemoryTestLib + BaseMemoryTestLib -- cgit v1.1