]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/RegisterCpuFeaturesLib: Combine implementation.
authorEric Dong <eric.dong@intel.com>
Fri, 10 Aug 2018 02:59:26 +0000 (10:59 +0800)
committerEric Dong <eric.dong@intel.com>
Thu, 16 Aug 2018 00:42:01 +0000 (08:42 +0800)
V1 changes:
> Current code logic can't confirm CpuS3DataDxe driver start before
> CpuFeaturesDxe driver. So the assumption in CpuFeaturesDxe not valid.
> Add implementation for AllocateAcpiCpuData function to remove this
> assumption.

V2 changes:
> Because CpuS3Data memory will be copy to smram at SmmReadToLock point,
> so the memory type no need to be ACPI NVS type, also the address not
> limit to below 4G.
> This change remove the limit of ACPI NVS memory type and below 4G.

V3 changes:
> Remove function definition in header file.
> Add STATIC in function implementation.

Pass OS boot and resume from S3 test.

Bugz: https://bugzilla.tianocore.org/show_bug.cgi?id=959

Reported-by: Marvin Häuser <Marvin.Haeuser@outlook.com>
Suggested-by: Fan Jeff <vanjeff_919@hotmail.com>
Cc: Marvin Häuser <Marvin.Haeuser@outlook.com>
Cc: Fan Jeff <vanjeff_919@hotmail.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c
UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c
UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c

index 902a339529e2552aa32a2fefa86555f0c751900c..1f34a3f48937d5b381c1f2a01eb3118c2f088f63 100644 (file)
@@ -197,70 +197,3 @@ GetNumberOfProcessor (
   ASSERT_EFI_ERROR (Status);\r
 }\r
 \r
-/**\r
-  Allocates ACPI NVS memory to save ACPI_CPU_DATA.\r
-\r
-  @return  Pointer to allocated ACPI_CPU_DATA.\r
-**/\r
-ACPI_CPU_DATA *\r
-AllocateAcpiCpuData (\r
-  VOID\r
-  )\r
-{\r
-  //\r
-  // CpuS3DataDxe will do it.\r
-  //\r
-  ASSERT (FALSE);\r
-  return NULL;\r
-}\r
-\r
-/**\r
-  Enlarges CPU register table for each processor.\r
-\r
-  @param[in, out]  RegisterTable   Pointer processor's CPU register table\r
-**/\r
-VOID\r
-EnlargeRegisterTable (\r
-  IN OUT CPU_REGISTER_TABLE            *RegisterTable\r
-  )\r
-{\r
-  EFI_STATUS            Status;\r
-  EFI_PHYSICAL_ADDRESS  Address;\r
-  UINTN                 AllocatePages;\r
-\r
-  Address = BASE_4GB - 1;\r
-  AllocatePages = RegisterTable->AllocatedSize / EFI_PAGE_SIZE;\r
-  Status  = gBS->AllocatePages (\r
-                   AllocateMaxAddress,\r
-                   EfiACPIMemoryNVS,\r
-                   AllocatePages + 1,\r
-                   &Address\r
-                   );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  //\r
-  // If there are records existing in the register table, then copy its contents\r
-  // to new region and free the old one.\r
-  //\r
-  if (RegisterTable->AllocatedSize > 0) {\r
-    CopyMem (\r
-      (VOID *) (UINTN) Address,\r
-      (VOID *) (UINTN) RegisterTable->RegisterTableEntry,\r
-      RegisterTable->AllocatedSize\r
-      );\r
-    //\r
-    // RegisterTableEntry is allocated by gBS->AllocatePages() service.\r
-    // So, gBS->FreePages() service is used to free it.\r
-    //\r
-    gBS->FreePages (\r
-      RegisterTable->RegisterTableEntry,\r
-      AllocatePages\r
-      );\r
-  }\r
-\r
-  //\r
-  // Adjust the allocated size and register table base address.\r
-  //\r
-  RegisterTable->AllocatedSize     += EFI_PAGE_SIZE;\r
-  RegisterTable->RegisterTableEntry = Address;\r
-}\r
index 6804eddf65d9f3c4affc97dbae02faca2fdb1b67..82fe268812af64e35ffe35f36264610e5b7c0510 100644 (file)
@@ -257,134 +257,3 @@ GetNumberOfProcessor (
                          );\r
   ASSERT_EFI_ERROR (Status);\r
 }\r
