From e09b6b5953db38db87b84c80a2e95a82a1c91020 Mon Sep 17 00:00:00 2001 From: Jian J Wang Date: Mon, 3 Sep 2018 10:47:54 +0800 Subject: UefiCpuPkg/MpInitLib: fix register restore issue in AP wakeup The conflict issues are introduced by Stack Guard feature enabled for PEI. The first is CR0 which should be restored after CR3 and CR4. Another is TR which should not be passed from BSP to AP during init phase. Cc: Eric Dong Cc: Laszlo Ersek Cc: Ruiyu Ni Cc: Jiewen Yao Cc: Star Zeng Cc: "Ware, Ryan R" Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Jian J Wang Regression-tested-by: Laszlo Ersek Reviewed-by: Eric Dong --- UefiCpuPkg/Library/MpInitLib/MpLib.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'UefiCpuPkg/Library') diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index 5c562d4..85ca4a2 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -217,9 +217,9 @@ RestoreVolatileRegisters ( CPUID_VERSION_INFO_EDX VersionInfoEdx; IA32_TSS_DESCRIPTOR *Tss; - AsmWriteCr0 (VolatileRegisters->Cr0); AsmWriteCr3 (VolatileRegisters->Cr3); AsmWriteCr4 (VolatileRegisters->Cr4); + AsmWriteCr0 (VolatileRegisters->Cr0); if (IsRestoreDr) { AsmCpuid (CPUID_VERSION_INFO, NULL, NULL, NULL, &VersionInfoEdx.Uint32); @@ -1558,7 +1558,7 @@ MpInitLibInitialize ( ApLoopMode = GetApLoopMode (&MonitorFilterSize); // - // Save BSP's Control registers for APs + // Save BSP's Control registers for APs. // SaveVolatileRegisters (&VolatileRegisters); @@ -1656,6 +1656,10 @@ MpInitLibInitialize ( // CopyMem ((VOID *)ApIdtBase, (VOID *)VolatileRegisters.Idtr.Base, VolatileRegisters.Idtr.Limit + 1); VolatileRegisters.Idtr.Base = ApIdtBase; + // + // Don't pass BSP's TR to APs to avoid AP init failure. + // + VolatileRegisters.Tr = 0; CopyMem (&CpuMpData->CpuData[0].VolatileRegisters, &VolatileRegisters, sizeof (VolatileRegisters)); // // Set BSP basic information -- cgit v1.1