mirror of https://github.com/acidanthera/audk.git
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>
This commit is contained in:
parent
ee37e96479
commit
61c1742ba1
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue