#include "MpLib.h"\r
#include <Library/PeiServicesLib.h>\r
#include <Guid/S3SmmInitDone.h>\r
+#include <Ppi/ShadowMicrocode.h>\r
\r
/**\r
S3 SMM Init Done notification function.\r
return EnableDisableApWorker (ProcessorNumber, EnableAP, HealthFlag);\r
}\r
\r
+/**\r
+ This funtion will try to invoke platform specific microcode shadow logic to\r
+ relocate microcode update patches into memory.\r
+\r
+ @param[in] CpuMpData The pointer to CPU MP Data structure.\r
\r
+ @retval EFI_SUCCESS Shadow microcode success.\r
+ @retval EFI_OUT_OF_RESOURCES No enough resource to complete the operation.\r
+ @retval EFI_UNSUPPORTED Can't find platform specific microcode shadow\r
+ PPI/Protocol.\r
+**/\r
+EFI_STATUS\r
+PlatformShadowMicrocode (\r
+ IN OUT CPU_MP_DATA *CpuMpData\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EDKII_PEI_SHADOW_MICROCODE_PPI *ShadowMicrocodePpi;\r
+ UINTN CpuCount;\r
+ EDKII_PEI_MICROCODE_CPU_ID *MicrocodeCpuId;\r
+ UINTN Index;\r
+ UINTN BufferSize;\r
+ VOID *Buffer;\r
+\r
+ Status = PeiServicesLocatePpi (\r
+ &gEdkiiPeiShadowMicrocodePpiGuid,\r
+ 0,\r
+ NULL,\r
+ (VOID **) &ShadowMicrocodePpi\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ CpuCount = CpuMpData->CpuCount;\r
+ MicrocodeCpuId = (EDKII_PEI_MICROCODE_CPU_ID *) AllocateZeroPool (sizeof (EDKII_PEI_MICROCODE_CPU_ID) * CpuCount);\r
+ if (MicrocodeCpuId == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ for (Index = 0; Index < CpuMpData->CpuCount; Index++) {\r
+ MicrocodeCpuId[Index].ProcessorSignature = CpuMpData->CpuData[Index].ProcessorSignature;\r
+ MicrocodeCpuId[Index].PlatformId = CpuMpData->CpuData[Index].PlatformId;\r
+ }\r
+\r
+ Status = ShadowMicrocodePpi->ShadowMicrocode (\r
+ ShadowMicrocodePpi,\r
+ CpuCount,\r
+ MicrocodeCpuId,\r
+ &BufferSize,\r
+ &Buffer\r
+ );\r
+ FreePool (MicrocodeCpuId);\r
+ if (EFI_ERROR (Status)) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ CpuMpData->MicrocodePatchAddress = (UINTN) Buffer;\r
+ CpuMpData->MicrocodePatchRegionSize = BufferSize;\r
+\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "%a: Required microcode patches have been loaded at 0x%lx, with size 0x%lx.\n",\r
+ __FUNCTION__, CpuMpData->MicrocodePatchAddress, CpuMpData->MicrocodePatchRegionSize\r
+ ));\r
+\r
+ return EFI_SUCCESS;\r
+}\r