There is no functional changes, only extract DumpMicrocodeRevision since only in PEI BSP will detect, apply microcode, and APs will sync microcode.
Cc: Ray Ni <ray...@intel.com> Cc: Eric Dong <eric.d...@intel.com> Cc: Rahul Kumar <rahul1.ku...@intel.com> Cc: Tom Lendacky <thomas.lenda...@amd.com> Cc: Laszlo Ersek <ler...@redhat.com> Signed-off-by: Yuanhao Xie <yuanhao....@intel.com> --- UefiCpuPkg/Library/MpInitLib/Microcode.c | 91 +++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------- UefiCpuPkg/Library/MpInitLib/MpLib.c | 31 ++----------------------------- UefiCpuPkg/Library/MpInitLib/MpLib.h | 31 ++++++++++--------------------- 3 files changed, 57 insertions(+), 96 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/Microcode.c b/UefiCpuPkg/Library/MpInitLib/Microcode.c index 11720560af..c0ca85543a 100644 --- a/UefiCpuPkg/Library/MpInitLib/Microcode.c +++ b/UefiCpuPkg/Library/MpInitLib/Microcode.c @@ -322,65 +322,64 @@ OnExit: } /** - Shadow the required microcode patches data into memory. + Dump the microcode revision for each core. - @param[in, out] CpuMpData The pointer to CPU MP Data structure. -**/ + @param[in] CpuMpData Pointer to CPU MP Data + **/ VOID -ShadowMicrocodeUpdatePatch ( - IN OUT CPU_MP_DATA *CpuMpData +DumpMicrocodeRevision ( + IN CPU_MP_DATA *CpuMpData ) { - EFI_STATUS Status; + UINT32 ThreadId; + UINT32 ExpectedMicrocodeRevision; + CPU_INFO_IN_HOB *CpuInfoInHob; + UINTN Index; - Status = PlatformShadowMicrocode (CpuMpData); - if (EFI_ERROR (Status)) { - ShadowMicrocodePatchByPcd (CpuMpData); + // + // Dump the microcode revision for each core. + // + DEBUG_CODE_BEGIN (); + CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob; + for (Index = 0; Index < CpuMpData->CpuCount; Index++) { + GetProcessorLocationByApicId (CpuInfoInHob[Index].InitialApicId, NULL, NULL, &ThreadId); + if (ThreadId == 0) { + // + // MicrocodeDetect() loads microcode in first thread of each core, so, + // CpuMpData->CpuData[Index].MicrocodeEntryAddr is initialized only for first thread of each core. + // + ExpectedMicrocodeRevision = 0; + if (CpuMpData->CpuData[Index].MicrocodeEntryAddr != 0) { + ExpectedMicrocodeRevision = ((CPU_MICROCODE_HEADER *)(UINTN)CpuMpData->CpuData[Index].MicrocodeEntryAddr)->UpdateRevision; + } + + DEBUG (( + DEBUG_INFO, + "CPU[%04d]: Microcode revision = %08x, expected = %08x\n", + Index, + CpuMpData->CpuData[Index].MicrocodeRevision, + ExpectedMicrocodeRevision + )); + } } + + DEBUG_CODE_END (); } /** - Get the cached microcode patch base address and size from the microcode patch - information cache HOB. - - @param[out] Address Base address of the microcode patches data. - It will be updated if the microcode patch - information cache HOB is found. - @param[out] RegionSize Size of the microcode patches data. - It will be updated if the microcode patch - information cache HOB is found. - - @retval TRUE The microcode patch information cache HOB is found. - @retval FALSE The microcode patch information cache HOB is not found. + Shadow the required microcode patches data into memory. + @param[in, out] CpuMpData The pointer to CPU MP Data structure. **/ -BOOLEAN -GetMicrocodePatchInfoFromHob ( - UINT64 *Address, - UINT64 *RegionSize +VOID +ShadowMicrocodeUpdatePatch ( + IN OUT CPU_MP_DATA *CpuMpData ) { - EFI_HOB_GUID_TYPE *GuidHob; - EDKII_MICROCODE_PATCH_HOB *MicrocodePathHob; + EFI_STATUS Status; - GuidHob = GetFirstGuidHob (&gEdkiiMicrocodePatchHobGuid); - if (GuidHob == NULL) { - DEBUG ((DEBUG_INFO, "%a: Microcode patch cache HOB is not found.\n", __func__)); - return FALSE; + Status = PlatformShadowMicrocode (CpuMpData); + if (EFI_ERROR (Status)) { + ShadowMicrocodePatchByPcd (CpuMpData); } - - MicrocodePathHob = GET_GUID_HOB_DATA (GuidHob); - - *Address = MicrocodePathHob->MicrocodePatchAddress; - *RegionSize = MicrocodePathHob->MicrocodePatchRegionSize; - - DEBUG (( - DEBUG_INFO, - "%a: MicrocodeBase = 0x%lx, MicrocodeSize = 0x%lx\n", - __func__, - *Address, - *RegionSize - )); - - return TRUE; } diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index 538095d3bb..2fd96bf0bc 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -2282,37 +2282,10 @@ MpInitLibInitialize ( } } - // - // Dump the microcode revision for each core. - // - DEBUG_CODE_BEGIN (); - UINT32 ThreadId; - UINT32 ExpectedMicrocodeRevision; - - CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob; - for (Index = 0; Index < CpuMpData->CpuCount; Index++) { - GetProcessorLocationByApicId (CpuInfoInHob[Index].InitialApicId, NULL, NULL, &ThreadId); - if (ThreadId == 0) { - // - // MicrocodeDetect() loads microcode in first thread of each core, so, - // CpuMpData->CpuData[Index].MicrocodeEntryAddr is initialized only for first thread of each core. - // - ExpectedMicrocodeRevision = 0; - if (CpuMpData->CpuData[Index].MicrocodeEntryAddr != 0) { - ExpectedMicrocodeRevision = ((CPU_MICROCODE_HEADER *)(UINTN)CpuMpData->CpuData[Index].MicrocodeEntryAddr)->UpdateRevision; - } - - DEBUG (( - DEBUG_INFO, - "CPU[%04d]: Microcode revision = %08x, expected = %08x\n", - Index, - CpuMpData->CpuData[Index].MicrocodeRevision, - ExpectedMicrocodeRevision - )); - } + if (MpHandOff == NULL) { + DumpMicrocodeRevision (CpuMpData); } - DEBUG_CODE_END (); // // Initialize global data for MP support // diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h index 763db4963d..fd302e6845 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h @@ -735,34 +735,23 @@ MicrocodeDetect ( ); /** - Shadow the required microcode patches data into memory. + Dump the microcode revision for each core. - @param[in, out] CpuMpData The pointer to CPU MP Data structure. -**/ + @param[in] CpuMpData Pointer to CPU MP Data + **/ VOID -ShadowMicrocodeUpdatePatch ( - IN OUT CPU_MP_DATA *CpuMpData +DumpMicrocodeRevision ( + IN CPU_MP_DATA *CpuMpData ); /** - Get the cached microcode patch base address and size from the microcode patch - information cache HOB. - - @param[out] Address Base address of the microcode patches data. - It will be updated if the microcode patch - information cache HOB is found. - @param[out] RegionSize Size of the microcode patches data. - It will be updated if the microcode patch - information cache HOB is found. - - @retval TRUE The microcode patch information cache HOB is found. - @retval FALSE The microcode patch information cache HOB is not found. + Shadow the required microcode patches data into memory. + @param[in, out] CpuMpData The pointer to CPU MP Data structure. **/ -BOOLEAN -GetMicrocodePatchInfoFromHob ( - UINT64 *Address, - UINT64 *RegionSize +VOID +ShadowMicrocodeUpdatePatch ( + IN OUT CPU_MP_DATA *CpuMpData ); /** -- 2.39.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#111597): https://edk2.groups.io/g/devel/message/111597 Mute This Topic: https://groups.io/mt/102744601/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-