MdeModulePkg/NullMemoryTest: Fix bug in CompatibleRangeTest
CompatibleRangeTest() contains two bugs:
1. It doesn't reject the memory above 16MB
2. it cannot handle the case when the partial or whole range of
requested memory is already tested.
The patch fixes the two bugs.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
(cherry picked from commit 61c1742ba1
)
This commit is contained in:
@ -240,14 +240,51 @@ GenCompatibleRangeTest (
|
|||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_GCD_MEMORY_SPACE_DESCRIPTOR Descriptor;
|
EFI_GCD_MEMORY_SPACE_DESCRIPTOR Descriptor;
|
||||||
|
EFI_PHYSICAL_ADDRESS CurrentBase;
|
||||||
|
UINT64 CurrentLength;
|
||||||
|
|
||||||
Status = gDS->GetMemorySpaceDescriptor (StartAddress, &Descriptor);
|
//
|
||||||
if (!EFI_ERROR (Status)) {
|
// Check if the parameter is below 16MB
|
||||||
Status = ConvertToTestedMemory (
|
//
|
||||||
Descriptor.BaseAddress,
|
if (StartAddress + Length > SIZE_16MB) {
|
||||||
Descriptor.Length,
|
return EFI_INVALID_PARAMETER;
|
||||||
Descriptor.Capabilities
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
return Status;
|
CurrentBase = StartAddress;
|
||||||
|
do {
|
||||||
|
//
|
||||||
|
// Check the required memory range status; if the required memory range span
|
||||||
|
// the different GCD memory descriptor, it may be cause different action.
|
||||||
|
//
|
||||||
|
Status = gDS->GetMemorySpaceDescriptor (
|
||||||
|
CurrentBase,
|
||||||
|
&Descriptor
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Descriptor.GcdMemoryType == EfiGcdMemoryTypeReserved &&
|
||||||
|
(Descriptor.Capabilities & (EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED | EFI_MEMORY_TESTED)) ==
|
||||||
|
(EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED)
|
||||||
|
) {
|
||||||
|
CurrentLength = Descriptor.BaseAddress + Descriptor.Length - CurrentBase;
|
||||||
|
if (CurrentBase + CurrentLength > StartAddress + Length) {
|
||||||
|
CurrentLength = StartAddress + Length - CurrentBase;
|
||||||
|
}
|
||||||
|
Status = ConvertToTestedMemory (
|
||||||
|
CurrentBase,
|
||||||
|
CurrentLength,
|
||||||
|
Descriptor.Capabilities
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CurrentBase = Descriptor.BaseAddress + Descriptor.Length;
|
||||||
|
} while (CurrentBase < StartAddress + Length);
|
||||||
|
//
|
||||||
|
// Here means the required range already be tested, so just return success.
|
||||||
|
//
|
||||||
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user