UINTN Index;\r
UINT8 PlatformId;\r
CPUID_VERSION_INFO_EAX Eax;\r
+ CPU_AP_DATA *CpuData;\r
UINT32 CurrentRevision;\r
UINT32 LatestRevision;\r
UINTN TotalSize;\r
UINT32 InCompleteCheckSum32;\r
BOOLEAN CorrectMicrocode;\r
VOID *MicrocodeData;\r
- MSR_IA32_PLATFORM_ID_REGISTER PlatformIdMsr;\r
- UINT32 ProcessorFlags;\r
UINT32 ThreadId;\r
BOOLEAN IsBspCallIn;\r
\r
- //\r
- // set ProcessorFlags to suppress incorrect compiler/analyzer warnings\r
- //\r
- ProcessorFlags = 0;\r
-\r
if (CpuMpData->MicrocodePatchRegionSize == 0) {\r
//\r
// There is no microcode patches\r
}\r
\r
ExtendedTableLength = 0;\r
- //\r
- // Here data of CPUID leafs have not been collected into context buffer, so\r
- // GetProcessorCpuid() cannot be used here to retrieve CPUID data.\r
- //\r
- AsmCpuid (CPUID_VERSION_INFO, &Eax.Uint32, NULL, NULL, NULL);\r
-\r
- //\r
- // The index of platform information resides in bits 50:52 of MSR IA32_PLATFORM_ID\r
- //\r
- PlatformIdMsr.Uint64 = AsmReadMsr64 (MSR_IA32_PLATFORM_ID);\r
- PlatformId = (UINT8) PlatformIdMsr.Bits.PlatformId;\r
+ Eax.Uint32 = CpuMpData->CpuData[ProcessorNumber].ProcessorSignature;\r
+ PlatformId = CpuMpData->CpuData[ProcessorNumber].PlatformId;\r
\r
//\r
// Check whether AP has same processor with BSP.\r
// If yes, direct use microcode info saved by BSP.\r
//\r
if (!IsBspCallIn) {\r
- if ((CpuMpData->ProcessorSignature == Eax.Uint32) &&\r
- (CpuMpData->ProcessorFlags & (1 << PlatformId)) != 0) {\r
- MicrocodeData = (VOID *)(UINTN) CpuMpData->MicrocodeDataAddress;\r
- LatestRevision = CpuMpData->MicrocodeRevision;\r
- goto Done;\r
+ //\r
+ // Get the CPU data for BSP\r
+ //\r
+ CpuData = &(CpuMpData->CpuData[CpuMpData->BspNumber]);\r
+ if ((CpuData->ProcessorSignature == Eax.Uint32) &&\r
+ (CpuData->PlatformId == PlatformId) &&\r
+ (CpuData->MicrocodeEntryAddr != 0)) {\r
+ MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *)(UINTN) CpuData->MicrocodeEntryAddr;\r
+ MicrocodeData = (VOID *) (MicrocodeEntryPoint + 1);\r
+ LatestRevision = MicrocodeEntryPoint->UpdateRevision;\r
+ goto Done;\r
}\r
}\r
\r
CheckSum32 += MicrocodeEntryPoint->Checksum;\r
if (CheckSum32 == 0) {\r
CorrectMicrocode = TRUE;\r
- ProcessorFlags = MicrocodeEntryPoint->ProcessorFlags;\r
}\r
} else if ((MicrocodeEntryPoint->DataSize != 0) &&\r
(MicrocodeEntryPoint->UpdateRevision > LatestRevision)) {\r
// Find one\r
//\r
CorrectMicrocode = TRUE;\r
- ProcessorFlags = ExtendedTable->ProcessorFlag;\r
break;\r
}\r
}\r
ReleaseSpinLock(&CpuMpData->MpLock);\r
}\r
}\r
-\r
- if (IsBspCallIn && (LatestRevision != 0)) {\r
- //\r
- // Save BSP processor info and microcode info for later AP use.\r
- //\r
- CpuMpData->ProcessorSignature = Eax.Uint32;\r
- CpuMpData->ProcessorFlags = ProcessorFlags;\r
- CpuMpData->MicrocodeDataAddress = (UINTN) MicrocodeData;\r
- CpuMpData->MicrocodeRevision = LatestRevision;\r
- DEBUG ((DEBUG_INFO, "BSP Microcode:: signature [0x%08x], ProcessorFlags [0x%08x], \\r
- MicroData [0x%08x], Revision [0x%08x]\n", Eax.Uint32, ProcessorFlags, (UINTN) MicrocodeData, LatestRevision));\r
- }\r
}\r
\r
/**\r