Add Mike Kinney.

Hi Mike
Do you have any suggestion on how to implement this in a self-contained 
environment for gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress?

 STATIC UINT64 mExtractGuidedSectionHandlerInfo[64];
 PcdSet64 (PcdGuidedExtractHandlerTableAddress, 
(UINT64)mExtractGuidedSectionHandlerInfo);

Maybe, we can consider below from secure coding perspective.
1) Define a MACRO for 64.
2) Add a check (somewhere) to see if there is overflow on 64, then stop and 
report error.



Thank you
Yao Jiewen

> -----Original Message-----
> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
> Sent: Friday, January 18, 2019 7:42 AM
> To: Yao, Jiewen <jiewen....@intel.com>
> Cc: edk2-devel@lists.01.org; Achin Gupta <achin.gu...@arm.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: Re: [PATCH v2 11/11] StandaloneMmPkg/Core: permit encapsulated
> firmware volumes
> 
> On Fri, 18 Jan 2019 at 16:40, Yao, Jiewen <jiewen....@intel.com> wrote:
> >
> > 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?
> >
> 
> Good question. I wasn't really sure how to implement this. For any
> given platform configuration, I don't think you will ever need more
> than one handler, unless you are encapsulating a compressed FV inside
> a signed FV perhaps?
> 
> Do you have any suggestions how to improve this code?
> 
> >
> > > -----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

Reply via email to