PeiStartupAllAPs()/PeiStartupThisAP() will send INIT-SIPI-SIPI to wakeup APs to
execute AP function. However, some registers will be reset after APs received
INIT IPI. We need to restore some registers (For example, CRx/DRx) manually
after APs wakeup.

Cc: Feng Tian <[email protected]>
Cc: Michael Kinney <[email protected]>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <[email protected]>
---
 UefiCpuPkg/CpuMpPei/CpuMpPei.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.c b/UefiCpuPkg/CpuMpPei/CpuMpPei.c
index 53af948..ca48613 100644
--- a/UefiCpuPkg/CpuMpPei/CpuMpPei.c
+++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.c
@@ -259,6 +259,11 @@ ApCFunction (
     // Execute AP function if AP is not disabled
     //
     GetProcessorNumber (PeiCpuMpData, &ProcessorNumber);
+    //
+    // Restore AP's volatile registers saved
+    //
+    RestoreVolatileRegisters 
(&PeiCpuMpData->CpuData[ProcessorNumber].VolatileRegisters, TRUE);
+
     if ((PeiCpuMpData->CpuData[ProcessorNumber].State != CpuStateDisabled) &&
         (PeiCpuMpData->ApFunction != 0)) {
       PeiCpuMpData->CpuData[ProcessorNumber].State = CpuStateBusy;
@@ -273,6 +278,11 @@ ApCFunction (
   //
   InterlockedIncrement ((UINT32 *)&PeiCpuMpData->FinishedCount);
 
+  //
+  // Save AP volatile registers
+  //
+  SaveVolatileRegisters 
(&PeiCpuMpData->CpuData[ProcessorNumber].VolatileRegisters);
+
   AsmCliHltLoop ();
 }
 
-- 
1.9.5.msysgit.0

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to