Siyuan,
Your pasted code only counts the Type 1 entry not Type 0 entry.

Thanks,
Ray

> -----Original Message-----
> From: Fu, Siyuan <siyuan...@intel.com>
> Sent: Wednesday, February 19, 2020 1:20 PM
> To: Ni, Ray <ray...@intel.com>; devel@edk2.groups.io
> Cc: Kinney, Michael D <michael.d.kin...@intel.com>; Chaganty, Rangasai V 
> <rangasai.v.chaga...@intel.com>
> Subject: RE: [PATCH v5] IntelSiliconPkg: FIT based shadow microcode PPI 
> support.
> 
> Hi, Ray
> 
> The " Just one Type 0 entry in FIT " will be covered by below code when 
> calculating the microcode entry number. I will
> update the patch to address your other comments. Thanks for the review.
> 
>   //
>   // Calculate microcode entry number
>   //
>   MaxPatchNumber = 0;
>   for (Index = 0; Index < EntryNum; Index++) {
>     if (FitEntry[Index].Type == FIT_TYPE_01_MICROCODE) {
>       MaxPatchNumber++;
>     }
>   }
>   if (MaxPatchNumber == 0) {
>     return EFI_NOT_FOUND;
>   }
> 
> Best Regards
> Siyuan
> 
> > -----Original Message-----
> > From: Ni, Ray <ray...@intel.com>
> > Sent: 2020年2月19日 10:31
> > To: Fu, Siyuan <siyuan...@intel.com>; devel@edk2.groups.io
> > Cc: Kinney, Michael D <michael.d.kin...@intel.com>; Chaganty, Rangasai V
> > <rangasai.v.chaga...@intel.com>
> > Subject: RE: [PATCH v5] IntelSiliconPkg: FIT based shadow microcode PPI
> > support.
> >
> > 1. EFIAPI is missing for ShadowMicrocode()
> > 2. What's the reason of creating a separate function
> > ShadowMicrocodePatchByFit ()? Is that because you think this PEIM may
> > support other uCode load mechanism than FIT? If no, can you merge the
> > *ByFit() to ShadowMicrocode()?
> > 3. "Invalid FIT point" -> "Invalid FIT pointer"
> > 4. According to FIT spec, I think you missed three additional checks on the 
> > FIT
> > Header:
> >     a). Just one Type 0 entry in FIT
> >     b). If C_V is set, FIT table checksum must be 0.
> >     c). Version should be 0x0100.
> >     More checks can make sure that we are visiting the real FIT. Because 
> > from
> > the spec, we have no other way to know whether a FIT really exists from data
> > not from FIT itself.
> >
> > > -----Original Message-----
> > > From: Fu, Siyuan <siyuan...@intel.com>
> > > Sent: Monday, February 17, 2020 9:44 AM
> > > To: devel@edk2.groups.io
> > > Cc: Kinney, Michael D <michael.d.kin...@intel.com>; Ni, Ray
> > <ray...@intel.com>; Chaganty, Rangasai V
> > > <rangasai.v.chaga...@intel.com>
> > > Subject: [PATCH v5] IntelSiliconPkg: FIT based shadow microcode PPI
> > support.
> > >
> > > V5 Changes:
> > > Add FIT address check to see if it's in valid firmware region.
> > > V4 Changes:
> > > Adjust EDKII_MICROCODE_SHADOW_INFO_HOB structure definition for
> > > better alignment and understanding.
> > > Add EFI_MICROCODE_STORAGE_TYPE_FLASH_CONTEXT structure
> > definition.
> > > Fix a typo in EFI_MICROCODE_STORAGE_TYPE_FLASH_GUID.
> > > Merge ShadowMicrocodePei.h header into c file.
> > > Correct file header description and copy right year.
> > > V3 Changes:
> > > Remove the feature PCD PcdCpuShadowMicrocodeByFit because the
> > > whole FIT microcode shadow code is moved to this PEIM so platform
> > > could disable this feature by not include PEIM now.
> > > V2 Changes:
> > > Rename EDKII_PEI_CPU_MICROCODE_ID to EDKII_PEI_MICROCODE_CPU_ID.
> > >
> > > This patch adds a platform PEIM for FIT based shadow microcode PPI
> > > support. A detailed design doc can be found here:
> > > https://edk2.groups.io/g/devel/files/Designs/2020/0214/Support%20
> > > the%202nd%20Microcode%20FV%20Flash%20Region.pdf
> > >
> > > TEST: Tested on FIT enabled platform.
> > > BZ: https://tianocore.acgmultimedia.com/show_bug.cgi?id=2449
> > >
> > > Cc: Michael D Kinney <michael.d.kin...@intel.com>
> > > Cc: Ray Ni <ray...@intel.com>
> > > Cc: Rangasai V Chaganty <rangasai.v.chaga...@intel.com>
> > > Signed-off-by: Siyuan Fu <siyuan...@intel.com>
> > > ---
> > >  .../ShadowMicrocode/ShadowMicrocodePei.c      | 446
> > ++++++++++++++++++
> > >  .../ShadowMicrocode/ShadowMicrocodePei.inf    |  43 ++
> > >  .../Include/Guid/MicrocodeShadowInfoHob.h     |  64 +++
> > >  .../Intel/IntelSiliconPkg/IntelSiliconPkg.dec |   8 +-
> > >  .../Intel/IntelSiliconPkg/IntelSiliconPkg.dsc |   3 +-
> > >  5 files changed, 562 insertions(+), 2 deletions(-)
> > >  create mode 100644
> > Silicon/Intel/IntelSiliconPkg/Feature/ShadowMicrocode/ShadowMicrocodeP
> > ei.c
> > >  create mode 100644
> > Silicon/Intel/IntelSiliconPkg/Feature/ShadowMicrocode/ShadowMicrocodeP
> > ei.inf
> > >  create mode 100644
> > Silicon/Intel/IntelSiliconPkg/Include/Guid/MicrocodeShadowInfoHob.h
> > >
> > > diff --git
> > a/Silicon/Intel/IntelSiliconPkg/Feature/ShadowMicrocode/ShadowMicrocod
> > ePei.c
> > >
> > b/Silicon/Intel/IntelSiliconPkg/Feature/ShadowMicrocode/ShadowMicrocod
> > ePei.c
> > > new file mode 100644
> > > index 0000000000..e130f61fb0
> > > --- /dev/null
> > > +++
> > b/Silicon/Intel/IntelSiliconPkg/Feature/ShadowMicrocode/ShadowMicrocod
> > ePei.c
> > > @@ -0,0 +1,446 @@
> > > +/** @file
> > > +  FIT based microcode shadow PEIM.
> > > +
> > > +Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> > > +SPDX-License-Identifier: BSD-2-Clause-Patent
> > > +
> > > +**/
> > > +
> > > +#include <PiPei.h>
> > > +#include <Ppi/ShadowMicrocode.h>
> > > +#include <Library/PeiServicesLib.h>
> > > +#include <Library/HobLib.h>
> > > +#include <Library/DebugLib.h>
> > > +#include <Library/BaseMemoryLib.h>
> > > +#include <Library/MemoryAllocationLib.h>
> > > +#include <IndustryStandard/FirmwareInterfaceTable.h>
> > > +#include <Register/Intel/Microcode.h>
> > > +#include <Register/Intel/Cpuid.h>
> > > +#include <Guid/MicrocodeShadowInfoHob.h>
> > > +//
> > > +// Data structure for microcode patch information
> > > +//
> > > +typedef struct {
> > > +  UINTN    Address;
> > > +  UINTN    Size;
> > > +} MICROCODE_PATCH_INFO;
> > > +
> > > +/**
> > > +  Shadow microcode update patches to memory.
> > > +
> > > +  The function is used for shadowing microcode update patches to a
> > continuous memory.
> > > +  It shall allocate memory buffer and only shadow the microcode patches
> > for those
> > > +  processors specified by MicrocodeCpuId array. The checksum verification
> > may be
> > > +  skiped in this function so the caller must perform checksum 
> > > verification
> > before
> > > +  using the microcode patches in returned memory buffer.
> > > +
> > > +  @param[in]  This                 The PPI instance pointer.
> > > +  @param[in]  CpuIdCount           Number of elements in MicrocodeCpuId
> > array.
> > > +  @param[in]  MicrocodeCpuId       A pointer to an array of
> > EDKII_PEI_MICROCODE_CPU_ID
> > > +                                   structures.
> > > +  @param[out] BufferSize           Pointer to receive the total size of 
> > > Buffer.
> > > +  @param[out] Buffer               Pointer to receive address of 
> > > allocated
> > memory
> > > +                                   with microcode patches data in it.
> > > +
> > > +  @retval EFI_SUCCESS              The microcode has been shadowed to
> > memory.
> > > +  @retval EFI_OUT_OF_RESOURCES     The operation fails due to lack of
> > resources.
> > > +
> > > +**/
> > > +EFI_STATUS
> > > +ShadowMicrocode (
> > > +  IN  EDKII_PEI_SHADOW_MICROCODE_PPI        *This,
> > > +  IN  UINTN                                 CpuIdCount,
> > > +  IN  EDKII_PEI_MICROCODE_CPU_ID            *MicrocodeCpuId,
> > > +  OUT UINTN                                 *BufferSize,
> > > +  OUT VOID                                  **Buffer
> > > +  );
> > > +
> > > +
> > > +EDKII_PEI_SHADOW_MICROCODE_PPI   mPeiShadowMicrocodePpi = {
> > > +  ShadowMicrocode
> > > +};
> > > +
> > > +
> > > +EFI_PEI_PPI_DESCRIPTOR           mPeiShadowMicrocodePpiList[] = {
> > > +  {
> > > +    EFI_PEI_PPI_DESCRIPTOR_PPI |
> > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
> > > +    &gEdkiiPeiShadowMicrocodePpiGuid,
> > > +    &mPeiShadowMicrocodePpi
> > > +  }
> > > +};
> > > +
> > > +/**
> > > +  Determine if a microcode patch matchs the specific processor signature
> > and flag.
> > > +
> > > +  @param[in]  CpuIdCount            Number of elements in MicrocodeCpuId
> > array.
> > > +  @param[in]  MicrocodeCpuId        A pointer to an array of
> > EDKII_PEI_MICROCODE_CPU_ID
> > > +                                    structures.
> > > +  @param[in]  ProcessorSignature    The processor signature field value
> > > +                                    supported by a microcode patch.
> > > +  @param[in]  ProcessorFlags        The prcessor flags field value 
> > > supported
> > by
> > > +                                    a microcode patch.
> > > +
> > > +  @retval TRUE     The specified microcode patch will be loaded.
> > > +  @retval FALSE    The specified microcode patch will not be loaded.
> > > +**/
> > > +BOOLEAN
> > > +IsProcessorMatchedMicrocodePatch (
> > > +  IN  UINTN                           CpuIdCount,
> > > +  IN  EDKII_PEI_MICROCODE_CPU_ID      *MicrocodeCpuId,
> > > +  IN UINT32                           ProcessorSignature,
> > > +  IN UINT32                           ProcessorFlags
> > > +  )
> > > +{
> > > +  UINTN          Index;
> > > +
> > > +  for (Index = 0; Index < CpuIdCount; Index++) {
> > > +    if ((ProcessorSignature == MicrocodeCpuId[Index].ProcessorSignature)
> > &&
> > > +        (ProcessorFlags & (1 << MicrocodeCpuId[Index].PlatformId)) != 0) 
> > > {
> > > +      return TRUE;
> > > +    }
> > > +  }
> > > +
> > > +  return FALSE;
> > > +}
> > > +
> > > +/**
> > > +  Check the 'ProcessorSignature' and 'ProcessorFlags' of the microcode
> > > +  patch header with the CPUID and PlatformID of the processors within
> > > +  system to decide if it will be copied into memory.
> > > +
> > > +  @param[in]  CpuIdCount            Number of elements in MicrocodeCpuId
> > array.
> > > +  @param[in]  MicrocodeCpuId        A pointer to an array of
> > EDKII_PEI_MICROCODE_CPU_ID
> > > +                                    structures.
> > > +  @param[in]  MicrocodeEntryPoint   The pointer to the microcode patch
> > header.
> > > +
> > > +  @retval TRUE     The specified microcode patch need to be loaded.
> > > +  @retval FALSE    The specified microcode patch dosen't need to be
> > loaded.
> > > +**/
> > > +BOOLEAN
> > > +IsMicrocodePatchNeedLoad (
> > > +  IN  UINTN                         CpuIdCount,
> > > +  IN  EDKII_PEI_MICROCODE_CPU_ID    *MicrocodeCpuId,
> > > +  CPU_MICROCODE_HEADER              *MicrocodeEntryPoint
> > > +  )
> > > +{
> > > +  BOOLEAN                                NeedLoad;
> > > +  UINTN                                  DataSize;
> > > +  UINTN                                  TotalSize;
> > > +  CPU_MICROCODE_EXTENDED_TABLE_HEADER    *ExtendedTableHeader;
> > > +  UINT32                                 ExtendedTableCount;
> > > +  CPU_MICROCODE_EXTENDED_TABLE           *ExtendedTable;
> > > +  UINTN                                  Index;
> > > +
> > > +  //
> > > +  // Check the 'ProcessorSignature' and 'ProcessorFlags' in microcode
> > patch header.
> > > +  //
> > > +  NeedLoad = IsProcessorMatchedMicrocodePatch (
> > > +               CpuIdCount,
> > > +               MicrocodeCpuId,
> > > +               MicrocodeEntryPoint->ProcessorSignature.Uint32,
> > > +               MicrocodeEntryPoint->ProcessorFlags
> > > +               );
> > > +
> > > +  //
> > > +  // If the Extended Signature Table exists, check if the processor is 
> > > in the
> > > +  // support list
> > > +  //
> > > +  DataSize  = MicrocodeEntryPoint->DataSize;
> > > +  TotalSize = (DataSize == 0) ? 2048 : MicrocodeEntryPoint->TotalSize;
> > > +  if ((!NeedLoad) && (DataSize != 0) &&
> > > +      (TotalSize - DataSize > sizeof (CPU_MICROCODE_HEADER) +
> > > +                              sizeof 
> > > (CPU_MICROCODE_EXTENDED_TABLE_HEADER)))
> > {
> > > +    ExtendedTableHeader = (CPU_MICROCODE_EXTENDED_TABLE_HEADER
> > *) ((UINT8 *) (MicrocodeEntryPoint)
> > > +                            + DataSize + sizeof (CPU_MICROCODE_HEADER));
> > > +    ExtendedTableCount  = ExtendedTableHeader->ExtendedSignatureCount;
> > > +    ExtendedTable       = (CPU_MICROCODE_EXTENDED_TABLE *)
> > (ExtendedTableHeader + 1);
> > > +
> > > +    for (Index = 0; Index < ExtendedTableCount; Index ++) {
> > > +      //
> > > +      // Check the 'ProcessorSignature' and 'ProcessorFlag' of the 
> > > Extended
> > > +      // Signature Table entry with the CPUID and PlatformID of the
> > processors
> > > +      // within system to decide if it will be copied into memory
> > > +      //
> > > +      NeedLoad = IsProcessorMatchedMicrocodePatch (
> > > +                   CpuIdCount,
> > > +                   MicrocodeCpuId,
> > > +                   ExtendedTable->ProcessorSignature.Uint32,
> > > +                   ExtendedTable->ProcessorFlag
> > > +                   );
> > > +      if (NeedLoad) {
> > > +        break;
> > > +      }
> > > +      ExtendedTable ++;
> > > +    }
> > > +  }
> > > +
> > > +  return NeedLoad;
> > > +}
> > > +
> > > +/**
> > > +  Actual worker function that shadows the required microcode patches
> > into memory.
> > > +
> > > +  @param[in]       Patches          The pointer to an array of 
> > > information on
> > > +                                    the microcode patches that will be 
> > > loaded
> > > +                                    into memory.
> > > +  @param[in]       PatchCount       The number of microcode patches that
> > will
> > > +                                    be loaded into memory.
> > > +  @param[in]       TotalLoadSize    The total size of all the microcode
> > patches
> > > +                                    to be loaded.
> > > +  @param[out] BufferSize            Pointer to receive the total size of 
> > > Buffer.
> > > +  @param[out] Buffer                Pointer to receive address of 
> > > allocated
> > memory
> > > +                                    with microcode patches data in it.
> > > +**/
> > > +VOID
> > > +ShadowMicrocodePatchWorker (
> > > +  IN  MICROCODE_PATCH_INFO       *Patches,
> > > +  IN  UINTN                      PatchCount,
> > > +  IN  UINTN                      TotalLoadSize,
> > > +  OUT UINTN                      *BufferSize,
> > > +  OUT VOID                       **Buffer
> > > +  )
> > > +{
> > > +  UINTN                                     Index;
> > > +  VOID                                      *MicrocodePatchInRam;
> > > +  UINT8                                     *Walker;
> > > +  EDKII_MICROCODE_SHADOW_INFO_HOB           *MicrocodeShadowHob;
> > > +  UINTN                                     HobDataLength;
> > > +  UINT64                                    *MicrocodeAddressInMemory;
> > > +  EFI_MICROCODE_STORAGE_TYPE_FLASH_CONTEXT  *Flashcontext;
> > > +
> > > +  ASSERT ((Patches != NULL) && (PatchCount != 0));
> > > +
> > > +  //
> > > +  // Init microcode shadow info HOB content.
> > > +  //
> > > +  HobDataLength = sizeof (EDKII_MICROCODE_SHADOW_INFO_HOB) +
> > > +                  sizeof (UINT64) * PatchCount * 2;
> > > +  MicrocodeShadowHob  = AllocatePool (HobDataLength);
> > > +  if (MicrocodeShadowHob == NULL) {
> > > +    ASSERT (FALSE);
> > > +    return;
> > > +  }
> > > +  MicrocodeShadowHob->MicrocodeCount = PatchCount;
> > > +  CopyGuid (
> > > +    &MicrocodeShadowHob->StorageType,
> > > +    &gEdkiiMicrocodeStorageTypeFlashGuid
> > > +    );
> > > +  MicrocodeAddressInMemory = (UINT64 *) (MicrocodeShadowHob + 1);
> > > +  Flashcontext = (EFI_MICROCODE_STORAGE_TYPE_FLASH_CONTEXT *)
> > (MicrocodeAddressInMemory + PatchCount);
> > > +
> > > +  //
> > > +  // Allocate memory for microcode shadow operation.
> > > +  //
> > > +  MicrocodePatchInRam = AllocatePages (EFI_SIZE_TO_PAGES
> > (TotalLoadSize));
> > > +  if (MicrocodePatchInRam == NULL) {
> > > +    ASSERT (FALSE);
> > > +    return;
> > > +  }
> > > +
> > > +  //
> > > +  // Shadow all the required microcode patches into memory
> > > +  //
> > > +  for (Walker = MicrocodePatchInRam, Index = 0; Index < PatchCount;
> > Index++) {
> > > +    CopyMem (
> > > +      Walker,
> > > +      (VOID *) Patches[Index].Address,
> > > +      Patches[Index].Size
> > > +      );
> > > +    MicrocodeAddressInMemory[Index] = (UINT64) Walker;
> > > +    Flashcontext->MicrocodeAddressInFlash[Index]  = (UINT64)
> > Patches[Index].Address;
> > > +    Walker += Patches[Index].Size;
> > > +  }
> > > +
> > > +  //
> > > +  // Update the microcode patch related fields in CpuMpData
> > > +  //
> > > +  *Buffer     = (VOID *) (UINTN) MicrocodePatchInRam;
> > > +  *BufferSize = TotalLoadSize;
> > > +
> > > +  BuildGuidDataHob (
> > > +    &gEdkiiMicrocodeShadowInfoHobGuid,
> > > +    MicrocodeShadowHob,
> > > +    HobDataLength
> > > +    );
> > > +
> > > +  DEBUG ((
> > > +    DEBUG_INFO,
> > > +    "%a: Required microcode patches have been loaded at 0x%lx, with size
> > 0x%lx.\n",
> > > +    __FUNCTION__, *Buffer, *BufferSize
> > > +    ));
> > > +
> > > +  return;
> > > +}
> > > +
> > > +/**
> > > +  Shadow the required microcode patches data into memory according
> > > +  to FIT microcode entry.
> > > +
> > > +**/
> > > +EFI_STATUS
> > > +ShadowMicrocodePatchByFit (
> > > +  IN  UINTN                                 CpuIdCount,
> > > +  IN  EDKII_PEI_MICROCODE_CPU_ID            *MicrocodeCpuId,
> > > +  OUT UINTN                                 *BufferSize,
> > > +  OUT VOID                                  **Buffer
> > > +  )
> > > +{
> > > +  UINT64                            FitPointer;
> > > +  UINT64                            FitEnding;
> > > +  FIRMWARE_INTERFACE_TABLE_ENTRY    *FitEntry;
> > > +  UINT32                            EntryNum;
> > > +  UINT32                            Index;
> > > +  MICROCODE_PATCH_INFO              *PatchInfoBuffer;
> > > +  UINTN                             MaxPatchNumber;
> > > +  CPU_MICROCODE_HEADER              *MicrocodeEntryPoint;
> > > +  UINTN                             PatchCount;
> > > +  UINTN                             TotalSize;
> > > +  UINTN                             TotalLoadSize;
> > > +
> > > +  FitPointer = *(UINT64 *) (UINTN) FIT_POINTER_ADDRESS;
> > > +
> > > +  //
> > > +  // The entire FIT table must reside with in the firmware address range
> > > +  // of (4GB-16MB) to (4GB-40h).
> > > +  //
> > > +  if ((FitPointer < (SIZE_4GB - SIZE_16MB)) || (FitPointer >= (SIZE_4GB -
> > 0x40))) {
> > > +    //
> > > +    // Invalid FIT address, treat it as no FIT table.
> > > +    //
> > > +    DEBUG ((DEBUG_ERROR, "Error: Invalid FIT point 0x%p.\n", 
> > > FitPointer));
> > > +    return EFI_NOT_FOUND;
> > > +  }
> > > +  FitEntry = (FIRMWARE_INTERFACE_TABLE_ENTRY *) (UINTN) FitPointer;
> > > +  if ((FitEntry[0].Type != FIT_TYPE_00_HEADER) ||
> > > +      (FitEntry[0].Address != FIT_TYPE_00_SIGNATURE)) {
> > > +    //
> > > +    // Invalid FIT header, treat it as no FIT table.
> > > +    //
> > > +    DEBUG ((DEBUG_ERROR, "Error: Invalid FIT header.\n"));
> > > +    return EFI_NOT_FOUND;
> > > +  }
> > > +  EntryNum = *(UINT32 *)(&FitEntry[0].Size[0]) & 0xFFFFFF;
> > > +  FitEnding = FitPointer + sizeof (FIRMWARE_INTERFACE_TABLE_ENTRY) *
> > EntryNum;
> > > +  if (FitEnding  > (SIZE_4GB - 0x40)) {
> > > +    //
> > > +    // Invalid FIT ending address, treat it as no FIT table.
> > > +    //
> > > +    DEBUG ((DEBUG_ERROR, "Error: FIT table exceeds valid range.\n"));
> > > +    return EFI_NOT_FOUND;
> > > +  }
> > > +
> > > +  //
> > > +  // Calculate microcode entry number
> > > +  //
> > > +  MaxPatchNumber = 0;
> > > +  for (Index = 0; Index < EntryNum; Index++) {
> > > +    if (FitEntry[Index].Type == FIT_TYPE_01_MICROCODE) {
> > > +      MaxPatchNumber++;
> > > +    }
> > > +  }
> > > +  if (MaxPatchNumber == 0) {
> > > +    return EFI_NOT_FOUND;
> > > +  }
> > > +
> > > +  PatchInfoBuffer = AllocatePool (MaxPatchNumber * sizeof
> > (MICROCODE_PATCH_INFO));
> > > +  if (PatchInfoBuffer == NULL) {
> > > +    return EFI_OUT_OF_RESOURCES;
> > > +  }
> > > +
> > > +  //
> > > +  // Fill up microcode patch info buffer according to FIT table.
> > > +  //
> > > +  PatchCount = 0;
> > > +  TotalLoadSize = 0;
> > > +  for (Index = 0; Index < EntryNum; Index++) {
> > > +    if (FitEntry[Index].Type == FIT_TYPE_01_MICROCODE) {
> > > +      MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *) (UINTN)
> > FitEntry[Index].Address;
> > > +      TotalSize = (MicrocodeEntryPoint->DataSize == 0) ? 2048 :
> > MicrocodeEntryPoint->TotalSize;
> > > +      if (IsMicrocodePatchNeedLoad (CpuIdCount, MicrocodeCpuId,
> > MicrocodeEntryPoint)) {
> > > +        PatchInfoBuffer[PatchCount].Address     = (UINTN)
> > MicrocodeEntryPoint;
> > > +        PatchInfoBuffer[PatchCount].Size        = TotalSize;
> > > +        TotalLoadSize += TotalSize;
> > > +        PatchCount++;
> > > +      }
> > > +    }
> > > +  }
> > > +
> > > +  if (PatchCount != 0) {
> > > +    DEBUG ((
> > > +      DEBUG_INFO,
> > > +      "%a: 0x%x microcode patches will be loaded into memory, with size
> > 0x%x.\n",
> > > +      __FUNCTION__, PatchCount, TotalLoadSize
> > > +      ));
> > > +
> > > +    ShadowMicrocodePatchWorker (PatchInfoBuffer, PatchCount,
> > TotalLoadSize, BufferSize, Buffer);
> > > +  }
> > > +
> > > +  FreePool (PatchInfoBuffer);
> > > +  return EFI_SUCCESS;
> > > +}
> > > +
> > > +
> > > +/**
> > > +  Shadow microcode update patches to memory.
> > > +
> > > +  The function is used for shadowing microcode update patches to a
> > continuous memory.
> > > +  It shall allocate memory buffer and only shadow the microcode patches
> > for those
> > > +  processors specified by MicrocodeCpuId array. The checksum verification
> > may be
> > > +  skiped in this function so the caller must perform checksum 
> > > verification
> > before
> > > +  using the microcode patches in returned memory buffer.
> > > +
> > > +  @param[in]  This                 The PPI instance pointer.
> > > +  @param[in]  CpuIdCount           Number of elements in MicrocodeCpuId
> > array.
> > > +  @param[in]  MicrocodeCpuId       A pointer to an array of
> > EDKII_PEI_MICROCODE_CPU_ID
> > > +                                   structures.
> > > +  @param[out] BufferSize           Pointer to receive the total size of 
> > > Buffer.
> > > +  @param[out] Buffer               Pointer to receive address of 
> > > allocated
> > memory
> > > +                                   with microcode patches data in it.
> > > +
> > > +  @retval EFI_SUCCESS              The microcode has been shadowed to
> > memory.
> > > +  @retval EFI_OUT_OF_RESOURCES     The operation fails due to lack of
> > resources.
> > > +
> > > +**/
> > > +EFI_STATUS
> > > +ShadowMicrocode (
> > > +  IN  EDKII_PEI_SHADOW_MICROCODE_PPI        *This,
> > > +  IN  UINTN                                 CpuIdCount,
> > > +  IN  EDKII_PEI_MICROCODE_CPU_ID            *MicrocodeCpuId,
> > > +  OUT UINTN                                 *BufferSize,
> > > +  OUT VOID                                  **Buffer
> > > +  )
> > > +{
> > > +  if (BufferSize == NULL || Buffer == NULL) {
> > > +    return EFI_INVALID_PARAMETER;
> > > +  }
> > > +
> > > +  return ShadowMicrocodePatchByFit (CpuIdCount, MicrocodeCpuId,
> > BufferSize, Buffer);
> > > +}
> > > +
> > > +
> > > +/**
> > > +  Platform Init PEI module entry point
> > > +
> > > +  @param[in]  FileHandle           Not used.
> > > +  @param[in]  PeiServices          General purpose services available to
> > every PEIM.
> > > +
> > > +  @retval     EFI_SUCCESS          The function completes successfully
> > > +  @retval     EFI_OUT_OF_RESOURCES Insufficient resources to create
> > database
> > > +**/
> > > +EFI_STATUS
> > > +EFIAPI
> > > +ShadowMicrocodePeimInit (
> > > +  IN       EFI_PEI_FILE_HANDLE  FileHandle,
> > > +  IN CONST EFI_PEI_SERVICES     **PeiServices
> > > +  )
> > > +{
> > > +  EFI_STATUS                       Status;
> > > +
> > > +  //
> > > +  // Install EDKII Shadow Microcode PPI
> > > +  //
> > > +  Status = PeiServicesInstallPpi(mPeiShadowMicrocodePpiList);
> > > +  ASSERT_EFI_ERROR (Status);
> > > +
> > > +  return Status;
> > > +}
> > > diff --git
> > a/Silicon/Intel/IntelSiliconPkg/Feature/ShadowMicrocode/ShadowMicrocod
> > ePei.inf
> > >
> > b/Silicon/Intel/IntelSiliconPkg/Feature/ShadowMicrocode/ShadowMicrocod
> > ePei.inf
> > > new file mode 100644
> > > index 0000000000..019400ab31
> > > --- /dev/null
> > > +++
> > b/Silicon/Intel/IntelSiliconPkg/Feature/ShadowMicrocode/ShadowMicrocod
> > ePei.inf
> > > @@ -0,0 +1,43 @@
> > > +### @file
> > > +# FIT based microcode shadow PEIM.
> > > +#
> > > +# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> > > +#
> > > +# SPDX-License-Identifier: BSD-2-Clause-Patent
> > > +#
> > > +###
> > > +
> > > +[Defines]
> > > +  INF_VERSION                    = 0x00010017
> > > +  BASE_NAME                      = ShadowMicrocodePei
> > > +  FILE_GUID                      = 8af4cf68-ebe4-4b21-a008-0cb3da277be5
> > > +  VERSION_STRING                 = 1.0
> > > +  MODULE_TYPE                    = PEIM
> > > +  ENTRY_POINT                    = ShadowMicrocodePeimInit
> > > +
> > > +[Sources]
> > > +  ShadowMicrocodePei.c
> > > +
> > > +[LibraryClasses]
> > > +  PeimEntryPoint
> > > +  DebugLib
> > > +  MemoryAllocationLib
> > > +  BaseMemoryLib
> > > +  HobLib
> > > +  PeiServicesLib
> > > +
> > > +[Packages]
> > > +  MdePkg/MdePkg.dec
> > > +  MdeModulePkg/MdeModulePkg.dec
> > > +  UefiCpuPkg/UefiCpuPkg.dec
> > > +  IntelSiliconPkg/IntelSiliconPkg.dec
> > > +
> > > +[Ppis]
> > > +  gEdkiiPeiShadowMicrocodePpiGuid                     ## PRODUCES
> > > +
> > > +[Guids]
> > > +  gEdkiiMicrocodeShadowInfoHobGuid
> > > +  gEdkiiMicrocodeStorageTypeFlashGuid
> > > +
> > > +[Depex]
> > > +  TRUE
> > > diff --git
> > a/Silicon/Intel/IntelSiliconPkg/Include/Guid/MicrocodeShadowInfoHob.h
> > > b/Silicon/Intel/IntelSiliconPkg/Include/Guid/MicrocodeShadowInfoHob.h
> > > new file mode 100644
> > > index 0000000000..d1a9d79a51
> > > --- /dev/null
> > > +++
> > b/Silicon/Intel/IntelSiliconPkg/Include/Guid/MicrocodeShadowInfoHob.h
> > > @@ -0,0 +1,64 @@
> > > +/** @file
> > > +  The definition for Microcode Shadow Info Hob.
> > > +
> > > +  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> > > +  SPDX-License-Identifier: BSD-2-Clause-Patent
> > > +**/
> > > +
> > > +
> > > +#ifndef _MICROCODE_SHADOW_INFO_HOB_H_
> > > +#define _MICROCODE_SHADOW_INFO_HOB_H_
> > > +
> > > +///
> > > +/// The Global ID of a GUIDed HOB used to pass microcode shadow info to
> > DXE Driver.
> > > +///
> > > +#define EDKII_MICROCODE_SHADOW_INFO_HOB_GUID \
> > > +  { \
> > > +    0x658903f9, 0xda66, 0x460d, { 0x8b, 0xb0, 0x9d, 0x2d, 0xdf, 0x65,
> > 0x44, 0x59 } \
> > > +  }
> > > +
> > > +extern EFI_GUID gEdkiiMicrocodeShadowInfoHobGuid;
> > > +
> > > +typedef struct {
> > > +  //
> > > +  // An EFI_GUID that defines the contents of StorageContext.
> > > +  //
> > > +  GUID      StorageType;
> > > +  //
> > > +  // Number of the microcode patches which have been
> > > +  // relocated to memory.
> > > +  //
> > > +  UINT64    MicrocodeCount;
> > > +  //
> > > +  // An array with MicrocodeCount elements that stores
> > > +  // the shadowed microcode patch address in memory.
> > > +  //
> > > +  UINT64    MicrocodeAddrInMemory[];
> > > +  //
> > > +  // A buffer which contains details about the storage information
> > > +  // specific to StorageType.
> > > +  //
> > > +  // UINT8  StorageContext[];
> > > +} EDKII_MICROCODE_SHADOW_INFO_HOB;
> > > +
> > > +//
> > > +// An EDKII_MICROCODE_SHADOW_INFO_HOB with StorageType set to
> > below GUID will have
> > > +// the StorageContext of a
> > EFI_MICROCODE_STORAGE_TYPE_FLASH_CONTEXT strucutre.
> > > +//
> > > +#define EFI_MICROCODE_STORAGE_TYPE_FLASH_GUID \
> > > +  { \
> > > +    0x2cba01b3, 0xd391, 0x4598, { 0x8d, 0x89, 0xb7, 0xfc, 0x39, 0x22,
> > 0xfd, 0x71 } \
> > > +  }
> > > +
> > > +extern EFI_GUID gEdkiiMicrocodeStorageTypeFlashGuid;
> > > +
> > > +typedef struct {
> > > +  //
> > > +  // An array with MicrocodeCount elements that stores the original
> > > +  // microcode patch address on flash. The address is placed in same
> > > +  // order as the microcode patches in MicrocodeAddrInMemory.
> > > +  //
> > > +  UINT64  MicrocodeAddressInFlash[];
> > > +} EFI_MICROCODE_STORAGE_TYPE_FLASH_CONTEXT;
> > > +
> > > +#endif
> > > diff --git a/Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dec
> > b/Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dec
> > > index 22ebf19c4e..3c49fb289c 100644
> > > --- a/Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dec
> > > +++ b/Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dec
> > > @@ -3,7 +3,7 @@
> > >  #
> > >  # This package provides common open source Intel silicon modules.
> > >  #
> > > -# Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
> > > +# Copyright (c) 2016 - 2020, Intel Corporation. All rights reserved.<BR>
> > >  # SPDX-License-Identifier: BSD-2-Clause-Patent
> > >  #
> > >  ##
> > > @@ -48,6 +48,12 @@
> > >    ## HOB GUID to get memory information after MRC is done. The hob data
> > will be used to set the PMR ranges
> > >    gVtdPmrInfoDataHobGuid = {0x6fb61645, 0xf168, 0x46be, { 0x80, 0xec,
> > 0xb5, 0x02, 0x38, 0x5e, 0xe7, 0xe7 } }
> > >
> > > +  ## Include/Guid/MicrocodeShadowInfoHob.h
> > > +  gEdkiiMicrocodeShadowInfoHobGuid = { 0x658903f9, 0xda66, 0x460d,
> > { 0x8b, 0xb0, 0x9d, 0x2d, 0xdf, 0x65, 0x44, 0x59 } }
> > > +
> > > +  ## Include/Guid/MicrocodeShadowInfoHob.h
> > > +  gEdkiiMicrocodeStorageTypeFlashGuid = { 0x2cba01b3, 0xd391, 0x4598,
> > { 0x8d, 0x89, 0xb7, 0xfc, 0x39, 0x22, 0xfd, 0x71 } }
> > > +
> > >  [Ppis]
> > >    gEdkiiVTdInfoPpiGuid = { 0x8a59fcb3, 0xf191, 0x400c, { 0x97, 0x67, 
> > > 0x67,
> > 0xaf, 0x2b, 0x25, 0x68, 0x4a } }
> > >
> > > diff --git a/Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dsc
> > b/Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dsc
> > > index 0a6509d8b3..f995883691 100644
> > > --- a/Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dsc
> > > +++ b/Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dsc
> > > @@ -1,7 +1,7 @@
> > >  ## @file
> > >  # This package provides common open source Intel silicon modules.
> > >  #
> > > -# Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>
> > > +# Copyright (c) 2017 - 2020, Intel Corporation. All rights reserved.<BR>
> > >  #
> > >  #    SPDX-License-Identifier: BSD-2-Clause-Patent
> > >  #
> > > @@ -84,6 +84,7 @@
> > >
> > IntelSiliconPkg/Feature/VTd/PlatformVTdInfoSamplePei/PlatformVTdInfoSa
> > mplePei.inf
> > >
> > IntelSiliconPkg/Feature/Capsule/MicrocodeUpdateDxe/MicrocodeUpdateDxe
> > .inf
> > >
> > IntelSiliconPkg/Feature/Capsule/Library/MicrocodeFlashAccessLibNull/Micro
> > codeFlashAccessLibNull.inf
> > > +  IntelSiliconPkg/Feature/ShadowMicrocode/ShadowMicrocodePei.inf
> > >
> > IntelSiliconPkg/Library/PeiDxeSmmBootMediaLib/PeiFirmwareBootMediaLib
> > .inf
> > >
> > IntelSiliconPkg/Library/PeiDxeSmmBootMediaLib/DxeSmmFirmwareBootMe
> > diaLib.inf
> > >
> > > --
> > > 2.19.1.windows.1


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#54622): https://edk2.groups.io/g/devel/message/54622
Mute This Topic: https://groups.io/mt/71340885/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to