-\r
-/**\r
-  Allocates ACPI NVS memory to save ACPI_CPU_DATA.\r
-\r
-  @return  Pointer to allocated ACPI_CPU_DATA.\r
-**/\r
-ACPI_CPU_DATA *\r
-AllocateAcpiCpuData (\r
-  VOID\r
-  )\r
-{\r
-  EFI_STATUS                           Status;\r
-  EFI_PEI_MP_SERVICES_PPI              *CpuMpPpi;\r
-  UINTN                                NumberOfCpus;\r
-  UINTN                                NumberOfEnabledProcessors;\r
-  ACPI_CPU_DATA                        *AcpiCpuData;\r
-  EFI_PHYSICAL_ADDRESS                 Address;\r
-  UINTN                                TableSize;\r
-  CPU_REGISTER_TABLE                   *RegisterTable;\r
-  UINTN                                Index;\r
-  EFI_PROCESSOR_INFORMATION            ProcessorInfoBuffer;\r
-\r
-  Status = PeiServicesAllocatePages (\r
-             EfiACPIMemoryNVS,\r
-             EFI_SIZE_TO_PAGES (sizeof (ACPI_CPU_DATA)),\r
-             &Address\r
-             );\r
-  ASSERT_EFI_ERROR (Status);\r
-  AcpiCpuData = (ACPI_CPU_DATA *) (UINTN) Address;\r
-  ASSERT (AcpiCpuData != NULL);\r
-\r
-  //\r
-  // Get MP Services Protocol\r
-  //\r
-  Status = PeiServicesLocatePpi (\r
-             &gEfiPeiMpServicesPpiGuid,\r
-             0,\r
-             NULL,\r
-             (VOID **)&CpuMpPpi\r
-             );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  //\r
-  // Get the number of CPUs\r
-  //\r
-  Status = CpuMpPpi->GetNumberOfProcessors (\r
-                         GetPeiServicesTablePointer (),\r
-                         CpuMpPpi,\r
-                         &NumberOfCpus,\r
-                         &NumberOfEnabledProcessors\r
-                         );\r
-  ASSERT_EFI_ERROR (Status);\r
-  AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;\r
-\r
-  //\r
-  // Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable for all CPUs\r
-  //\r
-  TableSize = 2 * NumberOfCpus * sizeof (CPU_REGISTER_TABLE);\r
-  Status = PeiServicesAllocatePages (\r
-             EfiACPIMemoryNVS,\r
-             EFI_SIZE_TO_PAGES (TableSize),\r
-             &Address\r
-             );\r
-  ASSERT_EFI_ERROR (Status);\r
-  RegisterTable = (CPU_REGISTER_TABLE *) (UINTN) Address;\r
-\r
-  for (Index = 0; Index < NumberOfCpus; Index++) {\r
-    Status = CpuMpPpi->GetProcessorInfo (\r
-                         GetPeiServicesTablePointer (),\r
-                         CpuMpPpi,\r
-                         Index,\r
-                         &ProcessorInfoBuffer\r
-                         );\r
-    ASSERT_EFI_ERROR (Status);\r
-\r
-    RegisterTable[Index].InitialApicId      = (UINT32)ProcessorInfoBuffer.ProcessorId;\r
-    RegisterTable[Index].TableLength        = 0;\r
-    RegisterTable[Index].AllocatedSize      = 0;\r
-    RegisterTable[Index].RegisterTableEntry = 0;\r
-\r
-    RegisterTable[NumberOfCpus + Index].InitialApicId      = (UINT32)ProcessorInfoBuffer.ProcessorId;\r
-    RegisterTable[NumberOfCpus + Index].TableLength        = 0;\r
-    RegisterTable[NumberOfCpus + Index].AllocatedSize      = 0;\r
-    RegisterTable[NumberOfCpus + Index].RegisterTableEntry = 0;\r
-  }\r
-  AcpiCpuData->RegisterTable           = (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;\r
-  AcpiCpuData->PreSmmInitRegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);\r
-\r
-  return AcpiCpuData;\r
-}\r
-\r
-/**\r
-  Enlarges CPU register table for each processor.\r
-\r
-  @param[in, out]  RegisterTable   Pointer processor's CPU register table\r
-**/\r
-VOID\r
-EnlargeRegisterTable (\r
-  IN OUT CPU_REGISTER_TABLE            *RegisterTable\r
-  )\r
-{\r
-  EFI_STATUS                           Status;\r
-  EFI_PHYSICAL_ADDRESS                 Address;\r
-  UINTN                                AllocatePages;\r
-\r
-  AllocatePages = RegisterTable->AllocatedSize / EFI_PAGE_SIZE;\r
-  Status = PeiServicesAllocatePages (\r
-             EfiACPIMemoryNVS,\r
-             AllocatePages + 1,\r
-             &Address\r
-             );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  //\r
-  // If there are records existing in the register table, then copy its contents\r
-  // to new region and free the old one.\r
-  //\r
-  if (RegisterTable->AllocatedSize > 0) {\r
-    CopyMem (\r
-      (VOID *) (UINTN) Address,\r
-      (VOID *) (UINTN) RegisterTable->RegisterTableEntry,\r
-      RegisterTable->AllocatedSize\r
-      );\r
-  }\r
-\r
-  //\r
-  // Adjust the allocated size and register table base address.\r
-  //\r
-  RegisterTable->AllocatedSize += EFI_PAGE_SIZE;\r
-  RegisterTable->RegisterTableEntry = Address;\r
-}\r
index 69b412172a44014de9f66e56fbedd1b178ed05c7..edd266934fd0ddb994ed698c92cc399dc7e7937a 100644 (file)
@@ -87,26 +87,6 @@ GetCpuFeaturesData (
   VOID\r
   );\r
 \r
