From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by mx.groups.io with SMTP id smtpd.web10.183457.1673911935704512234 for ; Mon, 16 Jan 2023 15:32:18 -0800 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=PHN5DHZZ; spf=pass (domain: intel.com, ip: 134.134.136.20, mailfrom: min.m.xu@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1673911938; x=1705447938; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=zX5Ok1IXzxZ9quH6YvL53LnDCJSp6J/rPgevNot4hMs=; b=PHN5DHZZTrQrLibV5Iuv82fXYLKnuNIqryB83pkam9Q11EMbXaFshh4a JLTeEkJVHb/8BIW5KAYjTSkpVe0uXsRCOu8lLq1R+eoXCdbmcwcDbWN0P 5d6QNa1185CXZBhowXSfcETCvaW1RC79sB9yUVmqnM+oKzlRhbfOYyiLz 48l0xJhTFhiCLOgT0mV5scKS96CpwrYIwzddRnXpi8+PnSAjgdBK87WCo QdDLlI7i+U5dYTo5E/CoWr5wpHCHj4nVuDXeB9YgxgIpsY0hn8aThNrjd LnaYQvgHcB1G8BKKzOk3DNGYPVFWx1TT+OCIW1Zk6huBUJ/KDzfEI60jT g==; X-IronPort-AV: E=McAfee;i="6500,9779,10592"; a="312432468" X-IronPort-AV: E=Sophos;i="5.97,222,1669104000"; d="scan'208";a="312432468" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Jan 2023 15:32:17 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10592"; a="987930913" X-IronPort-AV: E=Sophos;i="5.97,222,1669104000"; d="scan'208";a="987930913" Received: from huiyanxi-mobl.ccr.corp.intel.com (HELO mxu9-mobl1.ccr.corp.intel.com) ([10.254.211.139]) by fmsmga005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Jan 2023 15:32:14 -0800 From: "Min Xu" To: devel@edk2.groups.io Cc: Min M Xu , Leif Lindholm , Ard Biesheuvel , Abner Chang , Daniel Schaefer , Gerd Hoffmann , Erdem Aktas , James Bottomley , Jiewen Yao , Tom Lendacky Subject: [PATCH V3 1/4] EmbeddedPkg/PrePiLib: Add FFS_CHECK_SECTION_HOOK when finding section Date: Tue, 17 Jan 2023 07:31:55 +0800 Message-Id: <20230116233158.1268-2-min.m.xu@intel.com> X-Mailer: git-send-email 2.29.2.windows.2 In-Reply-To: <20230116233158.1268-1-min.m.xu@intel.com> References: <20230116233158.1268-1-min.m.xu@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Min M Xu 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 --- EmbeddedPkg/Include/Library/PrePiLib.h | 23 +++++++++++--- EmbeddedPkg/Library/PrePiLib/FwVol.c | 42 ++++++++++++++++++------- EmbeddedPkg/Library/PrePiLib/PrePiLib.c | 2 +- 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/EmbeddedPkg/Include/Library/PrePiLib.h b/EmbeddedPkg/Include/Library/PrePiLib.h index 3741b08c4478..f60b6678185a 100644 --- a/EmbeddedPkg/Include/Library/PrePiLib.h +++ b/EmbeddedPkg/Include/Library/PrePiLib.h @@ -52,11 +52,23 @@ FfsFindNextFile ( IN OUT EFI_PEI_FILE_HANDLE *FileHandle ); +/** + * This is a hook which is used to check if the section is the target one. + * + */ +typedef +EFI_STATUS +(EFIAPI *FFS_CHECK_SECTION_HOOK)( + IN EFI_COMMON_SECTION_HEADER *Section + ); + /** This service enables discovery sections of a given type within a valid FFS file. + Caller also can provide a SectionCheckHook to do additional checking. - @param SearchType The value of the section type to find. - @param FfsFileHeader A pointer to the file header that contains the set of sections to + @param SectionType The value of the section type to find. + @param SectionCheckHook A hook which can check if the section is the target one. + @param FileHeader A pointer to the file header that contains the set of sections to be searched. @param SectionData A pointer to the discovered section, if successful. @@ -67,9 +79,10 @@ FfsFindNextFile ( 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 ); /** diff --git a/EmbeddedPkg/Library/PrePiLib/FwVol.c b/EmbeddedPkg/Library/PrePiLib/FwVol.c index 0a6d6925b7ea..778d8b13c33b 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 a0c5d02debd0..3b6fc4f0eba8 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; } -- 2.29.2.windows.2