public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: kenji.chen@intel.com
To: "'devel@edk2.groups.io'" <devel@edk2.groups.io>
Subject: Re: [Bug 2321] Add FitGen feature to support uCode Capsule Update
Date: Fri, 8 Nov 2019 08:49:11 +0000	[thread overview]
Message-ID: <BN8PR11MB37462FCED7EF57EA77AC9C3E827B0@BN8PR11MB3746.namprd11.prod.outlook.com> (raw)
In-Reply-To: <bug-2321-591-866w3Xggjl@https.bugzilla.tianocore.org/>

[-- Attachment #1: Type: text/plain, Size: 1012 bytes --]

Having problems in git send-email. Send it by outlook.

-----Original Message-----
From: bugzilla-daemon@bugzilla.tianocore.org <bugzilla-daemon@bugzilla.tianocore.org> 
Sent: Monday, November 4, 2019 10:14 AM
To: Chen, Kenji <kenji.chen@intel.com>
Subject: [Bug 2321] Add FitGen feature to support uCode Capsule Update

https://bugzilla.tianocore.org/show_bug.cgi?id=2321

Liming Gao <liming.gao@intel.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |CONFIRMED
                 CC|                            |liming.gao@intel.com
           Assignee|michael.d.kinney@intel.com  |kenji.chen@intel.com
     Ever confirmed|0                           |1

--- Comment #1 from Liming Gao <liming.gao@intel.com> --- Kenji is working on the patch.

--
You are receiving this mail because:
You are the assignee for the bug.
You reported the bug.

[-- Attachment #2: 0001-Enhance-FitGen.patch --]
[-- Type: application/octet-stream, Size: 6496 bytes --]

From 366e1d9b2488171bc07be6b699bc69a48f569835 Mon Sep 17 00:00:00 2001
From: Chen A Chen <chen.a.chen@intel.com>
Date: Tue, 7 May 2019 13:14:49 +0800
Subject: [PATCH] Enhance FitGen

1) Fix alignment issue for FV header
2) Will check each size of uCode patch is less than SlotSize
3) Will continue to scan empty slot after uCode patch array
   Assumption: there are no empty slot between each uCode patch
   The empty range is behind uCode patch array
4) We reserve 100KB for each uCode patch in current solution

Change-Id: Ie324b5379a86905837aeba7d900b6ce29ca66179
Signed-off-by: Chen A Chen <chen.a.chen@intel.com>
Hsd-es-id: None
Tracker-link: None
Attestation-link: None
Reviewed-on: https://git-amr-7.devtools.intel.com/gerrit/48140
Tested-by: CR <cr2@intel.com>
Test-Verified: CR <cr2@intel.com>
Reviewed-by: Zhang, Chao B <chao.b.zhang@intel.com>
Reviewed-by: Chai, Evan <evan.chai@intel.com>
---
 BpCommonPkg/Tools/FitGen/FitGen.c | 76 +++++++++++++++++++++++++++++++++++----
 1 file changed, 69 insertions(+), 7 deletions(-)

diff --git a/BpCommonPkg/Tools/FitGen/FitGen.c b/BpCommonPkg/Tools/FitGen/FitGen.c
index 6ed48f9d30..aef0d838a0 100644
--- a/BpCommonPkg/Tools/FitGen/FitGen.c
+++ b/BpCommonPkg/Tools/FitGen/FitGen.c
@@ -776,6 +776,7 @@ Returns:
 {
   EFI_GUID  Guid;
   INTN      Index;
+  UINTN     MicrocodeIndex;
   UINT8     *FileBuffer;
   UINT32    FileSize;
   UINT32    Type;
@@ -785,8 +786,10 @@ Returns:
   UINT32    MicrocodeBase;
   UINT32    MicrocodeSize;
   UINT8     *MicrocodeBuffer;
+  UINT8     *MicrocodeBufferEnd;
   UINT32    MicrocodeRegionOffset;
   UINT32    MicrocodeRegionSize;
+  UINT32    SlotSize;
   STATUS    Status;
   EFI_FIRMWARE_VOLUME_HEADER  *FvHeader;
   UINTN                       FitEntryNumber;
@@ -794,6 +797,7 @@ Returns:
   BIOS_INFO_HEADER            *BiosInfo;
   BIOS_INFO_STRUCT            *BiosInfoStruct;
   UINTN                       BiosInfoIndex;
+  UINT32                      AlignmentByte;
 
   //
   // Init index
@@ -911,7 +915,22 @@ Returns:
   }
 
   //
