X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=UefiCpuPkg%2FCpuMpPei%2FMicrocode.c;h=82d49d7cb9b15c2679e314a096552fc0cf3eb308;hp=67280d334d33fd8774ee93b2d09574283d8a6bec;hb=719ff8cf3e8f3abc967de8a0a71319ce66ff2d9d;hpb=46fd118219fcce638f1eb9c861f4a037530b64b9 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; } }