Verification microcode signature is one enhancement and not one requirement from
IA32 SDM. This update is just to dump debug message instead of ASSERT() if the
updated microcode signature does not match the loaded microcode signature.

Cc: Michael Kinney <[email protected]>
Cc: Feng Tian <[email protected]>
Cc: Giri P Mudusuru <[email protected]>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <[email protected]>
---
 UefiCpuPkg/CpuMpPei/CpuMpPei.c  |  4 ++--
 UefiCpuPkg/CpuMpPei/CpuMpPei.h  | 10 ++++++++++
 UefiCpuPkg/CpuMpPei/Microcode.c | 33 +++++++++++++++++++--------------
 UefiCpuPkg/CpuMpPei/Microcode.h |  9 ---------
 4 files changed, 31 insertions(+), 25 deletions(-)

diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.c b/UefiCpuPkg/CpuMpPei/CpuMpPei.c
index 4ed1da9..bccff24 100644
--- a/UefiCpuPkg/CpuMpPei/CpuMpPei.c
+++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.c
@@ -302,7 +302,7 @@ ApCFunction (
       // Sync BSP's Mtrr table to all wakeup APs and load microcode on APs.
       //
       MtrrSetAllMtrrs (&PeiCpuMpData->MtrrTable);
-      MicrocodeDetect ();
+      MicrocodeDetect (PeiCpuMpData);
       PeiCpuMpData->CpuData[ProcessorNumber].State = CpuStateIdle;
     } else {
       //
@@ -624,7 +624,7 @@ CountProcessorNumber (
   //
   // Load Microcode on BSP
   //
-  MicrocodeDetect ();
+  MicrocodeDetect (PeiCpuMpData);
   //
   // Store BSP's MTRR setting
   //
diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.h b/UefiCpuPkg/CpuMpPei/CpuMpPei.h
index afbcb6e..5e56934 100644
--- a/UefiCpuPkg/CpuMpPei/CpuMpPei.h
+++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.h
@@ -321,4 +321,14 @@ SecPlatformInformation2 (
      OUT EFI_SEC_PLATFORM_INFORMATION_RECORD2 *PlatformInformationRecord2
   );
 
+/**
+  Detect whether specified processor can find matching microcode patch and 
load it.
+
+  @param PeiCpuMpData        Pointer to PEI CPU MP Data
+**/
+VOID
+MicrocodeDetect (
+  IN PEI_CPU_MP_DATA            *PeiCpuMpData
+  );
+
 #endif
diff --git a/UefiCpuPkg/CpuMpPei/Microcode.c b/UefiCpuPkg/CpuMpPei/Microcode.c
index 8e7f3b0..51a0737 100644
--- a/UefiCpuPkg/CpuMpPei/Microcode.c
+++ b/UefiCpuPkg/CpuMpPei/Microcode.c
@@ -36,10 +36,11 @@ GetCurrentMicrocodeSignature (
 /**
   Detect whether specified processor can find matching microcode patch and 
load it.
 
+  @param PeiCpuMpData        Pointer to PEI CPU MP Data
 **/
 VOID
 MicrocodeDetect (
-  VOID
+  IN PEI_CPU_MP_DATA            *PeiCpuMpData
   )
 {
   UINT64                                  MicrocodePatchAddress;
@@ -187,25 +188,29 @@ MicrocodeDetect (
     MicrocodeEntryPoint = (EFI_CPU_MICROCODE_HEADER *) (((UINTN) 
MicrocodeEntryPoint) + TotalSize);
   } while (((UINTN) MicrocodeEntryPoint < MicrocodeEnd));
 
-  if (LatestRevision > 0) {
+  if (LatestRevision > CurrentRevision) {
     //
     // BIOS only authenticate updates that contain a numerically larger 
revision
     // than the currently loaded revision, where Current Signature < New Update
     // Revision. A processor with no loaded update is considered to have a
     // revision equal to zero.
     //
-    if (LatestRevision > GetCurrentMicrocodeSignature ()) {
-      AsmWriteMsr64 (
-        EFI_MSR_IA32_BIOS_UPDT_TRIG,
-        (UINT64) (UINTN) MicrocodeInfo.MicrocodeData
-        );
-      //
-      // Get and verify new microcode signature
-      //
-      ASSERT (LatestRevision == GetCurrentMicrocodeSignature ());
-      MicrocodeInfo.Load = TRUE;
-    } else {
-      MicrocodeInfo.Load = FALSE;
+    AsmWriteMsr64 (
+      EFI_MSR_IA32_BIOS_UPDT_TRIG,
+      (UINT64) (UINTN) MicrocodeInfo.MicrocodeData
+      );
+    //
+    // Get and check new microcode signature
+    //
+    CurrentRevision = GetCurrentMicrocodeSignature ();
+    if (CurrentRevision != LatestRevision) {
+      AcquireSpinLock(&PeiCpuMpData->MpLock);
+      DEBUG ((EFI_D_ERROR, "Updated microcode signature [0x%08x] does not 
match \
+                loaded microcode signature [0x%08x]\n", CurrentRevision, 
LatestRevision));
+      ReleaseSpinLock(&PeiCpuMpData->MpLock);
     }
+    MicrocodeInfo.Load = TRUE;
+  } else {
+    MicrocodeInfo.Load = FALSE;
   }
 }
diff --git a/UefiCpuPkg/CpuMpPei/Microcode.h b/UefiCpuPkg/CpuMpPei/Microcode.h
index ea68669..f7d23a0 100644
--- a/UefiCpuPkg/CpuMpPei/Microcode.h
+++ b/UefiCpuPkg/CpuMpPei/Microcode.h
@@ -56,13 +56,4 @@ typedef struct {
   UINT32  ProcessorChecksum;
 } EFI_CPU_MICROCODE_EXTENDED_TABLE;
 
-/**
-  Detect whether specified processor can find matching microcode patch and 
load it.
-
-**/
-VOID
-MicrocodeDetect (
-  VOID
-  );
-
 #endif
-- 
2.7.4.windows.1

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to