summaryrefslogtreecommitdiff
path: root/MdeModulePkg/Universal/MemoryTest
diff options
context:
space:
mode:
authorRuiyu Ni <ruiyu.ni@intel.com>2018-02-10 22:23:18 +0800
committerRuiyu Ni <ruiyu.ni@intel.com>2018-02-27 13:56:03 +0800
commit1c06bd485e45ccbcec1b532d26fba3208b32b0c5 (patch)
tree33e989e77921752ee6ddf4cb688efd82a41d023d /MdeModulePkg/Universal/MemoryTest
parent2e5fb984ed6876b173b1bd558fdaa41f08b7ed6f (diff)
downloadedk2-1c06bd485e45ccbcec1b532d26fba3208b32b0c5.zip
edk2-1c06bd485e45ccbcec1b532d26fba3208b32b0c5.tar.gz
edk2-1c06bd485e45ccbcec1b532d26fba3208b32b0c5.tar.bz2
MdeModulePkg/NullMemoryTest: Handle more reliable memory
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=650 Today's implementation converts the untested more reliable memory from reserved GCD type to system memory GCD type. Though it doesn't impact the return result of gBS->GetMemoryMap(). But it impacts the return result of gDS->GetMemorySpaceDescriptor(). The patch fixes the bug to convert the untested more reliable memory from reserved GCD type to more reliable memory GCD type. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Cc: Star Zeng <star.zeng@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
Diffstat (limited to 'MdeModulePkg/Universal/MemoryTest')
-rw-r--r--MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTest.c75
1 files changed, 46 insertions, 29 deletions
diff --git a/MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTest.c b/MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTest.c
index 9c9849c..11af8ea 100644
--- a/MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTest.c
+++ b/MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTest.c
@@ -1,7 +1,7 @@
/** @file
Implementation of Generic Memory Test Protocol which does not perform real memory test.
-Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2018, 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
@@ -59,6 +59,38 @@ GenericMemoryTestEntryPoint (
}
/**
+ Convert the memory descriptor to tested.
+
+ @param Descriptor Pointer to EFI_GCD_MEMORY_SPACE_DESCRIPTOR
+
+ @retval EFI_SUCCESS The memory descriptor is converted to tested.
+ @retval others Error happens.
+**/
+EFI_STATUS
+ConvertToTestedMemory (
+ IN CONST EFI_GCD_MEMORY_SPACE_DESCRIPTOR *Descriptor
+ )
+{
+ EFI_STATUS Status;
+ Status = gDS->RemoveMemorySpace (
+ Descriptor->BaseAddress,
+ Descriptor->Length
+ );
+ if (!EFI_ERROR (Status)) {
+ Status = gDS->AddMemorySpace (
+ ((Descriptor->Capabilities & EFI_MEMORY_MORE_RELIABLE) == EFI_MEMORY_MORE_RELIABLE) ?
+ EfiGcdMemoryTypeMoreReliable : EfiGcdMemoryTypeSystemMemory,
+ Descriptor->BaseAddress,
+ Descriptor->Length,
+ Descriptor->Capabilities &~
+ (EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED | EFI_MEMORY_TESTED | EFI_MEMORY_RUNTIME)
+ );
+ }
+ return Status;
+}
+
+
+/**
Initialize the generic memory test.
This function implements EFI_GENERIC_MEMORY_TEST_PROTOCOL.MemoryTestInit.
@@ -83,6 +115,7 @@ InitializeMemoryTest (
OUT BOOLEAN *RequireSoftECCInit
)
{
+ EFI_STATUS Status;
UINTN NumberOfDescriptors;
EFI_GCD_MEMORY_SPACE_DESCRIPTOR *MemorySpaceMap;
UINTN Index;
@@ -96,22 +129,12 @@ InitializeMemoryTest (
//
// For those reserved memory that have not been tested, simply promote to system memory.
//
- gDS->RemoveMemorySpace (
- MemorySpaceMap[Index].BaseAddress,
- MemorySpaceMap[Index].Length
- );
-
- gDS->AddMemorySpace (
- EfiGcdMemoryTypeSystemMemory,
- MemorySpaceMap[Index].BaseAddress,
- MemorySpaceMap[Index].Length,
- MemorySpaceMap[Index].Capabilities &~
- (EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED | EFI_MEMORY_TESTED | EFI_MEMORY_RUNTIME)
- );
-
+ Status = ConvertToTestedMemory (&MemorySpaceMap[Index]);
+ ASSERT_EFI_ERROR (Status);
mTestedSystemMemory += MemorySpaceMap[Index].Length;
mTotalSystemMemory += MemorySpaceMap[Index].Length;
- } else if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeSystemMemory) {
+ } else if ((MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeSystemMemory) ||
+ (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeMoreReliable)) {
mTotalSystemMemory += MemorySpaceMap[Index].Length;
}
}
@@ -204,22 +227,16 @@ EFI_STATUS
EFIAPI
GenCompatibleRangeTest (
IN EFI_GENERIC_MEMORY_TEST_PROTOCOL *This,
- IN EFI_PHYSICAL_ADDRESS StartAddress,
- IN UINT64 Length
+ IN EFI_PHYSICAL_ADDRESS StartAddress,
+ IN UINT64 Length
)
{
+ EFI_STATUS Status;
EFI_GCD_MEMORY_SPACE_DESCRIPTOR Descriptor;
- gDS->GetMemorySpaceDescriptor (StartAddress, &Descriptor);
-
- gDS->RemoveMemorySpace (StartAddress, Length);
-
- gDS->AddMemorySpace (
- EfiGcdMemoryTypeSystemMemory,
- StartAddress,
- Length,
- Descriptor.Capabilities &~(EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED | EFI_MEMORY_TESTED | EFI_MEMORY_RUNTIME)
- );
-
- return EFI_SUCCESS;
+ Status = gDS->GetMemorySpaceDescriptor (StartAddress, &Descriptor);
+ if (!EFI_ERROR (Status)) {
+ Status = ConvertToTestedMemory (&Descriptor);
+ }
+ return Status;
}