-/**\r
-  Enlarges CPU register table for each processor.\r
-\r
-  @param[in, out]  RegisterTable   Pointer processor's CPU register table\r
-**/\r
-VOID\r
-EnlargeRegisterTable (\r
-  IN OUT CPU_REGISTER_TABLE            *RegisterTable\r
-  );\r
-\r
-/**\r
-  Allocates ACPI NVS memory to save ACPI_CPU_DATA.\r
-\r
-  @return  Pointer to allocated ACPI_CPU_DATA.\r
-**/\r
-ACPI_CPU_DATA *\r
-AllocateAcpiCpuData (\r
-  VOID\r
-  );\r
-\r
 /**\r
   Worker function to return processor index.\r
 \r
index dd6a82be7a5a1c2a2cf1c2e1b0475c496adcc8e6..4143ee4bb1bff053af68bfffd9aef3cb860a044f 100644 (file)
@@ -488,6 +488,98 @@ RegisterCpuFeature (
   return RETURN_SUCCESS;\r
 }\r
 \r
+/**\r
+  Allocates boot service data to save ACPI_CPU_DATA.\r
+\r
+  @return  Pointer to allocated ACPI_CPU_DATA.\r
+**/\r
+STATIC\r
+ACPI_CPU_DATA *\r
+AllocateAcpiCpuData (\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS                           Status;\r
+  UINTN                                NumberOfCpus;\r
+  UINTN                                NumberOfEnabledProcessors;\r
+  ACPI_CPU_DATA                        *AcpiCpuData;\r
+  UINTN                                TableSize;\r
+  CPU_REGISTER_TABLE                   *RegisterTable;\r
+  UINTN                                Index;\r
+  EFI_PROCESSOR_INFORMATION            ProcessorInfoBuffer;\r
+\r
+  AcpiCpuData  = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (ACPI_CPU_DATA)));\r
+  ASSERT (AcpiCpuData != NULL);\r
+\r
+  GetNumberOfProcessor (&NumberOfCpus, &NumberOfEnabledProcessors);\r
+  AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;\r
+\r
+  //\r
+  // Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable for all CPUs\r
+  //  \r
+  TableSize = 2 * NumberOfCpus * sizeof (CPU_REGISTER_TABLE);\r
+  RegisterTable  = AllocatePages (EFI_SIZE_TO_PAGES (TableSize));\r
+  ASSERT (RegisterTable != NULL);\r
+\r
+  for (Index = 0; Index < NumberOfCpus; Index++) {\r
+    Status = GetProcessorInformation (Index, &ProcessorInfoBuffer);\r
+    ASSERT_EFI_ERROR (Status);\r
+\r
+    RegisterTable[Index].InitialApicId      = (UINT32)ProcessorInfoBuffer.ProcessorId;\r
+    RegisterTable[Index].TableLength        = 0;\r
+    RegisterTable[Index].AllocatedSize      = 0;\r
+    RegisterTable[Index].RegisterTableEntry = 0;\r
+\r
+    RegisterTable[NumberOfCpus + Index].InitialApicId      = (UINT32)ProcessorInfoBuffer.ProcessorId;\r
+    RegisterTable[NumberOfCpus + Index].TableLength        = 0;\r
+    RegisterTable[NumberOfCpus + Index].AllocatedSize      = 0;\r
+    RegisterTable[NumberOfCpus + Index].RegisterTableEntry = 0;\r
+  }\r
+  AcpiCpuData->RegisterTable           = (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;\r
+  AcpiCpuData->PreSmmInitRegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);\r
+\r
+  return AcpiCpuData;\r
+}\r
+\r
+/**\r
+  Enlarges CPU register table for each processor.\r
+\r
+  @param[in, out]  RegisterTable   Pointer processor's CPU register table\r
+**/\r
+STATIC\r
+VOID\r
+EnlargeRegisterTable (\r
+  IN OUT CPU_REGISTER_TABLE            *RegisterTable\r
+  )\r
+{\r
+  EFI_PHYSICAL_ADDRESS  Address;\r
+  UINTN                 UsedPages;\r
+\r
+  UsedPages = RegisterTable->AllocatedSize / EFI_PAGE_SIZE;\r
+  Address  = (UINTN)AllocatePages (UsedPages + 1);\r
+  ASSERT (Address != 0);\r
+\r
+  //\r
+  // If there are records existing in the register table, then copy its contents\r
+  // to new region and free the old one.\r
+  //\r
+  if (RegisterTable->AllocatedSize > 0) {\r
+    CopyMem (\r
+      (VOID *) (UINTN) Address,\r
+      (VOID *) (UINTN) RegisterTable->RegisterTableEntry,\r
+      RegisterTable->AllocatedSize\r
+      );\r
+\r
+    FreePages ((VOID *)(UINTN)RegisterTable->RegisterTableEntry, UsedPages);\r
+  }\r
+\r
+  //\r
+  // Adjust the allocated size and register table base address.\r
+  //\r
+  RegisterTable->AllocatedSize     += EFI_PAGE_SIZE;\r
+  RegisterTable->RegisterTableEntry = Address;\r
+}\r
+\r
 /**\r
   Add an entry in specified register table.\r
 \r