mirror of https://github.com/acidanthera/audk.git
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 <quic_llindhol@quicinc.com> Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Abner Chang <abner.chang@amd.com> Cc: Daniel Schaefer <git@danielschaefer.me> Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Erdem Aktas <erdemaktas@google.com> Cc: James Bottomley <jejb@linux.ibm.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Tom Lendacky <thomas.lendacky@amd.com> Acked-by: Ard Biesheuvel <ardb+tianocore@kernel.org> Signed-off-by: Min Xu <min.m.xu@intel.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
6c1988af76
commit
c673216f53
|
@ -53,10 +53,22 @@ FfsFindNextFile (
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This service enables discovery sections of a given type within a valid FFS file.
|
* 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
|
||||||
|
);
|
||||||
|
|
||||||
@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
|
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 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.
|
be searched.
|
||||||
@param SectionData A pointer to the discovered section, if successful.
|
@param SectionData A pointer to the discovered section, if successful.
|
||||||
|
|
||||||
|
@ -67,9 +79,10 @@ FfsFindNextFile (
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FfsFindSectionData (
|
FfsFindSectionData (
|
||||||
IN EFI_SECTION_TYPE SectionType,
|
IN EFI_SECTION_TYPE SectionType,
|
||||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
IN FFS_CHECK_SECTION_HOOK SectionCheckHook,
|
||||||
OUT VOID **SectionData
|
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||||
|
OUT VOID **SectionData
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -264,16 +264,18 @@ FindFileEx (
|
||||||
Go through the file to search SectionType section,
|
Go through the file to search SectionType section,
|
||||||
when meeting an encapsuled section.
|
when meeting an encapsuled section.
|
||||||
|
|
||||||
@param SectionType - Filter to find only section of this type.
|
@param SectionType - Filter to find only section of this type.
|
||||||
@param Section - From where to search.
|
@param SectionCheckHook - A hook which can check if the section is the target one.
|
||||||
@param SectionSize - The file size to search.
|
@param Section - From where to search.
|
||||||
@param OutputBuffer - Pointer to the section to search.
|
@param SectionSize - The file size to search.
|
||||||
|
@param OutputBuffer - Pointer to the section to search.
|
||||||
|
|
||||||
@retval EFI_SUCCESS
|
@retval EFI_SUCCESS
|
||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
FfsProcessSection (
|
FfsProcessSection (
|
||||||
IN EFI_SECTION_TYPE SectionType,
|
IN EFI_SECTION_TYPE SectionType,
|
||||||
|
IN FFS_CHECK_SECTION_HOOK SectionCheckHook,
|
||||||
IN EFI_COMMON_SECTION_HEADER *Section,
|
IN EFI_COMMON_SECTION_HEADER *Section,
|
||||||
IN UINTN SectionSize,
|
IN UINTN SectionSize,
|
||||||
OUT VOID **OutputBuffer
|
OUT VOID **OutputBuffer
|
||||||
|
@ -292,7 +294,9 @@ FfsProcessSection (
|
||||||
UINT32 AuthenticationStatus;
|
UINT32 AuthenticationStatus;
|
||||||
CHAR8 *CompressedData;
|
CHAR8 *CompressedData;
|
||||||
UINT32 CompressedDataLength;
|
UINT32 CompressedDataLength;
|
||||||
|
BOOLEAN Found;
|
||||||
|
|
||||||
|
Found = FALSE;
|
||||||
*OutputBuffer = NULL;
|
*OutputBuffer = NULL;
|
||||||
ParsedLength = 0;
|
ParsedLength = 0;
|
||||||
Status = EFI_NOT_FOUND;
|
Status = EFI_NOT_FOUND;
|
||||||
|
@ -302,13 +306,23 @@ FfsProcessSection (
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Section->Type == SectionType) {
|
if (Section->Type == SectionType) {
|
||||||
if (IS_SECTION2 (Section)) {
|
if (SectionCheckHook != NULL) {
|
||||||
*OutputBuffer = (VOID *)((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER2));
|
Found = SectionCheckHook (Section) == EFI_SUCCESS;
|
||||||
} else {
|
} 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)) {
|
} else if ((Section->Type == EFI_SECTION_COMPRESSION) || (Section->Type == EFI_SECTION_GUID_DEFINED)) {
|
||||||
if (Section->Type == EFI_SECTION_COMPRESSION) {
|
if (Section->Type == EFI_SECTION_COMPRESSION) {
|
||||||
if (IS_SECTION2 (Section)) {
|
if (IS_SECTION2 (Section)) {
|
||||||
|
@ -415,6 +429,7 @@ FfsProcessSection (
|
||||||
} else {
|
} else {
|
||||||
return FfsProcessSection (
|
return FfsProcessSection (
|
||||||
SectionType,
|
SectionType,
|
||||||
|
SectionCheckHook,
|
||||||
DstBuffer,
|
DstBuffer,
|
||||||
DstBufferSize,
|
DstBufferSize,
|
||||||
OutputBuffer
|
OutputBuffer
|
||||||
|
@ -422,6 +437,7 @@ FfsProcessSection (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CheckNextSection:
|
||||||
if (IS_SECTION2 (Section)) {
|
if (IS_SECTION2 (Section)) {
|
||||||
SectionLength = SECTION2_SIZE (Section);
|
SectionLength = SECTION2_SIZE (Section);
|
||||||
} else {
|
} else {
|
||||||
|
@ -456,9 +472,10 @@ FfsProcessSection (
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FfsFindSectionData (
|
FfsFindSectionData (
|
||||||
IN EFI_SECTION_TYPE SectionType,
|
IN EFI_SECTION_TYPE SectionType,
|
||||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
IN FFS_CHECK_SECTION_HOOK SectionCheckHook,
|
||||||
OUT VOID **SectionData
|
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||||
|
OUT VOID **SectionData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_FFS_FILE_HEADER *FfsFileHeader;
|
EFI_FFS_FILE_HEADER *FfsFileHeader;
|
||||||
|
@ -478,6 +495,7 @@ FfsFindSectionData (
|
||||||
|
|
||||||
return FfsProcessSection (
|
return FfsProcessSection (
|
||||||
SectionType,
|
SectionType,
|
||||||
|
SectionCheckHook,
|
||||||
Section,
|
Section,
|
||||||
FileSize,
|
FileSize,
|
||||||
SectionData
|
SectionData
|
||||||
|
@ -799,7 +817,7 @@ FfsProcessFvFile (
|
||||||
//
|
//
|
||||||
// Find FvImage in FvFile
|
// 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)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,7 +131,7 @@ LoadDxeCoreFromFfsFile (
|
||||||
VOID *Hob;
|
VOID *Hob;
|
||||||
EFI_FV_FILE_INFO FvFileInfo;
|
EFI_FV_FILE_INFO FvFileInfo;
|
||||||
|
|
||||||
Status = FfsFindSectionData (EFI_SECTION_PE32, FileHandle, &PeCoffImage);
|
Status = FfsFindSectionData (EFI_SECTION_PE32, NULL, FileHandle, &PeCoffImage);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue