Each one of the "PreSmmInitRegisterTable" and "RegisterTable" fields in
ACPI_CPU_DATA is a pointer to an array of CPU_REGISTER_TABLE objects; one
object per logical processor. Each table carries a variable number of
CPU_REGISTER_TABLE_ENTRY objects; each entry prescribes a specific
register setting for the CPU whose CPU_REGISTER_TABLE the entry is in.
Such entries are added to the tables with the following CpuConfigLib
functions:
- WriteRegisterTableEx(): internal helper,
- WriteRegisterTable(): public function for RegisterTable,
- WritePreSmmInitRegisterTable(): public function for
PreSmmInitRegisterTable.
* The driver
Quark_EDKII_v1.1.0/IA32FamilyCpuBasePkg/CpuMpDxe/
allocates the array of CPU_REGISTER_TABLEs in AcpiNVS for
ACPI_CPU_DATA.PreSmmInitRegisterTable, and sets the InitialApicID field
of each table object. (This is then later used by PiSmmCpuDxeSmm to
match a table against a logical CPU.)
However, CpuMpDxe never actually adds any register entries to any
processor's table in the PreSmmInitRegisterTable, either with
WritePreSmmInitRegisterTable(), or manually.
* CpuMpDxe is theoretically capable of adding register entries (MSR, CRn
changes etc) to the elements of the array pointed-to by
ACPI_CPU_DATA.RegisterTable. See the following call tree in CpuMpDxe:
ProduceRegisterTable()
MaxCpuidLimitReg()
WriteRegisterTable(
..., MSR_IA32_MISC_ENABLE, N_MSR_LIMIT_CPUID_MAXVAL, ...
)
XdReg()
WriteRegisterTable(
..., MSR_IA32_MISC_ENABLE, N_MSR_XD_BIT_DISABLE, ...
)
However, both MaxCpuidLimitReg() and XdReg() are gated by feature PCDs;
we'll just consider those disabled.
Therefore, we'll explicitly instruct PiSmmCpuDxeSmm to do nothing in
response to these tables: we allocate both arrays, but leave them
zero-filled.
That will short-circuit the processing in PiSmmCpuDxeSmm for most logical
CPUs, in the
(RegisterTableList[Index].InitialApicId == InitApicId)
checks. And when those checks don't fail, and SetProcessorRegister() gets
called, then the
RegisterTable->TableLength == 0
equality will short-circuit that function.
Suggested-by: Michael Kinney <[email protected]>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <[email protected]>
---
Notes:
v2:
- This patch replaces the following v1 patches:
- OvmfPkg: QuarkPort: drop ACPI_CPU_DATA.PreSmmInitRegisterTable
- OvmfPkg: QuarkPort: drop ACPI_CPU_DATA.RegisterTable
It intends to have the same effect, but without modifying the
ACPI_CPU_DATA structure, or PiSmmCpuDxeSmm.
OvmfPkg/QuarkPort/CpuS3DataDxe/ProcessorConfig.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/OvmfPkg/QuarkPort/CpuS3DataDxe/ProcessorConfig.c
b/OvmfPkg/QuarkPort/CpuS3DataDxe/ProcessorConfig.c
index 25ac8b1..1f4a081 100644
--- a/OvmfPkg/QuarkPort/CpuS3DataDxe/ProcessorConfig.c
+++ b/OvmfPkg/QuarkPort/CpuS3DataDxe/ProcessorConfig.c
@@ -57,6 +57,9 @@ PrepareMemoryForConfiguration (
VOID
)
{
+ UINTN NumberOfProcessors;
+ UINTN RegisterTableSize;
+
//
// Claim memory for AP stack.
//
@@ -64,6 +67,17 @@ PrepareMemoryForConfiguration (
PcdGet32 (PcdCpuMaxLogicalProcessorNumber) *
PcdGet32 (PcdCpuApStackSize)
);
+
+ //
+ // OVMF port note: leaving these tables zero-filled tells PiSmmCpuDxeSmm that
+ // there is no work to do.
+ //
+ NumberOfProcessors = mCpuConfigConextBuffer.NumberOfProcessors;
+ RegisterTableSize = sizeof (CPU_REGISTER_TABLE) * NumberOfProcessors;
+ mCpuConfigConextBuffer.RegisterTable =
+ AllocateAcpiNvsMemoryBelow4G (RegisterTableSize);
+ mCpuConfigConextBuffer.PreSmmInitRegisterTable =
+ AllocateAcpiNvsMemoryBelow4G (RegisterTableSize);
}
/**
@@ -294,6 +308,12 @@ SaveCpuS3Data (
mAcpiCpuData->StackSize = PcdGet32 (PcdCpuApStackSize);
mAcpiCpuData->MtrrTable = (EFI_PHYSICAL_ADDRESS)(UINTN)MtrrSettings;
+ mAcpiCpuData->RegisterTable =
+ (EFI_PHYSICAL_ADDRESS)(UINTN)mCpuConfigConextBuffer.RegisterTable;
+ mAcpiCpuData->PreSmmInitRegisterTable =
+ (EFI_PHYSICAL_ADDRESS)(UINTN)
+ mCpuConfigConextBuffer.PreSmmInitRegisterTable;
+
mAcpiCpuData->ApMachineCheckHandlerBase = mApMachineCheckHandlerBase;
mAcpiCpuData->ApMachineCheckHandlerSize = mApMachineCheckHandlerSize;
--
1.8.3.1
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel