diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapStandaloneMm.c b/UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapStandaloneMm.c index dba7db0d00..6edbf9dfcf 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapStandaloneMm.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapStandaloneMm.c @@ -125,11 +125,14 @@ BuildMemoryMapFromResDescHobs ( EFI_PEI_HOB_POINTERS Hob; UINTN Count; UINTN Index; + EFI_PHYSICAL_ADDRESS MaxPhysicalAddress; + EFI_PHYSICAL_ADDRESS ResourceHobEnd; ASSERT (MemoryRegion != NULL && MemoryRegionCount != NULL); *MemoryRegion = NULL; *MemoryRegionCount = 0; + MaxPhysicalAddress = LShiftU64 (1, mPhysicalAddressBits); // // Get the count. @@ -138,6 +141,13 @@ BuildMemoryMapFromResDescHobs ( Hob.Raw = GetFirstHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR); while (Hob.Raw != NULL) { if ((Hob.ResourceDescriptor->ResourceAttribute & MM_RESOURCE_ATTRIBUTE_LOGGING) == 0) { + ResourceHobEnd = Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength; + + ASSERT (ResourceHobEnd <= MaxPhysicalAddress); + if (ResourceHobEnd > MaxPhysicalAddress) { + CpuDeadLoop (); + } + // // Resource HOBs describe all accessible non-smram regions. // Logging attribute range is treated as not present. Not-present ranges are not included in this memory map.