mirror of https://github.com/acidanthera/audk.git
UefiCpuPkg/CpuFeature: Don't assume CpuS3DataDxe alloc RegisterTable
There are lots of fields in ACPI_CPU_DATA structure while only followings are accessed by CpuFeature infra: * NumberOfCpus * PreSmmInitRegisterTable // pointer * RegisterTable // pointer * CpuStatus * ApLocation // pointer So it's possible that an implementation of CpuS3DataDxe doesn't allocate memory for PreSmmInitRegisterTable/RegisterTable/ApLocation. This patch handles the case when CpuS3DataDxe doesn't allocate memory for PreSmmInitRegisterTable/RegisterTable. Cc: Eric Dong <eric.dong@intel.com> Cc: Philippe Mathieu-Daudé <philmd@redhat.com> Cc: Rahul Kumar <rahul1.kumar@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Star Zeng <star.zeng@intel.com> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3159 Signed-off-by: Ray Ni <ray.ni@intel.com> [lersek@redhat.com: update CC list, add BZ reference, add my S-o-b] [lersek@redhat.com: deal with RegisterTable and PreSmmInitRegisterTable being zero independently of each other; replacing the ASSERT()] Signed-off-by: Laszlo Ersek <lersek@redhat.com> Message-Id: <20210119155440.2262-2-lersek@redhat.com> Reviewed-by: Star Zeng <star.zeng@intel.com>
This commit is contained in:
parent
e843a21e23
commit
cefad282fb
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
CPU Register Table Library functions.
|
||||
|
||||
Copyright (c) 2017 - 2020, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.<BR>
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
@ -937,45 +937,51 @@ GetAcpiCpuData (
|
|||
EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer;
|
||||
|
||||
AcpiCpuData = (ACPI_CPU_DATA *) (UINTN) PcdGet64 (PcdCpuS3DataAddress);
|
||||
if (AcpiCpuData != NULL) {
|
||||
return AcpiCpuData;
|
||||
}
|
||||
if (AcpiCpuData == NULL) {
|
||||
AcpiCpuData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (ACPI_CPU_DATA)));
|
||||
ASSERT (AcpiCpuData != NULL);
|
||||
ZeroMem (AcpiCpuData, sizeof (ACPI_CPU_DATA));
|
||||
|
||||
AcpiCpuData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (ACPI_CPU_DATA)));
|
||||
ASSERT (AcpiCpuData != NULL);
|
||||
|
||||
//
|
||||
// Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA structure
|
||||
//
|
||||
Status = PcdSet64S (PcdCpuS3DataAddress, (UINT64)(UINTN)AcpiCpuData);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
GetNumberOfProcessor (&NumberOfCpus, &NumberOfEnabledProcessors);
|
||||
AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;
|
||||
|
||||
//
|
||||
// Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable for all CPUs
|
||||
//
|
||||
TableSize = 2 * NumberOfCpus * sizeof (CPU_REGISTER_TABLE);
|
||||
RegisterTable = AllocatePages (EFI_SIZE_TO_PAGES (TableSize));
|
||||
ASSERT (RegisterTable != NULL);
|
||||
|
||||
for (Index = 0; Index < NumberOfCpus; Index++) {
|
||||
Status = GetProcessorInformation (Index, &ProcessorInfoBuffer);
|
||||
//
|
||||
// Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA structure
|
||||
//
|
||||
Status = PcdSet64S (PcdCpuS3DataAddress, (UINT64)(UINTN)AcpiCpuData);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
RegisterTable[Index].InitialApicId = (UINT32)ProcessorInfoBuffer.ProcessorId;
|
||||
RegisterTable[Index].TableLength = 0;
|
||||
RegisterTable[Index].AllocatedSize = 0;
|
||||
RegisterTable[Index].RegisterTableEntry = 0;
|
||||
|
||||
RegisterTable[NumberOfCpus + Index].InitialApicId = (UINT32)ProcessorInfoBuffer.ProcessorId;
|
||||
RegisterTable[NumberOfCpus + Index].TableLength = 0;
|
||||
RegisterTable[NumberOfCpus + Index].AllocatedSize = 0;
|
||||
RegisterTable[NumberOfCpus + Index].RegisterTableEntry = 0;
|
||||
GetNumberOfProcessor (&NumberOfCpus, &NumberOfEnabledProcessors);
|
||||
AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;
|
||||
}
|
||||
|
||||
if (AcpiCpuData->RegisterTable == 0 ||
|
||||
AcpiCpuData->PreSmmInitRegisterTable == 0) {
|
||||
//
|
||||
// Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable for all CPUs
|
||||
//
|
||||
TableSize = 2 * NumberOfCpus * sizeof (CPU_REGISTER_TABLE);
|
||||
RegisterTable = AllocatePages (EFI_SIZE_TO_PAGES (TableSize));
|
||||
ASSERT (RegisterTable != NULL);
|
||||
|
||||
for (Index = 0; Index < NumberOfCpus; Index++) {
|
||||
Status = GetProcessorInformation (Index, &ProcessorInfoBuffer);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
RegisterTable[Index].InitialApicId = (UINT32)ProcessorInfoBuffer.ProcessorId;
|
||||
RegisterTable[Index].TableLength = 0;
|
||||
RegisterTable[Index].AllocatedSize = 0;
|
||||
RegisterTable[Index].RegisterTableEntry = 0;
|
||||
|
||||
RegisterTable[NumberOfCpus + Index].InitialApicId = (UINT32)ProcessorInfoBuffer.ProcessorId;
|
||||
RegisterTable[NumberOfCpus + Index].TableLength = 0;
|
||||
RegisterTable[NumberOfCpus + Index].AllocatedSize = 0;
|
||||
RegisterTable[NumberOfCpus + Index].RegisterTableEntry = 0;
|
||||
}
|
||||
if (AcpiCpuData->RegisterTable == 0) {
|
||||
AcpiCpuData->RegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;
|
||||
}
|
||||
if (AcpiCpuData->PreSmmInitRegisterTable == 0) {
|
||||
AcpiCpuData->PreSmmInitRegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);
|
||||
}
|
||||
}
|
||||
AcpiCpuData->RegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;
|
||||
AcpiCpuData->PreSmmInitRegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);
|
||||
|
||||
return AcpiCpuData;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue