]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/CpuMpPei/CpuBist.c
UefiCpuPkg/PiSmmCpu: Check for untested memory in GCD
[mirror_edk2.git] / UefiCpuPkg / CpuMpPei / CpuBist.c
index dae7d78f0411e9852b19d5b105945b785b3a26f1..5312d9f01dc8229aa601112e5b471d60d162ddca 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Update and publish processors' BIST information.\r
 \r
-  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -44,34 +44,29 @@ SecPlatformInformation2 (
      OUT EFI_SEC_PLATFORM_INFORMATION_RECORD2 *PlatformInformationRecord2\r
   )\r
 {\r
-  UINTN                                BistInformationSize;\r
-  UINTN                                CpuIndex;\r
-  EFI_SEC_PLATFORM_INFORMATION_CPU     *CpuInstance;\r
-  EFI_PROCESSOR_INFORMATION            ProcessorInfo;\r
-  EFI_HEALTH_FLAGS                     BistData;\r
-  UINTN                                NumberOfProcessors;\r
-  UINTN                                NumberOfEnabledProcessors;\r
+  EFI_HOB_GUID_TYPE       *GuidHob;\r
+  VOID                    *DataInHob;\r
+  UINTN                   DataSize;\r
 \r
-  MpInitLibGetNumberOfProcessors(&NumberOfProcessors, &NumberOfEnabledProcessors);\r
+  GuidHob = GetFirstGuidHob (&gEfiSecPlatformInformation2PpiGuid);\r
+  if (GuidHob == NULL) {\r
+    *StructureSize = 0;\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  DataInHob = GET_GUID_HOB_DATA (GuidHob);\r
+  DataSize  = GET_GUID_HOB_DATA_SIZE (GuidHob);\r
 \r
-  BistInformationSize = sizeof (EFI_SEC_PLATFORM_INFORMATION_RECORD2) +\r
-                        sizeof (EFI_SEC_PLATFORM_INFORMATION_CPU) * NumberOfProcessors;\r
   //\r
-  // return the information size if input buffer size is too small\r
+  // return the information from BistHob\r
   //\r
-  if ((*StructureSize) < (UINT64) BistInformationSize) {\r
-    *StructureSize = (UINT64) BistInformationSize;\r
+  if ((*StructureSize) < (UINT64) DataSize) {\r
+    *StructureSize = (UINT64) DataSize;\r
     return EFI_BUFFER_TOO_SMALL;\r
   }\r
 \r
-  PlatformInformationRecord2->NumberOfCpus = (UINT32)NumberOfProcessors;\r
-  CpuInstance = PlatformInformationRecord2->CpuInstance;\r
-  for (CpuIndex = 0; CpuIndex < NumberOfProcessors; CpuIndex ++) {\r
-    MpInitLibGetProcessorInfo (CpuIndex, &ProcessorInfo, &BistData);\r
-    CpuInstance[CpuIndex].CpuLocation = (UINT32) ProcessorInfo.ProcessorId;\r
-    CpuInstance[CpuIndex].InfoRecord.IA32HealthFlags = BistData;\r
-  }\r
-\r
+  *StructureSize = (UINT64) DataSize;\r
+  CopyMem (PlatformInformationRecord2, DataInHob, DataSize);\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -181,14 +176,26 @@ CollectBistDataFromPpi (
   EFI_HEALTH_FLAGS                      BistData;\r
   UINTN                                 NumberOfProcessors;\r
   UINTN                                 NumberOfEnabledProcessors;\r
+  UINTN                                 BistInformationSize;\r
+  EFI_SEC_PLATFORM_INFORMATION_RECORD2  *PlatformInformationRecord2;\r
+  EFI_SEC_PLATFORM_INFORMATION_CPU      *CpuInstanceInHob;\r
+\r
 \r
   MpInitLibGetNumberOfProcessors(&NumberOfProcessors, &NumberOfEnabledProcessors);\r
 \r
+  BistInformationSize = sizeof (EFI_SEC_PLATFORM_INFORMATION_RECORD2) +\r
+                        sizeof (EFI_SEC_PLATFORM_INFORMATION_CPU) * NumberOfProcessors;\r
+  Status = PeiServicesAllocatePool (\r
+             (UINTN) BistInformationSize,\r
+             (VOID **) &PlatformInformationRecord2\r
+             );\r
+  ASSERT_EFI_ERROR (Status);\r
+  PlatformInformationRecord2->NumberOfCpus = (UINT32)NumberOfProcessors;\r
+\r
   SecPlatformInformation2 = NULL;\r
   SecPlatformInformation  = NULL;\r
   NumberOfData            = 0;\r
   CpuInstance             = NULL;\r
-\r
   //\r
   // Get BIST information from Sec Platform Information2 Ppi firstly\r
   //\r
@@ -250,23 +257,38 @@ CollectBistDataFromPpi (
         );\r
     }\r
     DEBUG ((EFI_D_INFO, "  APICID - 0x%08x, BIST - 0x%08x\n",\r
-            ProcessorInfo.ProcessorId,\r
+            (UINT32) ProcessorInfo.ProcessorId,\r
             BistData\r
             ));\r
+    CpuInstanceInHob = PlatformInformationRecord2->CpuInstance;\r
+    CpuInstanceInHob[ProcessorNumber].CpuLocation = (UINT32) ProcessorInfo.ProcessorId;\r
+    CpuInstanceInHob[ProcessorNumber].InfoRecord.IA32HealthFlags = BistData;\r
   }\r
 \r
-  if (SecPlatformInformation2 != NULL && NumberOfData < NumberOfProcessors) {\r
-    //\r
-    // Reinstall SecPlatformInformation2 PPI to include new BIST information\r
-    //\r
-    Status = PeiServicesReInstallPpi (\r
-               SecInformationDescriptor,\r
-               &mPeiSecPlatformInformation2Ppi\r
-               );\r
-    ASSERT_EFI_ERROR (Status);\r
+  //\r
+  // Build SecPlatformInformation2 PPI GUIDed HOB that also could be consumed\r
+  // by CPU MP driver to get CPU BIST data\r
+  //\r
+  BuildGuidDataHob (\r
+    &gEfiSecPlatformInformation2PpiGuid,\r
+    PlatformInformationRecord2,\r
+    (UINTN) BistInformationSize\r
+    );\r
+\r
+  if (SecPlatformInformation2 != NULL) {\r
+    if (NumberOfData < NumberOfProcessors) {\r
+      //\r
+      // Reinstall SecPlatformInformation2 PPI to include new BIST information\r
+      //\r
+      Status = PeiServicesReInstallPpi (\r
+                 SecInformationDescriptor,\r
+                 &mPeiSecPlatformInformation2Ppi\r
+                 );\r
+      ASSERT_EFI_ERROR (Status);\r
+    }\r
   } else {\r
     //\r
-    // Install SecPlatformInformation2 PPI to include new BIST information\r
+    // Install SecPlatformInformation2 PPI\r
     //\r
     Status = PeiServicesInstallPpi (&mPeiSecPlatformInformation2Ppi);\r
     ASSERT_EFI_ERROR(Status);\r