From de29ae677a80ca0d405853d5f720a8e8401ac867 Mon Sep 17 00:00:00 2001 From: Hongbin1 Zhang Date: Thu, 2 Jan 2025 09:54:30 +0800 Subject: [PATCH] StandaloneMmPkg/MmIpl : Add EFI_HOB_HANDOFF_INFO_TABLE to MM HOB list GetBootModeHob function need to add EFI_HOB_HANDOFF_INFO_TABLE in MM hob data base. Signed-off-by: Hongbin1 Zhang Cc: Jiewen Yao Cc: Ray Ni Cc: Star Zeng Cc: Jiaxin Wu Cc: Wei6 Xu Cc: Sami Mujawar Cc: Ard Biesheuvel Cc: Supreeth Venkatesh --- .../StandaloneMmIplPei/MmFoundationHob.c | 30 +++++++++++++++++++ .../StandaloneMmIplPei/StandaloneMmIplPei.c | 19 ++++++++---- .../StandaloneMmIplPei/StandaloneMmIplPei.h | 14 +++++++++ 3 files changed, 58 insertions(+), 5 deletions(-) diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c index b4eb7bbcd5..2f02920582 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c @@ -1029,3 +1029,33 @@ CreateMmFoundationHobList ( *FoundationHobSize = UsedSize; return Status; } + +/** + + Builds a Handoff Information Table HOB. + + @param Hob - Pointer to handoff information table HOB. + @param HobEnd - End of the HOB list. + +**/ +VOID +CreateMmHobHandoffInfoTable ( + IN EFI_HOB_HANDOFF_INFO_TABLE *Hob, + IN VOID *HobEnd + ) +{ + ASSERT ((Hob != NULL) && (HobEnd != NULL)); + + Hob->Header.HobType = EFI_HOB_TYPE_HANDOFF; + Hob->Header.HobLength = (UINT16)sizeof (EFI_HOB_HANDOFF_INFO_TABLE); + Hob->Header.Reserved = 0; + + Hob->Version = EFI_HOB_HANDOFF_TABLE_VERSION; + Hob->BootMode = GetBootModeHob (); + + Hob->EfiMemoryTop = 0; + Hob->EfiMemoryBottom = 0; + Hob->EfiFreeMemoryTop = 0; + Hob->EfiFreeMemoryBottom = 0; + Hob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd; +} diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c index d8112b0fef..4a7187197e 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c @@ -280,6 +280,8 @@ CreatMmHobList ( UINTN BufferSize; UINTN FoundationHobSize; EFI_HOB_MEMORY_ALLOCATION *MmProfileDataHob; + UINTN PhitHobSize; + VOID *HobEnd; // // Get platform HOBs @@ -336,10 +338,11 @@ CreatMmHobList ( ASSERT (Status == RETURN_BUFFER_TOO_SMALL); ASSERT (FoundationHobSize != 0); + PhitHobSize = sizeof (EFI_HOB_HANDOFF_INFO_TABLE); // - // Final result includes platform HOBs, foundation HOBs and a END node. + // Final result includes: PHIT HOB, Platform HOBs, Foundation HOBs and an END node. // - *HobSize = PlatformHobSize + FoundationHobSize + sizeof (EFI_HOB_GENERIC_HEADER); + *HobSize = PhitHobSize + PlatformHobSize + FoundationHobSize + sizeof (EFI_HOB_GENERIC_HEADER); HobList = AllocatePages (EFI_SIZE_TO_PAGES (*HobSize)); ASSERT (HobList != NULL); if (HobList == NULL) { @@ -347,17 +350,23 @@ CreatMmHobList ( CpuDeadLoop (); } + HobEnd = (UINT8 *)(UINTN)HobList + PhitHobSize + PlatformHobSize + FoundationHobSize; + // + // Create MmHobHandoffInfoTable + // + CreateMmHobHandoffInfoTable (HobList, HobEnd); + // // Get platform HOBs // - Status = CreateMmPlatformHob (HobList, &PlatformHobSize); + Status = CreateMmPlatformHob ((UINT8 *)HobList + PhitHobSize, &PlatformHobSize); ASSERT_EFI_ERROR (Status); // // Get foundation HOBs // Status = CreateMmFoundationHobList ( - (UINT8 *)HobList + PlatformHobSize, + (UINT8 *)HobList + PhitHobSize + PlatformHobSize, &FoundationHobSize, HobList, PlatformHobSize, @@ -375,7 +384,7 @@ CreatMmHobList ( // // Create MM HOB list end. // - MmIplCreateHob ((UINT8 *)HobList + PlatformHobSize + FoundationHobSize, EFI_HOB_TYPE_END_OF_HOB_LIST, sizeof (EFI_HOB_GENERIC_HEADER)); + MmIplCreateHob (HobEnd, EFI_HOB_TYPE_END_OF_HOB_LIST, sizeof (EFI_HOB_GENERIC_HEADER)); return HobList; } diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.h b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.h index e385c7768d..c5d598797f 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.h +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.h @@ -143,4 +143,18 @@ BuildMmProfileDataHobInPeiHobList ( VOID ); +/** + + Builds a Handoff Information Table HOB. + + @param Hob - Pointer to handoff information table HOB. + @param HobEnd - End of the HOB list. + +**/ +VOID +CreateMmHobHandoffInfoTable ( + IN EFI_HOB_HANDOFF_INFO_TABLE *Hob, + IN VOID *HobEnd + ); + #endif