]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/MpInitLib/MpLib.c
UefiCpuPkg/MpInitLib: Simplify logic in SwitchBsp
[mirror_edk2.git] / UefiCpuPkg / Library / MpInitLib / MpLib.c
index 8d1f24370a3636e6e936b5df1a4a42fddc5cdbee..041a32e6591234a91a7662de2d44b3a4b72d1e44 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   CPU MP Initialize Library common functions.\r
 \r
-  Copyright (c) 2016 - 2021, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2016 - 2022, Intel Corporation. All rights reserved.<BR>\r
   Copyright (c) 2020, AMD Inc. All rights reserved.<BR>\r
 \r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 EFI_GUID  mCpuInitMpLibHobGuid = CPU_INIT_MP_LIB_HOB_GUID;\r
 \r
+/**\r
+  Save the volatile registers required to be restored following INIT IPI.\r
+\r
+  @param[out]  VolatileRegisters    Returns buffer saved the volatile resisters\r
+**/\r
+VOID\r
+SaveVolatileRegisters (\r
+  OUT CPU_VOLATILE_REGISTERS  *VolatileRegisters\r
+  );\r
+\r
+/**\r
+  Restore the volatile registers following INIT IPI.\r
+\r
+  @param[in]  VolatileRegisters   Pointer to volatile resisters\r
+  @param[in]  IsRestoreDr         TRUE:  Restore DRx if supported\r
+                                  FALSE: Do not restore DRx\r
+**/\r
+VOID\r
+RestoreVolatileRegisters (\r
+  IN CPU_VOLATILE_REGISTERS  *VolatileRegisters,\r
+  IN BOOLEAN                 IsRestoreDr\r
+  );\r
+\r
 /**\r
   The function will check if BSP Execute Disable is enabled.\r
 \r
@@ -83,7 +106,12 @@ FutureBSPProc (
   CPU_MP_DATA  *DataInHob;\r
 \r
   DataInHob = (CPU_MP_DATA *)Buffer;\r
+  //\r
+  // Save and restore volatile registers when switch BSP\r
+  //\r
+  SaveVolatileRegisters (&DataInHob->APInfo.VolatileRegisters);\r
   AsmExchangeRole (&DataInHob->APInfo, &DataInHob->BSPInfo);\r
+  RestoreVolatileRegisters (&DataInHob->APInfo.VolatileRegisters, FALSE);\r
 }\r
 \r
 /**\r
@@ -2233,7 +2261,12 @@ SwitchBSPWorker (
   //\r
   WakeUpAP (CpuMpData, FALSE, ProcessorNumber, FutureBSPProc, CpuMpData, TRUE);\r
 \r
+  //\r
+  // Save and restore volatile registers when switch BSP\r
+  //\r
+  SaveVolatileRegisters (&CpuMpData->BSPInfo.VolatileRegisters);\r
   AsmExchangeRole (&CpuMpData->BSPInfo, &CpuMpData->APInfo);\r
+  RestoreVolatileRegisters (&CpuMpData->BSPInfo.VolatileRegisters, FALSE);\r
 \r
   //\r
   // Set the BSP bit of MSR_IA32_APIC_BASE on new BSP\r