The idea seems good. May I know if there is any restriction on 64 handlers?
+STATIC UINT64 mExtractGuidedSectionHandlerInfo[64]; If a system is configured with more handlers, what is expected behavior? Thank you Yao Jiewen > -----Original Message----- > From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org] > Sent: Wednesday, January 16, 2019 12:23 PM > To: edk2-devel@lists.01.org > Cc: Ard Biesheuvel <ard.biesheu...@linaro.org>; Achin Gupta > <achin.gu...@arm.com>; Yao, Jiewen <jiewen....@intel.com>; Supreeth > Venkatesh <supreeth.venkat...@arm.com>; Leif Lindholm > <leif.lindh...@linaro.org>; Jagadeesh Ujja <jagadeesh.u...@arm.com>; > Thomas Panakamattam Abraham <thomas.abra...@arm.com>; Sami > Mujawar <sami.muja...@arm.com> > Subject: [PATCH v2 11/11] StandaloneMmPkg/Core: permit encapsulated > firmware volumes > > Standalone MM requires 4 KB section alignment for all images, so that > strict permissions can be applied. Unfortunately, this results in a > lot of wasted space, which is usually costly in the secure world > environment that standalone MM is expected to operate in. > > So let's permit the standalone MM drivers (but not the core) to be > delivered in a compressed firmware volume. > > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org> > --- > StandaloneMmPkg/Core/FwVol.c > | 99 ++++++++++++++++++-- > StandaloneMmPkg/Core/StandaloneMmCore.inf > | 1 + > > StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/Standal > oneMmCoreEntryPoint.c | 5 + > > StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCo > reEntryPoint.inf | 3 + > 4 files changed, 99 insertions(+), 9 deletions(-) > > diff --git a/StandaloneMmPkg/Core/FwVol.c > b/StandaloneMmPkg/Core/FwVol.c > index 5abf98c24797..8eb827dda5c4 100644 > --- a/StandaloneMmPkg/Core/FwVol.c > +++ b/StandaloneMmPkg/Core/FwVol.c > @@ -14,6 +14,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF > ANY KIND, EITHER EXPRESS OR IMPLIED. > > #include "StandaloneMmCore.h" > #include <Library/FvLib.h> > +#include <Library/ExtractGuidedSectionLib.h> > > // > // List of file types supported by dispatcher > @@ -65,15 +66,25 @@ Returns: > > --*/ > { > - EFI_STATUS Status; > - EFI_STATUS DepexStatus; > - EFI_FFS_FILE_HEADER *FileHeader; > - EFI_FV_FILETYPE FileType; > - VOID *Pe32Data; > - UINTN Pe32DataSize; > - VOID *Depex; > - UINTN DepexSize; > - UINTN Index; > + EFI_STATUS Status; > + EFI_STATUS DepexStatus; > + EFI_FFS_FILE_HEADER *FileHeader; > + EFI_FV_FILETYPE FileType; > + VOID *Pe32Data; > + UINTN Pe32DataSize; > + VOID *Depex; > + UINTN DepexSize; > + UINTN Index; > + EFI_COMMON_SECTION_HEADER *Section; > + VOID *SectionData; > + UINTN SectionDataSize; > + UINT32 DstBufferSize; > + VOID *ScratchBuffer; > + UINT32 ScratchBufferSize; > + VOID *DstBuffer; > + UINT16 SectionAttribute; > + UINT32 AuthenticationStatus; > + EFI_FIRMWARE_VOLUME_HEADER *InnerFvHeader; > > DEBUG ((DEBUG_INFO, "MmCoreFfsFindMmDriver - 0x%x\n", > FwVolHeader)); > > @@ -83,6 +94,71 @@ Returns: > > FvIsBeingProcesssed (FwVolHeader); > > + // > + // First check for encapsulated compressed firmware volumes > + // > + FileHeader = NULL; > + do { > + Status = FfsFindNextFile > (EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE, > + FwVolHeader, &FileHeader); > + if (EFI_ERROR (Status)) { > + break; > + } > + Status = FfsFindSectionData (EFI_SECTION_GUID_DEFINED, > FileHeader, > + &SectionData, &SectionDataSize); > + if (EFI_ERROR (Status)) { > + break; > + } > + Section = (EFI_COMMON_SECTION_HEADER *)(FileHeader + 1); > + Status = ExtractGuidedSectionGetInfo (Section, &DstBufferSize, > + &ScratchBufferSize, &SectionAttribute); > + if (EFI_ERROR (Status)) { > + break; > + } > + > + // > + // Allocate scratch buffer > + // > + ScratchBuffer = (VOID *)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES > (ScratchBufferSize)); > + if (ScratchBuffer == NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + // > + // Allocate destination buffer > + // > + DstBuffer = (VOID *)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES > (DstBufferSize)); > + if (DstBuffer == NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + // > + // Call decompress function > + // > + Status = ExtractGuidedSectionDecode (Section, &DstBuffer, > ScratchBuffer, > + &AuthenticationStatus); > + FreePages (ScratchBuffer, EFI_SIZE_TO_PAGES (ScratchBufferSize)); > + if (EFI_ERROR (Status)) { > + goto FreeDstBuffer; > + } > + > + DEBUG ((DEBUG_INFO, > + "Processing compressed firmware volume (AuthenticationStatus > == %x)\n", > + AuthenticationStatus)); > + > + Status = FindFfsSectionInSections (DstBuffer, DstBufferSize, > + EFI_SECTION_FIRMWARE_VOLUME_IMAGE, &Section); > + if (EFI_ERROR (Status)) { > + goto FreeDstBuffer; > + } > + > + InnerFvHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(Section + 1); > + Status = MmCoreFfsFindMmDriver (InnerFvHeader); > + if (EFI_ERROR (Status)) { > + goto FreeDstBuffer; > + } > + } while (TRUE); > + > for (Index = 0; Index < sizeof (mMmFileTypes) / sizeof (mMmFileTypes[0]); > Index++) { > DEBUG ((DEBUG_INFO, "Check MmFileTypes - 0x%x\n", > mMmFileTypes[Index])); > FileType = mMmFileTypes[Index]; > @@ -100,5 +176,10 @@ Returns: > } while (!EFI_ERROR (Status)); > } > > + return EFI_SUCCESS; > + > +FreeDstBuffer: > + FreePages (DstBuffer, EFI_SIZE_TO_PAGES (DstBufferSize)); > + > return Status; > } > diff --git a/StandaloneMmPkg/Core/StandaloneMmCore.inf > b/StandaloneMmPkg/Core/StandaloneMmCore.inf > index ff2b8b9cef03..83d31e2d92c5 100644 > --- a/StandaloneMmPkg/Core/StandaloneMmCore.inf > +++ b/StandaloneMmPkg/Core/StandaloneMmCore.inf > @@ -49,6 +49,7 @@ [LibraryClasses] > BaseMemoryLib > CacheMaintenanceLib > DebugLib > + ExtractGuidedSectionLib > FvLib > HobLib > MemoryAllocationLib > diff --git > a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/Stand > aloneMmCoreEntryPoint.c > b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/Stand > aloneMmCoreEntryPoint.c > index 5cca532456fd..67ff9112d5c0 100644 > --- > a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/Stand > aloneMmCoreEntryPoint.c > +++ > b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/Stand > aloneMmCoreEntryPoint.c > @@ -205,6 +205,8 @@ GetSpmVersion (VOID) > return Status; > } > > +STATIC UINT64 mExtractGuidedSectionHandlerInfo[64]; > + > /** > The entry point of Standalone MM Foundation. > > @@ -285,6 +287,9 @@ _ModuleEntryPoint ( > goto finish; > } > > + PcdSet64 (PcdGuidedExtractHandlerTableAddress, > + (UINT64)mExtractGuidedSectionHandlerInfo); > + > // > // Create Hoblist based upon boot information passed by privileged > software > // > diff --git > a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMm > CoreEntryPoint.inf > b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMm > CoreEntryPoint.inf > index 769eaeeefbea..55d769fa77e4 100644 > --- > a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMm > CoreEntryPoint.inf > +++ > b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMm > CoreEntryPoint.inf > @@ -54,3 +54,6 @@ [Guids] > gEfiMmPeiMmramMemoryReserveGuid > gEfiStandaloneMmNonSecureBufferGuid > gEfiArmTfCpuDriverEpDescriptorGuid > + > +[PatchPcd] > + gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress > -- > 2.17.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel