[edk2-devel] [edk2-platform][PATCH] Silicon/Tools/FitGen: Add FitGen feature to support uCode Capsule Update

Liming Gao posted 1 patch 4 years, 4 months ago
Failed in applying to current master (apply log)
Silicon/Intel/Tools/FitGen/FitGen.c | 183 +++++++++++++++++++++++++-----------
1 file changed, 129 insertions(+), 54 deletions(-)
[edk2-devel] [edk2-platform][PATCH] Silicon/Tools/FitGen: Add FitGen feature to support uCode Capsule Update
Posted by Liming Gao 4 years, 4 months ago
From: Chen A Chen <chen.a.chen@intel.com>

Add slot mode handling with a header array.

Signed-off-by: Chen A Chen <chen.a.chen@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Bob Feng <bob.c.feng@intel.com>
---
 Silicon/Intel/Tools/FitGen/FitGen.c | 183 +++++++++++++++++++++++++-----------
 1 file changed, 129 insertions(+), 54 deletions(-)

diff --git a/Silicon/Intel/Tools/FitGen/FitGen.c b/Silicon/Intel/Tools/FitGen/FitGen.c
index faf9880060..ab236d0ab0 100644
--- a/Silicon/Intel/Tools/FitGen/FitGen.c
+++ b/Silicon/Intel/Tools/FitGen/FitGen.c
@@ -312,12 +312,13 @@ Returns:
 {
   printf ("Usage (generate): %s [-D] InputFvRecoveryFile OutputFvRecoveryFile\n"
           "\t[-V <FitEntryDefaultVersion>]\n"
-          "\t[-F <FitTablePointerOffset>] [-F <FitTablePointerOffset>] [-V <FitHeaderVersion>]\n"
-          "\t[-NA]\n"
-          "\t[-CLEAR]\n"
-          "\t[-I <BiosInfoGuid>]\n"
-          "\t[-S <StartupAcmAddress StartupAcmSize>|<StartupAcmGuid>] [-V <StartupAcmVersion>]\n"
-          "\t[-B <BiosModuleAddress BiosModuleSize>] [-B ...] [-V <BiosModuleVersion>]\n"
+          "\t[-F <FitTablePointerOffset>] [-F <FitTablePointerOffset>] [-V <FitHeaderVersion>]\n"
+          "\t[-NA]\n"
+          "\t[-CLEAR]\n"
+          "\t[-L <MicrocodeSlotSize> <MicrocodeFfsGuid>]\n"
+          "\t[-I <BiosInfoGuid>]\n"
+          "\t[-S <StartupAcmAddress StartupAcmSize>|<StartupAcmGuid>] [-V <StartupAcmVersion>]\n"
+          "\t[-B <BiosModuleAddress BiosModuleSize>] [-B ...] [-V <BiosModuleVersion>]\n"
           "\t[-M <MicrocodeAddress MicrocodeSize>] [-M ...]|[-U <MicrocodeFv MicrocodeBase>|<MicrocodeRegionOffset MicrocodeRegionSize>|<MicrocodeGuid>] [-V <MicrocodeVersion>]\n"
           "\t[-O RecordType <RecordDataAddress RecordDataSize>|<RESERVE RecordDataSize>|<RecordDataGuid>|<RecordBinFile> [-V <RecordVersion>]] [-O ... [-V ...]]\n"
           "\t[-P RecordType <IndexPort DataPort Width Bit Index> [-V <RecordVersion>]] [-P ... [-V ...]]\n"
@@ -337,12 +338,14 @@ Returns:
   printf ("\tMicrocodeSize          - Size of Microcode.\n");
   printf ("\tMicrocodeFv            - Name of Microcode.fv file.\n");
   printf ("\tMicrocodeBase          - The base address of Microcode.fv in final FD image.\n");
-  printf ("\tMicrocodeRegionOffset  - Offset of Microcode region in input FD image.\n");
-  printf ("\tMicrocodeRegionSize    - Size of Microcode region in input FD image.\n");
-  printf ("\tMicrocodeGuid          - Guid of Microcode Module.\n");
-  printf ("\t-NA                    - No 0x800 aligned Microcode requirement. No -NA means Microcode is 0x800 aligned.\n");
-  printf ("\tRecordType             - FIT entry record type. User should ensure it is ordered.\n");
-  printf ("\tRecordDataAddress      - FIT entry record data address.\n");
+  printf ("\tMicrocodeRegionOffset  - Offset of Microcode region in input FD image.\n");
+  printf ("\tMicrocodeRegionSize    - Size of Microcode region in input FD image.\n");
+  printf ("\tMicrocodeGuid          - Guid of Microcode Module.\n");
+  printf ("\tMicrocodeSlotSize      - Occupied region size of each Microcode binary.\n");
+  printf ("\tMicrocodeFfsGuid       - Guid of FFS which is used to save Microcode binary");
+  printf ("\t-NA                    - No 0x800 aligned Microcode requirement. No -NA means Microcode is 0x800 aligned.\n");
+  printf ("\tRecordType             - FIT entry record type. User should ensure it is ordered.\n");
+  printf ("\tRecordDataAddress      - FIT entry record data address.\n");
   printf ("\tRecordDataSize         - FIT entry record data size.\n");
   printf ("\tRecordDataGuid         - FIT entry record data GUID.\n");
   printf ("\tRecordBinFile          - FIT entry record data binary file.\n");
@@ -761,32 +764,39 @@ Returns:
   FitEntryNumber - The FIT entry number
   0              - Argument parse fail
 
-*/
-{
-  EFI_GUID  Guid;
-  INTN      Index;
-  UINT8     *FileBuffer;
-  UINT32    FileSize;
+*/
+{
+  EFI_GUID  Guid;
+  EFI_GUID  MicrocodeFfsGuid;
+  INTN      Index;
+  UINT8     *FileBuffer;
+  UINT32    FileSize;
   UINT32    Type;
   UINT8     *MicrocodeFileBuffer;
   UINT8     *MicrocodeFileBufferRaw;
   UINT32    MicrocodeFileSize;
-  UINT32    MicrocodeBase;
-  UINT32    MicrocodeSize;
-  UINT8     *MicrocodeBuffer;
-  UINT32    MicrocodeRegionOffset;
-  UINT32    MicrocodeRegionSize;
-  STATUS    Status;
-  EFI_FIRMWARE_VOLUME_HEADER  *FvHeader;
-  UINTN                       FitEntryNumber;
-  BOOLEAN                     BiosInfoExist;
-  BIOS_INFO_HEADER            *BiosInfo;
-  BIOS_INFO_STRUCT            *BiosInfoStruct;
-  UINTN                       BiosInfoIndex;
-
-  //
-  // Init index
-  //
+  UINT32    MicrocodeBase;
+  UINT32    MicrocodeSize;
+  UINT8     *MicrocodeBuffer;
+  UINT32    MicrocodeBufferSize;
+  UINT8     *Walker;
+  UINT32    MicrocodeRegionOffset;
+  UINT32    MicrocodeRegionSize;
+  UINT32    SlotSize;
+  STATUS    Status;
+  EFI_FIRMWARE_VOLUME_HEADER  *FvHeader;
+  UINTN                       FitEntryNumber;
+  BOOLEAN                     BiosInfoExist;
+  BOOLEAN                     SlotMode;
+  BIOS_INFO_HEADER            *BiosInfo;
+  BIOS_INFO_STRUCT            *BiosInfoStruct;
+  UINTN                       BiosInfoIndex;
+
+  SlotMode = FALSE;
+
+  //
+  // Init index
+  //
   Index = 3;
   if (((strcmp (argv[1], "-D") == 0) ||
        (strcmp (argv[1], "-d") == 0)) ) {
@@ -897,13 +907,40 @@ Returns:
     // Do not parse any more
     //
     return 0;
-  }
-
-  //
-  // 0.5 BiosInfo
-  //
-  if ((Index + 1 >= argc) ||
-      ((strcmp (argv[Index], "-I") != 0) &&
+  }
+
+  //
+  // 0.5 SlotSize
+  //
+  if ((Index + 1 >= argc) ||
+      ((strcmp (argv[Index], "-L") != 0) &&
+       (strcmp (argv[Index], "-l") != 0)) ) {
+    //
+    // Bypass
+    //
+    SlotSize = 0;
+  } else {
+    SlotSize = xtoi (argv[Index + 1]);
+
+    if (SlotSize == 0) {
+      printf ("Invalid slotsize = %d\n", SlotSize);
+      return 0;
+    }
+
+    SlotMode = IsGuidData(argv[Index + 2], &MicrocodeFfsGuid);
+    if (!SlotMode) {
+      printf ("Need a ffs GUID for search uCode ffs\n");
+      return 0;
+    }
+
+    Index += 3;
+  }
+
+  //
+  // 0.6 BiosInfo
+  //
+  if ((Index + 1 >= argc) ||
+      ((strcmp (argv[Index], "-I") != 0) &&
        (strcmp (argv[Index], "-i") != 0)) ) {
     //
     // Bypass
@@ -1004,12 +1041,22 @@ Returns:
             if (FvHeader->Signature == EFI_FVH_SIGNATURE) {
               // Skip FV header + FFS header
               MicrocodeBuffer = MicrocodeFileBuffer + sizeof(EFI_FIRMWARE_VOLUME_HEADER) + sizeof(EFI_FV_BLOCK_MAP_ENTRY) + sizeof(EFI_FFS_FILE_HEADER);
-            } else {
-              MicrocodeBuffer = MicrocodeFileBuffer;
-            }
-            while ((UINT32)(MicrocodeBuffer - MicrocodeFileBuffer) < MicrocodeFileSize) {
-              if (*(UINT32 *)(MicrocodeBuffer) != 0x1) { // HeaderVersion
-                break;
+            } else {
+              MicrocodeBuffer = MicrocodeFileBuffer;
+            }
+
+            if (SlotMode) {
+              MicrocodeBuffer = FindFileFromFvByGuid(MicrocodeFileBuffer, MicrocodeFileSize, &MicrocodeFfsGuid, &MicrocodeBufferSize);
+              if (MicrocodeBuffer == NULL) {
+                printf ("-L Parameter incorrect, GUID not found\n");
+                // not found
+                return 0;
+              }
+            }
+
+            while ((UINT32)(MicrocodeBuffer - MicrocodeFileBuffer) < MicrocodeFileSize) {
+              if (*(UINT32 *)(MicrocodeBuffer) != 0x1) { // HeaderVersion
+                break;
               }
               if (*(UINT32 *)(MicrocodeBuffer + 20) != 0x1) { // LoaderVersion
                 break;
@@ -1037,13 +1084,41 @@ Returns:
               gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Type = FIT_TABLE_TYPE_MICROCODE;
               gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Address = MicrocodeBase + ((UINT32) (UINTN) MicrocodeBuffer - (UINT32) (UINTN) MicrocodeFileBuffer);
               gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Size = MicrocodeSize;
-              gFitTableContext.MicrocodeNumber++;
-              gFitTableContext.FitEntryNumber++;
-
-              MicrocodeBuffer += MicrocodeSize;
-            }
-          }
-          break;
+              gFitTableContext.MicrocodeNumber++;
+              gFitTableContext.FitEntryNumber++;
+
+              if (SlotSize != 0) {
+                MicrocodeBuffer += SlotSize;
+              } else {
+                MicrocodeBuffer += MicrocodeSize;
+              }
+            }
+
+            ///
+            /// Check the remaining buffer
+            ///
+            if (((UINT32)(MicrocodeBuffer - MicrocodeFileBuffer) < MicrocodeFileSize) && SlotMode != 0) {
+              for (Walker = MicrocodeBuffer; Walker < MicrocodeFileBuffer + MicrocodeFileSize; Walker++) {
+                if (*Walker != 0xFF) {
+                  printf ("Error: detect non-spare space after uCode array, please check uCode array!\n");
+                  return 0;
+                }
+              }
+
+              ///
+              /// Split the spare space as empty buffer for save uCode patch.
+              ///
+              while (MicrocodeBuffer + SlotSize <= MicrocodeFileBuffer + MicrocodeFileSize) {
+                gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Type = FIT_TABLE_TYPE_MICROCODE;
+                gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Address = MicrocodeBase + ((UINT32) (UINTN) MicrocodeBuffer - (UINT32) (UINTN) MicrocodeFileBuffer);
+                gFitTableContext.MicrocodeNumber++;
+                gFitTableContext.FitEntryNumber++;
+
+                MicrocodeBuffer += SlotSize;
+              }
+            }
+          }
+          break;
         case FIT_TABLE_TYPE_TPM_POLICY:
         case FIT_TABLE_TYPE_BIOS_POLICY:
         case FIT_TABLE_TYPE_TXT_POLICY:
-- 
2.16.2.windows.1


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

View/Reply Online (#51517): https://edk2.groups.io/g/devel/message/51517
Mute This Topic: https://groups.io/mt/64551980/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-

Re: [edk2-devel] [edk2-platform][PATCH] Silicon/Tools/FitGen: Add FitGen feature to support uCode Capsule Update
Posted by Chen, Chen A 4 years, 4 months ago
Bugzilla, https://bugzilla.tianocore.org/show_bug.cgi?id=2321

-----Original Message-----
From: Gao, Liming 
Sent: Monday, December 2, 2019 1:46 PM
To: devel@edk2.groups.io
Cc: Chen, Chen A <chen.a.chen@intel.com>; Feng, Bob C <bob.c.feng@intel.com>
Subject: [edk2-platform][PATCH] Silicon/Tools/FitGen: Add FitGen feature to support uCode Capsule Update

From: Chen A Chen <chen.a.chen@intel.com>

Add slot mode handling with a header array.

Signed-off-by: Chen A Chen <chen.a.chen@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Bob Feng <bob.c.feng@intel.com>
---
 Silicon/Intel/Tools/FitGen/FitGen.c | 183 +++++++++++++++++++++++++-----------
 1 file changed, 129 insertions(+), 54 deletions(-)

diff --git a/Silicon/Intel/Tools/FitGen/FitGen.c b/Silicon/Intel/Tools/FitGen/FitGen.c
index faf9880060..ab236d0ab0 100644
--- a/Silicon/Intel/Tools/FitGen/FitGen.c
+++ b/Silicon/Intel/Tools/FitGen/FitGen.c
@@ -312,12 +312,13 @@ Returns:
 {
   printf ("Usage (generate): %s [-D] InputFvRecoveryFile OutputFvRecoveryFile\n"
           "\t[-V <FitEntryDefaultVersion>]\n"
-          "\t[-F <FitTablePointerOffset>] [-F <FitTablePointerOffset>] [-V <FitHeaderVersion>]\n"
-          "\t[-NA]\n"
-          "\t[-CLEAR]\n"
-          "\t[-I <BiosInfoGuid>]\n"
-          "\t[-S <StartupAcmAddress StartupAcmSize>|<StartupAcmGuid>] [-V <StartupAcmVersion>]\n"
-          "\t[-B <BiosModuleAddress BiosModuleSize>] [-B ...] [-V <BiosModuleVersion>]\n"
+          "\t[-F <FitTablePointerOffset>] [-F <FitTablePointerOffset>] [-V <FitHeaderVersion>]\n"
+          "\t[-NA]\n"
+          "\t[-CLEAR]\n"
+          "\t[-L <MicrocodeSlotSize> <MicrocodeFfsGuid>]\n"
+          "\t[-I <BiosInfoGuid>]\n"
+          "\t[-S <StartupAcmAddress StartupAcmSize>|<StartupAcmGuid>] [-V <StartupAcmVersion>]\n"
+          "\t[-B <BiosModuleAddress BiosModuleSize>] [-B ...] [-V <BiosModuleVersion>]\n"
           "\t[-M <MicrocodeAddress MicrocodeSize>] [-M ...]|[-U <MicrocodeFv MicrocodeBase>|<MicrocodeRegionOffset MicrocodeRegionSize>|<MicrocodeGuid>] [-V <MicrocodeVersion>]\n"
           "\t[-O RecordType <RecordDataAddress RecordDataSize>|<RESERVE RecordDataSize>|<RecordDataGuid>|<RecordBinFile> [-V <RecordVersion>]] [-O ... [-V ...]]\n"
           "\t[-P RecordType <IndexPort DataPort Width Bit Index> [-V <RecordVersion>]] [-P ... [-V ...]]\n"
@@ -337,12 +338,14 @@ Returns:
   printf ("\tMicrocodeSize          - Size of Microcode.\n");
   printf ("\tMicrocodeFv            - Name of Microcode.fv file.\n");
   printf ("\tMicrocodeBase          - The base address of Microcode.fv in final FD image.\n");
-  printf ("\tMicrocodeRegionOffset  - Offset of Microcode region in input FD image.\n");
-  printf ("\tMicrocodeRegionSize    - Size of Microcode region in input FD image.\n");
-  printf ("\tMicrocodeGuid          - Guid of Microcode Module.\n");
-  printf ("\t-NA                    - No 0x800 aligned Microcode requirement. No -NA means Microcode is 0x800 aligned.\n");
-  printf ("\tRecordType             - FIT entry record type. User should ensure it is ordered.\n");
-  printf ("\tRecordDataAddress      - FIT entry record data address.\n");
+  printf ("\tMicrocodeRegionOffset  - Offset of Microcode region in input FD image.\n");
+  printf ("\tMicrocodeRegionSize    - Size of Microcode region in input FD image.\n");
+  printf ("\tMicrocodeGuid          - Guid of Microcode Module.\n");
+  printf ("\tMicrocodeSlotSize      - Occupied region size of each Microcode binary.\n");
+  printf ("\tMicrocodeFfsGuid       - Guid of FFS which is used to save Microcode binary");
+  printf ("\t-NA                    - No 0x800 aligned Microcode requirement. No -NA means Microcode is 0x800 aligned.\n");
+  printf ("\tRecordType             - FIT entry record type. User should ensure it is ordered.\n");
+  printf ("\tRecordDataAddress      - FIT entry record data address.\n");
   printf ("\tRecordDataSize         - FIT entry record data size.\n");
   printf ("\tRecordDataGuid         - FIT entry record data GUID.\n");
   printf ("\tRecordBinFile          - FIT entry record data binary file.\n");
@@ -761,32 +764,39 @@ Returns:
   FitEntryNumber - The FIT entry number
   0              - Argument parse fail
 
-*/
-{
-  EFI_GUID  Guid;
-  INTN      Index;
-  UINT8     *FileBuffer;
-  UINT32    FileSize;
+*/
+{
+  EFI_GUID  Guid;
+  EFI_GUID  MicrocodeFfsGuid;
+  INTN      Index;
+  UINT8     *FileBuffer;
+  UINT32    FileSize;
   UINT32    Type;
   UINT8     *MicrocodeFileBuffer;
   UINT8     *MicrocodeFileBufferRaw;
   UINT32    MicrocodeFileSize;
-  UINT32    MicrocodeBase;
-  UINT32    MicrocodeSize;
-  UINT8     *MicrocodeBuffer;
-  UINT32    MicrocodeRegionOffset;
-  UINT32    MicrocodeRegionSize;
-  STATUS    Status;
-  EFI_FIRMWARE_VOLUME_HEADER  *FvHeader;
-  UINTN                       FitEntryNumber;
-  BOOLEAN                     BiosInfoExist;
-  BIOS_INFO_HEADER            *BiosInfo;
-  BIOS_INFO_STRUCT            *BiosInfoStruct;
-  UINTN                       BiosInfoIndex;
-
-  //
-  // Init index
-  //
+  UINT32    MicrocodeBase;
+  UINT32    MicrocodeSize;
+  UINT8     *MicrocodeBuffer;
+  UINT32    MicrocodeBufferSize;
+  UINT8     *Walker;
+  UINT32    MicrocodeRegionOffset;
+  UINT32    MicrocodeRegionSize;
+  UINT32    SlotSize;
+  STATUS    Status;
+  EFI_FIRMWARE_VOLUME_HEADER  *FvHeader;
+  UINTN                       FitEntryNumber;
+  BOOLEAN                     BiosInfoExist;
+  BOOLEAN                     SlotMode;
+  BIOS_INFO_HEADER            *BiosInfo;
+  BIOS_INFO_STRUCT            *BiosInfoStruct;
+  UINTN                       BiosInfoIndex;
+
+  SlotMode = FALSE;
+
+  //
+  // Init index
+  //
   Index = 3;
   if (((strcmp (argv[1], "-D") == 0) ||
        (strcmp (argv[1], "-d") == 0)) ) { @@ -897,13 +907,40 @@ Returns:
     // Do not parse any more
     //
     return 0;
-  }
-
-  //
-  // 0.5 BiosInfo
-  //
-  if ((Index + 1 >= argc) ||
-      ((strcmp (argv[Index], "-I") != 0) &&
+  }
+
+  //
+  // 0.5 SlotSize
+  //
+  if ((Index + 1 >= argc) ||
+      ((strcmp (argv[Index], "-L") != 0) &&
+       (strcmp (argv[Index], "-l") != 0)) ) {
+    //
+    // Bypass
+    //
+    SlotSize = 0;
+  } else {
+    SlotSize = xtoi (argv[Index + 1]);
+
+    if (SlotSize == 0) {
+      printf ("Invalid slotsize = %d\n", SlotSize);
+      return 0;
+    }
+
+    SlotMode = IsGuidData(argv[Index + 2], &MicrocodeFfsGuid);
+    if (!SlotMode) {
+      printf ("Need a ffs GUID for search uCode ffs\n");
+      return 0;
+    }
+
+    Index += 3;
+  }
+
+  //
+  // 0.6 BiosInfo
+  //
+  if ((Index + 1 >= argc) ||
+      ((strcmp (argv[Index], "-I") != 0) &&
        (strcmp (argv[Index], "-i") != 0)) ) {
     //
     // Bypass
@@ -1004,12 +1041,22 @@ Returns:
             if (FvHeader->Signature == EFI_FVH_SIGNATURE) {
               // Skip FV header + FFS header
               MicrocodeBuffer = MicrocodeFileBuffer + sizeof(EFI_FIRMWARE_VOLUME_HEADER) + sizeof(EFI_FV_BLOCK_MAP_ENTRY) + sizeof(EFI_FFS_FILE_HEADER);
-            } else {
-              MicrocodeBuffer = MicrocodeFileBuffer;
-            }
-            while ((UINT32)(MicrocodeBuffer - MicrocodeFileBuffer) < MicrocodeFileSize) {
-              if (*(UINT32 *)(MicrocodeBuffer) != 0x1) { // HeaderVersion
-                break;
+            } else {
+              MicrocodeBuffer = MicrocodeFileBuffer;
+            }
+
+            if (SlotMode) {
+              MicrocodeBuffer = FindFileFromFvByGuid(MicrocodeFileBuffer, MicrocodeFileSize, &MicrocodeFfsGuid, &MicrocodeBufferSize);
+              if (MicrocodeBuffer == NULL) {
+                printf ("-L Parameter incorrect, GUID not found\n");
+                // not found
+                return 0;
+              }
+            }
+
+            while ((UINT32)(MicrocodeBuffer - MicrocodeFileBuffer) < MicrocodeFileSize) {
+              if (*(UINT32 *)(MicrocodeBuffer) != 0x1) { // HeaderVersion
+                break;
               }
               if (*(UINT32 *)(MicrocodeBuffer + 20) != 0x1) { // LoaderVersion
                 break;
@@ -1037,13 +1084,41 @@ Returns:
               gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Type = FIT_TABLE_TYPE_MICROCODE;
               gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Address = MicrocodeBase + ((UINT32) (UINTN) MicrocodeBuffer - (UINT32) (UINTN) MicrocodeFileBuffer);
               gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Size = MicrocodeSize;
-              gFitTableContext.MicrocodeNumber++;
-              gFitTableContext.FitEntryNumber++;
-
-              MicrocodeBuffer += MicrocodeSize;
-            }
-          }
-          break;
+              gFitTableContext.MicrocodeNumber++;
+              gFitTableContext.FitEntryNumber++;
+
+              if (SlotSize != 0) {
+                MicrocodeBuffer += SlotSize;
+              } else {
+                MicrocodeBuffer += MicrocodeSize;
+              }
+            }
+
+            ///
+            /// Check the remaining buffer
+            ///
+            if (((UINT32)(MicrocodeBuffer - MicrocodeFileBuffer) < MicrocodeFileSize) && SlotMode != 0) {
+              for (Walker = MicrocodeBuffer; Walker < MicrocodeFileBuffer + MicrocodeFileSize; Walker++) {
+                if (*Walker != 0xFF) {
+                  printf ("Error: detect non-spare space after uCode array, please check uCode array!\n");
+                  return 0;
+                }
+              }
+
+              ///
+              /// Split the spare space as empty buffer for save uCode patch.
+              ///
+              while (MicrocodeBuffer + SlotSize <= MicrocodeFileBuffer + MicrocodeFileSize) {
+                gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Type = FIT_TABLE_TYPE_MICROCODE;
+                gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Address = MicrocodeBase + ((UINT32) (UINTN) MicrocodeBuffer - (UINT32) (UINTN) MicrocodeFileBuffer);
+                gFitTableContext.MicrocodeNumber++;
+                gFitTableContext.FitEntryNumber++;
+
+                MicrocodeBuffer += SlotSize;
+              }
+            }
+          }
+          break;
         case FIT_TABLE_TYPE_TPM_POLICY:
         case FIT_TABLE_TYPE_BIOS_POLICY:
         case FIT_TABLE_TYPE_TXT_POLICY:
--
2.16.2.windows.1


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

View/Reply Online (#51539): https://edk2.groups.io/g/devel/message/51539
Mute This Topic: https://groups.io/mt/64551980/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-

Re: [edk2-devel] [edk2-platform][PATCH] Silicon/Tools/FitGen: Add FitGen feature to support uCode Capsule Update
Posted by Liming Gao 4 years, 4 months ago
Chen:
  Please correct the patch style. Some lines are not changed, but they are in the patch. 

Thanks
Liming
>-----Original Message-----
>From: Chen, Chen A
>Sent: Monday, December 02, 2019 1:52 PM
>To: Gao, Liming <liming.gao@intel.com>; devel@edk2.groups.io
>Cc: Feng, Bob C <bob.c.feng@intel.com>
>Subject: RE: [edk2-platform][PATCH] Silicon/Tools/FitGen: Add FitGen feature
>to support uCode Capsule Update
>
>Bugzilla, https://bugzilla.tianocore.org/show_bug.cgi?id=2321
>
>-----Original Message-----
>From: Gao, Liming
>Sent: Monday, December 2, 2019 1:46 PM
>To: devel@edk2.groups.io
>Cc: Chen, Chen A <chen.a.chen@intel.com>; Feng, Bob C
><bob.c.feng@intel.com>
>Subject: [edk2-platform][PATCH] Silicon/Tools/FitGen: Add FitGen feature to
>support uCode Capsule Update
>
>From: Chen A Chen <chen.a.chen@intel.com>
>
>Add slot mode handling with a header array.
>
>Signed-off-by: Chen A Chen <chen.a.chen@intel.com>
>Cc: Liming Gao <liming.gao@intel.com>
>Cc: Bob Feng <bob.c.feng@intel.com>
>---
> Silicon/Intel/Tools/FitGen/FitGen.c | 183 +++++++++++++++++++++++++----
>-------
> 1 file changed, 129 insertions(+), 54 deletions(-)
>
>diff --git a/Silicon/Intel/Tools/FitGen/FitGen.c
>b/Silicon/Intel/Tools/FitGen/FitGen.c
>index faf9880060..ab236d0ab0 100644
>--- a/Silicon/Intel/Tools/FitGen/FitGen.c
>+++ b/Silicon/Intel/Tools/FitGen/FitGen.c
>@@ -312,12 +312,13 @@ Returns:
> {
>   printf ("Usage (generate): %s [-D] InputFvRecoveryFile
>OutputFvRecoveryFile\n"
>           "\t[-V <FitEntryDefaultVersion>]\n"
>-          "\t[-F <FitTablePointerOffset>] [-F <FitTablePointerOffset>] [-V
><FitHeaderVersion>]\n"
>-          "\t[-NA]\n"
>-          "\t[-CLEAR]\n"
>-          "\t[-I <BiosInfoGuid>]\n"
>-          "\t[-S <StartupAcmAddress StartupAcmSize>|<StartupAcmGuid>] [-V
><StartupAcmVersion>]\n"
>-          "\t[-B <BiosModuleAddress BiosModuleSize>] [-B ...] [-V
><BiosModuleVersion>]\n"
>+          "\t[-F <FitTablePointerOffset>] [-F <FitTablePointerOffset>] [-V
><FitHeaderVersion>]\n"
>+          "\t[-NA]\n"
>+          "\t[-CLEAR]\n"
>+          "\t[-L <MicrocodeSlotSize> <MicrocodeFfsGuid>]\n"
>+          "\t[-I <BiosInfoGuid>]\n"
>+          "\t[-S <StartupAcmAddress StartupAcmSize>|<StartupAcmGuid>] [-V
><StartupAcmVersion>]\n"
>+          "\t[-B <BiosModuleAddress BiosModuleSize>] [-B ...] [-V
><BiosModuleVersion>]\n"
>           "\t[-M <MicrocodeAddress MicrocodeSize>] [-M ...]|[-U <MicrocodeFv
>MicrocodeBase>|<MicrocodeRegionOffset
>MicrocodeRegionSize>|<MicrocodeGuid>] [-V <MicrocodeVersion>]\n"
>           "\t[-O RecordType <RecordDataAddress RecordDataSize>|<RESERVE
>RecordDataSize>|<RecordDataGuid>|<RecordBinFile> [-V <RecordVersion>]]
>[-O ... [-V ...]]\n"
>           "\t[-P RecordType <IndexPort DataPort Width Bit Index> [-V
><RecordVersion>]] [-P ... [-V ...]]\n"
>@@ -337,12 +338,14 @@ Returns:
>   printf ("\tMicrocodeSize          - Size of Microcode.\n");
>   printf ("\tMicrocodeFv            - Name of Microcode.fv file.\n");
>   printf ("\tMicrocodeBase          - The base address of Microcode.fv in final FD
>image.\n");
>-  printf ("\tMicrocodeRegionOffset  - Offset of Microcode region in input FD
>image.\n");
>-  printf ("\tMicrocodeRegionSize    - Size of Microcode region in input FD
>image.\n");
>-  printf ("\tMicrocodeGuid          - Guid of Microcode Module.\n");
>-  printf ("\t-NA                    - No 0x800 aligned Microcode requirement. No -NA
>means Microcode is 0x800 aligned.\n");
>-  printf ("\tRecordType             - FIT entry record type. User should ensure it is
>ordered.\n");
>-  printf ("\tRecordDataAddress      - FIT entry record data address.\n");
>+  printf ("\tMicrocodeRegionOffset  - Offset of Microcode region in input FD
>image.\n");
>+  printf ("\tMicrocodeRegionSize    - Size of Microcode region in input FD
>image.\n");
>+  printf ("\tMicrocodeGuid          - Guid of Microcode Module.\n");
>+  printf ("\tMicrocodeSlotSize      - Occupied region size of each Microcode
>binary.\n");
>+  printf ("\tMicrocodeFfsGuid       - Guid of FFS which is used to save
>Microcode binary");
>+  printf ("\t-NA                    - No 0x800 aligned Microcode requirement. No -NA
>means Microcode is 0x800 aligned.\n");
>+  printf ("\tRecordType             - FIT entry record type. User should ensure it is
>ordered.\n");
>+  printf ("\tRecordDataAddress      - FIT entry record data address.\n");
>   printf ("\tRecordDataSize         - FIT entry record data size.\n");
>   printf ("\tRecordDataGuid         - FIT entry record data GUID.\n");
>   printf ("\tRecordBinFile          - FIT entry record data binary file.\n");
>@@ -761,32 +764,39 @@ Returns:
>   FitEntryNumber - The FIT entry number
>   0              - Argument parse fail
>
>-*/
>-{
>-  EFI_GUID  Guid;
>-  INTN      Index;
>-  UINT8     *FileBuffer;
>-  UINT32    FileSize;
>+*/
>+{
>+  EFI_GUID  Guid;
>+  EFI_GUID  MicrocodeFfsGuid;
>+  INTN      Index;
>+  UINT8     *FileBuffer;
>+  UINT32    FileSize;
>   UINT32    Type;
>   UINT8     *MicrocodeFileBuffer;
>   UINT8     *MicrocodeFileBufferRaw;
>   UINT32    MicrocodeFileSize;
>-  UINT32    MicrocodeBase;
>-  UINT32    MicrocodeSize;
>-  UINT8     *MicrocodeBuffer;
>-  UINT32    MicrocodeRegionOffset;
>-  UINT32    MicrocodeRegionSize;
>-  STATUS    Status;
>-  EFI_FIRMWARE_VOLUME_HEADER  *FvHeader;
>-  UINTN                       FitEntryNumber;
>-  BOOLEAN                     BiosInfoExist;
>-  BIOS_INFO_HEADER            *BiosInfo;
>-  BIOS_INFO_STRUCT            *BiosInfoStruct;
>-  UINTN                       BiosInfoIndex;
>-
>-  //
>-  // Init index
>-  //
>+  UINT32    MicrocodeBase;
>+  UINT32    MicrocodeSize;
>+  UINT8     *MicrocodeBuffer;
>+  UINT32    MicrocodeBufferSize;
>+  UINT8     *Walker;
>+  UINT32    MicrocodeRegionOffset;
>+  UINT32    MicrocodeRegionSize;
>+  UINT32    SlotSize;
>+  STATUS    Status;
>+  EFI_FIRMWARE_VOLUME_HEADER  *FvHeader;
>+  UINTN                       FitEntryNumber;
>+  BOOLEAN                     BiosInfoExist;
>+  BOOLEAN                     SlotMode;
>+  BIOS_INFO_HEADER            *BiosInfo;
>+  BIOS_INFO_STRUCT            *BiosInfoStruct;
>+  UINTN                       BiosInfoIndex;
>+
>+  SlotMode = FALSE;
>+
>+  //
>+  // Init index
>+  //
>   Index = 3;
>   if (((strcmp (argv[1], "-D") == 0) ||
>        (strcmp (argv[1], "-d") == 0)) ) { @@ -897,13 +907,40 @@ Returns:
>     // Do not parse any more
>     //
>     return 0;
>-  }
>-
>-  //
>-  // 0.5 BiosInfo
>-  //
>-  if ((Index + 1 >= argc) ||
>-      ((strcmp (argv[Index], "-I") != 0) &&
>+  }
>+
>+  //
>+  // 0.5 SlotSize
>+  //
>+  if ((Index + 1 >= argc) ||
>+      ((strcmp (argv[Index], "-L") != 0) &&
>+       (strcmp (argv[Index], "-l") != 0)) ) {
>+    //
>+    // Bypass
>+    //
>+    SlotSize = 0;
>+  } else {
>+    SlotSize = xtoi (argv[Index + 1]);
>+
>+    if (SlotSize == 0) {
>+      printf ("Invalid slotsize = %d\n", SlotSize);
>+      return 0;
>+    }
>+
>+    SlotMode = IsGuidData(argv[Index + 2], &MicrocodeFfsGuid);
>+    if (!SlotMode) {
>+      printf ("Need a ffs GUID for search uCode ffs\n");
>+      return 0;
>+    }
>+
>+    Index += 3;
>+  }
>+
>+  //
>+  // 0.6 BiosInfo
>+  //
>+  if ((Index + 1 >= argc) ||
>+      ((strcmp (argv[Index], "-I") != 0) &&
>        (strcmp (argv[Index], "-i") != 0)) ) {
>     //
>     // Bypass
>@@ -1004,12 +1041,22 @@ Returns:
>             if (FvHeader->Signature == EFI_FVH_SIGNATURE) {
>               // Skip FV header + FFS header
>               MicrocodeBuffer = MicrocodeFileBuffer +
>sizeof(EFI_FIRMWARE_VOLUME_HEADER) +
>sizeof(EFI_FV_BLOCK_MAP_ENTRY) + sizeof(EFI_FFS_FILE_HEADER);
>-            } else {
>-              MicrocodeBuffer = MicrocodeFileBuffer;
>-            }
>-            while ((UINT32)(MicrocodeBuffer - MicrocodeFileBuffer) <
>MicrocodeFileSize) {
>-              if (*(UINT32 *)(MicrocodeBuffer) != 0x1) { // HeaderVersion
>-                break;
>+            } else {
>+              MicrocodeBuffer = MicrocodeFileBuffer;
>+            }
>+
>+            if (SlotMode) {
>+              MicrocodeBuffer = FindFileFromFvByGuid(MicrocodeFileBuffer,
>MicrocodeFileSize, &MicrocodeFfsGuid, &MicrocodeBufferSize);
>+              if (MicrocodeBuffer == NULL) {
>+                printf ("-L Parameter incorrect, GUID not found\n");
>+                // not found
>+                return 0;
>+              }
>+            }
>+
>+            while ((UINT32)(MicrocodeBuffer - MicrocodeFileBuffer) <
>MicrocodeFileSize) {
>+              if (*(UINT32 *)(MicrocodeBuffer) != 0x1) { // HeaderVersion
>+                break;
>               }
>               if (*(UINT32 *)(MicrocodeBuffer + 20) != 0x1) { // LoaderVersion
>                 break;
>@@ -1037,13 +1084,41 @@ Returns:
>
>gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Type =
>FIT_TABLE_TYPE_MICROCODE;
>
>gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Address =
>MicrocodeBase + ((UINT32) (UINTN) MicrocodeBuffer - (UINT32) (UINTN)
>MicrocodeFileBuffer);
>
>gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Size =
>MicrocodeSize;
>-              gFitTableContext.MicrocodeNumber++;
>-              gFitTableContext.FitEntryNumber++;
>-
>-              MicrocodeBuffer += MicrocodeSize;
>-            }
>-          }
>-          break;
>+              gFitTableContext.MicrocodeNumber++;
>+              gFitTableContext.FitEntryNumber++;
>+
>+              if (SlotSize != 0) {
>+                MicrocodeBuffer += SlotSize;
>+              } else {
>+                MicrocodeBuffer += MicrocodeSize;
>+              }
>+            }
>+
>+            ///
>+            /// Check the remaining buffer
>+            ///
>+            if (((UINT32)(MicrocodeBuffer - MicrocodeFileBuffer) <
>MicrocodeFileSize) && SlotMode != 0) {
>+              for (Walker = MicrocodeBuffer; Walker < MicrocodeFileBuffer +
>MicrocodeFileSize; Walker++) {
>+                if (*Walker != 0xFF) {
>+                  printf ("Error: detect non-spare space after uCode array, please
>check uCode array!\n");
>+                  return 0;
>+                }
>+              }
>+
>+              ///
>+              /// Split the spare space as empty buffer for save uCode patch.
>+              ///
>+              while (MicrocodeBuffer + SlotSize <= MicrocodeFileBuffer +
>MicrocodeFileSize) {
>+
>gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Type =
>FIT_TABLE_TYPE_MICROCODE;
>+
>gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Address =
>MicrocodeBase + ((UINT32) (UINTN) MicrocodeBuffer - (UINT32) (UINTN)
>MicrocodeFileBuffer);
>+                gFitTableContext.MicrocodeNumber++;
>+                gFitTableContext.FitEntryNumber++;
>+
>+                MicrocodeBuffer += SlotSize;
>+              }
>+            }
>+          }
>+          break;
>         case FIT_TABLE_TYPE_TPM_POLICY:
>         case FIT_TABLE_TYPE_BIOS_POLICY:
>         case FIT_TABLE_TYPE_TXT_POLICY:
>--
>2.16.2.windows.1


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

View/Reply Online (#51581): https://edk2.groups.io/g/devel/message/51581
Mute This Topic: https://groups.io/mt/64551980/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-