-  // 0.5 BiosInfo
+  // 0.5 SlotSize
+  //
+  if ((Index + 1 >= argc) ||
+      ((strcmp (argv[Index], "-S") != 0) &&
+       (strcmp (argv[Index], "-s") != 0)) ) {
+    //
+    // Bypass
+    //
+    SlotSize = 0;
+  } else {
+    SlotSize = xtoi (argv[Index + 1]);
+    Index += 2;
+  }
+
+  //
+  // 0.6 BiosInfo
   //
   if ((Index + 1 >= argc) ||
       ((strcmp (argv[Index], "-I") != 0) &&
@@ -1009,6 +1028,7 @@ Returns:
 
             MicrocodeFileBuffer = FLASH_TO_MEMORY (MicrocodeRegionOffset, FdBuffer, FdSize);
             MicrocodeFileSize = MicrocodeRegionSize;
+            MicrocodeBufferEnd = MicrocodeFileBuffer + MicrocodeFileSize;
             MicrocodeBase = MicrocodeRegionOffset;
 
             FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *)MicrocodeFileBuffer;
@@ -1018,13 +1038,26 @@ Returns:
             } else {
               MicrocodeBuffer = MicrocodeFileBuffer;
             }
+
+            AlignmentByte = 1;
+            AlignmentByte = AlignmentByte << ((FvHeader->Attributes&0x000F0000) >> 16);
+
+            ///
+            /// Make MicrocodeBuffer address to alignment.
+            ///
+            if ((UINT32)MicrocodeBuffer % AlignmentByte != 0) {
+              MicrocodeBuffer = (UINT8 *)((UINT32)MicrocodeBuffer &~(AlignmentByte - 1));
+              MicrocodeBuffer += AlignmentByte;
+            }
+
             while ((UINT32)(MicrocodeBuffer - MicrocodeFileBuffer) < MicrocodeFileSize) {
-              if (*(UINT32 *)(MicrocodeBuffer) != 0x1) { // HeaderVersion
-                break;
-              }
-              if (*(UINT32 *)(MicrocodeBuffer + 20) != 0x1) { // LoaderVersion
-                break;
+              if (*(UINT32 *)(MicrocodeBuffer) != 0x1 ||
+                  *(UINT32 *)(MicrocodeBuffer + 20) != 0x1
+                 ) { // HeaderVersion
+                MicrocodeBuffer += 1024;
+                continue;
               }
+
               if (*(UINT32 *)(MicrocodeBuffer + 28) == 0) { // DataSize
                 MicrocodeSize = 2048;
               } else {
@@ -1047,12 +1080,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;
+              //
+              // No longer use.
+              //
+              //gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Size = MicrocodeSize;
               gFitTableContext.MicrocodeNumber++;
               gFitTableContext.FitEntryNumber++;
 
               MicrocodeBuffer += MicrocodeSize;
             }
+
+            if (SlotSize != 0) {
+              ///
+              /// Check whether each uCode is alignment with SlotSize bytes.
+              ///
+              for (MicrocodeIndex = 1; MicrocodeIndex < (INTN)gFitTableContext.MicrocodeNumber; MicrocodeIndex++) {
+                if (gFitTableContext.Microcode[MicrocodeIndex].Address - gFitTableContext.Microcode[MicrocodeIndex - 1].Address != SlotSize) {
+                  printf ("uCode must be follow SlotSize(%lu) alignment.\n", SlotSize);
+                  ASSERT (FALSE);
+                }
+              }
+
+              ///
+              /// Assume the empty space follows the uCode array.
+              ///
+              MicrocodeBuffer = (UINT8 *)(gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber - 1].Address - MicrocodeBase + MicrocodeFileBuffer);
+              MicrocodeBuffer += SlotSize;
+              while (MicrocodeBuffer + SlotSize <= MicrocodeBufferEnd) {
+                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:
-- 
2.16.2.windows.1


       reply	other threads:[~2019-11-08  8:49 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <bug-2321-591@https.bugzilla.tianocore.org/>
     [not found] ` <bug-2321-591-866w3Xggjl@https.bugzilla.tianocore.org/>
2019-11-08  8:49   ` kenji.chen [this message]
     [not found]     ` <4A89E2EF3DFEDB4C8BFDE51014F606A14E53E843@SHSMSX104.ccr.corp.intel.com>
     [not found]       ` <4A89E2EF3DFEDB4C8BFDE51014F606A14E53E84D@SHSMSX104.ccr.corp.intel.com>
2019-11-13  0:01         ` [edk2-devel] [Bug 2321] Add FitGen feature to support uCode Capsule Update Chen, Kenji
2019-11-13  0:47           ` Liming Gao
2019-11-13  1:43             ` Chen, Kenji
     [not found]             ` <15D6956B317AC3B8.15925@groups.io>
2019-11-13  1:52               ` Chen, Kenji
2019-11-13  1:53                 ` Liming Gao
     [not found]               ` <15D695F978FFA77A.3623@groups.io>
2019-11-13  1:59                 ` Chen, Kenji

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=BN8PR11MB37462FCED7EF57EA77AC9C3E827B0@BN8PR11MB3746.namprd11.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox