UefiCpuPkg/MpInitLib: Copy SEV-ES save area pointer during APIC ID sorting

With SEV-SNP, the SEV-ES save area for a vCPU should be unique to that
vCPU. After commit 3323359a81, the VMSA allocation was re-used, but when
sorting the CPUs by APIC ID, the save area was not updated to follow the
original CPU. Similar to the StartupApSignal address, the SevEsSaveArea
address should be updated when sorting the CPUs.

This does not cause an issue at this time because all APs are in HLT state
and then are (re)started at the same time, with the same VMSA contents.
However, this should be fixed to account for any change in future
behavior.

Fixes: 3323359a81 ("UefiCpuPkg/MpInitLib: Reuse VMSA allocation to ...")
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
This commit is contained in:
Tom Lendacky 2023-11-07 06:45:31 +08:00 committed by mergify[bot]
parent 447798cd3a
commit 3c5f9ac5c3
1 changed files with 7 additions and 1 deletions

View File

@ -370,6 +370,7 @@ SortApicId (
UINT32 ApCount; UINT32 ApCount;
CPU_INFO_IN_HOB *CpuInfoInHob; CPU_INFO_IN_HOB *CpuInfoInHob;
volatile UINT32 *StartupApSignal; volatile UINT32 *StartupApSignal;
VOID *SevEsSaveArea;
ApCount = CpuMpData->CpuCount - 1; ApCount = CpuMpData->CpuCount - 1;
CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob; CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob;
@ -397,12 +398,17 @@ SortApicId (
CopyMem (&CpuInfoInHob[Index1], &CpuInfo, sizeof (CPU_INFO_IN_HOB)); CopyMem (&CpuInfoInHob[Index1], &CpuInfo, sizeof (CPU_INFO_IN_HOB));
// //
// Also exchange the StartupApSignal. // Also exchange the StartupApSignal and SevEsSaveArea.
// //
StartupApSignal = CpuMpData->CpuData[Index3].StartupApSignal; StartupApSignal = CpuMpData->CpuData[Index3].StartupApSignal;
CpuMpData->CpuData[Index3].StartupApSignal = CpuMpData->CpuData[Index3].StartupApSignal =
CpuMpData->CpuData[Index1].StartupApSignal; CpuMpData->CpuData[Index1].StartupApSignal;
CpuMpData->CpuData[Index1].StartupApSignal = StartupApSignal; CpuMpData->CpuData[Index1].StartupApSignal = StartupApSignal;
SevEsSaveArea = CpuMpData->CpuData[Index3].SevEsSaveArea;
CpuMpData->CpuData[Index3].SevEsSaveArea =
CpuMpData->CpuData[Index1].SevEsSaveArea;
CpuMpData->CpuData[Index1].SevEsSaveArea = SevEsSaveArea;
} }
} }