diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.c b/UefiCpuPkg/CpuMpPei/CpuMpPei.c index 4ed1da9878..bccff24cc1 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 afbcb6e579..5e56934a27 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 67280d334d..82d49d7cb9 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 ea686690ff..f7d23a08fd 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