From c673216f53bd18515ecbffdba75af007e6700853 Mon Sep 17 00:00:00 2001 From: Min M Xu Date: Tue, 17 Jan 2023 07:31:55 +0800 Subject: EmbeddedPkg/PrePiLib: Add FFS_CHECK_SECTION_HOOK when finding section BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4152 EmbeddedPkg/PrePiLib provides the service of finding sections based on the input SectionType. But sometimes there maybe multiple sections with the same SectionType. FFS_CHECK_SECTION_HOOK is a hook which can be called to do additional check. Cc: Leif Lindholm Cc: Ard Biesheuvel Cc: Abner Chang Cc: Daniel Schaefer Cc: Gerd Hoffmann Cc: Erdem Aktas Cc: James Bottomley Cc: Jiewen Yao Cc: Tom Lendacky Acked-by: Ard Biesheuvel Signed-off-by: Min Xu Acked-by: Gerd Hoffmann --- EmbeddedPkg/Library/PrePiLib/FwVol.c | 42 +++++++++++++++++++++++---------- EmbeddedPkg/Library/PrePiLib/PrePiLib.c | 2 +- 2 files changed, 31 insertions(+), 13 deletions(-) (limited to 'EmbeddedPkg/Library') diff --git a/EmbeddedPkg/Library/PrePiLib/FwVol.c b/EmbeddedPkg/Library/PrePiLib/FwVol.c index 0a6d6925b7..778d8b13c3 100644 --- a/EmbeddedPkg/Library/PrePiLib/FwVol.c +++ b/EmbeddedPkg/Library/PrePiLib/FwVol.c @@ -264,16 +264,18 @@ FindFileEx ( Go through the file to search SectionType section, when meeting an encapsuled section. - @param SectionType - Filter to find only section of this type. - @param Section - From where to search. - @param SectionSize - The file size to search. - @param OutputBuffer - Pointer to the section to search. + @param SectionType - Filter to find only section of this type. + @param SectionCheckHook - A hook which can check if the section is the target one. + @param Section - From where to search. + @param SectionSize - The file size to search. + @param OutputBuffer - Pointer to the section to search. @retval EFI_SUCCESS **/ EFI_STATUS FfsProcessSection ( IN EFI_SECTION_TYPE SectionType, + IN FFS_CHECK_SECTION_HOOK SectionCheckHook, IN EFI_COMMON_SECTION_HEADER *Section, IN UINTN SectionSize, OUT VOID **OutputBuffer @@ -292,7 +294,9 @@ FfsProcessSection ( UINT32 AuthenticationStatus; CHAR8 *CompressedData; UINT32 CompressedDataLength; + BOOLEAN Found; + Found = FALSE; *OutputBuffer = NULL; ParsedLength = 0; Status = EFI_NOT_FOUND; @@ -302,13 +306,23 @@ FfsProcessSection ( } if (Section->Type == SectionType) { - if (IS_SECTION2 (Section)) { - *OutputBuffer = (VOID *)((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER2)); + if (SectionCheckHook != NULL) { + Found = SectionCheckHook (Section) == EFI_SUCCESS; } else { - *OutputBuffer = (VOID *)((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER)); + Found = TRUE; } - return EFI_SUCCESS; + if (Found) { + if (IS_SECTION2 (Section)) { + *OutputBuffer = (VOID *)((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER2)); + } else { + *OutputBuffer = (VOID *)((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER)); + } + + return EFI_SUCCESS; + } else { + goto CheckNextSection; + } } else if ((Section->Type == EFI_SECTION_COMPRESSION) || (Section->Type == EFI_SECTION_GUID_DEFINED)) { if (Section->Type == EFI_SECTION_COMPRESSION) { if (IS_SECTION2 (Section)) { @@ -415,6 +429,7 @@ FfsProcessSection ( } else { return FfsProcessSection ( SectionType, + SectionCheckHook, DstBuffer, DstBufferSize, OutputBuffer @@ -422,6 +437,7 @@ FfsProcessSection ( } } +CheckNextSection: if (IS_SECTION2 (Section)) { SectionLength = SECTION2_SIZE (Section); } else { @@ -456,9 +472,10 @@ FfsProcessSection ( EFI_STATUS EFIAPI FfsFindSectionData ( - IN EFI_SECTION_TYPE SectionType, - IN EFI_PEI_FILE_HANDLE FileHandle, - OUT VOID **SectionData + IN EFI_SECTION_TYPE SectionType, + IN FFS_CHECK_SECTION_HOOK SectionCheckHook, + IN EFI_PEI_FILE_HANDLE FileHandle, + OUT VOID **SectionData ) { EFI_FFS_FILE_HEADER *FfsFileHeader; @@ -478,6 +495,7 @@ FfsFindSectionData ( return FfsProcessSection ( SectionType, + SectionCheckHook, Section, FileSize, SectionData @@ -799,7 +817,7 @@ FfsProcessFvFile ( // // Find FvImage in FvFile // - Status = FfsFindSectionData (EFI_SECTION_FIRMWARE_VOLUME_IMAGE, FvFileHandle, (VOID **)&FvImageHandle); + Status = FfsFindSectionData (EFI_SECTION_FIRMWARE_VOLUME_IMAGE, NULL, FvFileHandle, (VOID **)&FvImageHandle); if (EFI_ERROR (Status)) { return Status; } diff --git a/EmbeddedPkg/Library/PrePiLib/PrePiLib.c b/EmbeddedPkg/Library/PrePiLib/PrePiLib.c index a0c5d02deb..3b6fc4f0eb 100644 --- a/EmbeddedPkg/Library/PrePiLib/PrePiLib.c +++ b/EmbeddedPkg/Library/PrePiLib/PrePiLib.c @@ -131,7 +131,7 @@ LoadDxeCoreFromFfsFile ( VOID *Hob; EFI_FV_FILE_INFO FvFileInfo; - Status = FfsFindSectionData (EFI_SECTION_PE32, FileHandle, &PeCoffImage); + Status = FfsFindSectionData (EFI_SECTION_PE32, NULL, FileHandle, &PeCoffImage); if (EFI_ERROR (Status)) { return Status; } -- cgit v1.2.3