UefiCpuPkg: Sort mSmmCpuSmramRanges in FindSmramInfo

Sort mSmmCpuSmramRanges after get the SMRAM info in
FindSmramInfo() function.

Signed-off-by: Dun Tan <dun.tan@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Cc: Rahul Kumar <rahul1.kumar@intel.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Dun Tan 2023-05-15 17:59:56 +08:00 committed by Ray Ni
parent b4dde1ae6a
commit 7132df94ac
1 changed files with 32 additions and 0 deletions

View File

@ -1219,6 +1219,32 @@ PiCpuSmmEntry (
return EFI_SUCCESS;
}
/**
Function to compare 2 EFI_SMRAM_DESCRIPTOR based on CpuStart.
@param[in] Buffer1 pointer to Device Path poiner to compare
@param[in] Buffer2 pointer to second DevicePath pointer to compare
@retval 0 Buffer1 equal to Buffer2
@retval <0 Buffer1 is less than Buffer2
@retval >0 Buffer1 is greater than Buffer2
**/
INTN
EFIAPI
CpuSmramRangeCompare (
IN CONST VOID *Buffer1,
IN CONST VOID *Buffer2
)
{
if (((EFI_SMRAM_DESCRIPTOR *)Buffer1)->CpuStart > ((EFI_SMRAM_DESCRIPTOR *)Buffer2)->CpuStart) {
return 1;
} else if (((EFI_SMRAM_DESCRIPTOR *)Buffer1)->CpuStart < ((EFI_SMRAM_DESCRIPTOR *)Buffer2)->CpuStart) {
return -1;
}
return 0;
}
/**
Find out SMRAM information including SMRR base and SMRR size.
@ -1240,6 +1266,7 @@ FindSmramInfo (
UINTN Index;
UINT64 MaxSize;
BOOLEAN Found;
EFI_SMRAM_DESCRIPTOR SmramDescriptor;
//
// Get SMM Access Protocol
@ -1262,6 +1289,11 @@ FindSmramInfo (
mSmmCpuSmramRangeCount = Size / sizeof (EFI_SMRAM_DESCRIPTOR);
//
// Sort the mSmmCpuSmramRanges
//
QuickSort (mSmmCpuSmramRanges, mSmmCpuSmramRangeCount, sizeof (EFI_SMRAM_DESCRIPTOR), (BASE_SORT_COMPARE)CpuSmramRangeCompare, &SmramDescriptor);
//
// Find the largest SMRAM range between 1MB and 4GB that is at least 256K - 4K in size
//