MSR_IA32_BIOS_UPDT_TRIG,\r
(UINT64) (UINTN) MicrocodeData\r
);\r
- //\r
- // Get and check new microcode signature\r
- //\r
- CurrentRevision = GetCurrentMicrocodeSignature ();\r
- if (CurrentRevision != LatestRevision) {\r
- AcquireSpinLock(&CpuMpData->MpLock);\r
- DEBUG ((EFI_D_ERROR, "Updated microcode signature [0x%08x] does not match \\r
- loaded microcode signature [0x%08x]\n", CurrentRevision, LatestRevision));\r
- ReleaseSpinLock(&CpuMpData->MpLock);\r
- }\r
}\r
+ CpuMpData->CpuData[ProcessorNumber].MicrocodeRevision = GetCurrentMicrocodeSignature ();\r
}\r
\r
/**\r
}\r
}\r
\r
+ //\r
+ // Dump the microcode revision for each core.\r
+ //\r
+ DEBUG_CODE (\r
+ UINT32 ThreadId;\r
+ UINT32 ExpectedMicrocodeRevision;\r
+ CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;\r
+ for (Index = 0; Index < CpuMpData->CpuCount; Index++) {\r
+ GetProcessorLocationByApicId (CpuInfoInHob[Index].InitialApicId, NULL, NULL, &ThreadId);\r
+ if (ThreadId == 0) {\r
+ //\r
+ // MicrocodeDetect() loads microcode in first thread of each core, so,\r
+ // CpuMpData->CpuData[Index].MicrocodeEntryAddr is initialized only for first thread of each core.\r
+ //\r
+ ExpectedMicrocodeRevision = 0;\r
+ if (CpuMpData->CpuData[Index].MicrocodeEntryAddr != 0) {\r
+ ExpectedMicrocodeRevision = ((CPU_MICROCODE_HEADER *)(UINTN)CpuMpData->CpuData[Index].MicrocodeEntryAddr)->UpdateRevision;\r
+ }\r
+ DEBUG ((\r
+ DEBUG_INFO, "CPU[%04d]: Microcode revision = %08x, expected = %08x\n",\r
+ Index, CpuMpData->CpuData[Index].MicrocodeRevision, ExpectedMicrocodeRevision\r
+ ));\r
+ }\r
+ }\r
+ );\r
//\r
// Initialize global data for MP support\r
//\r