]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/CpuMpPei: Add CPU_VOLATILE_REGISTERS & worker functions
authorJeff Fan <jeff.fan@intel.com>
Wed, 2 Dec 2015 00:42:40 +0000 (00:42 +0000)
committervanjeff <vanjeff@Edk2>
Wed, 2 Dec 2015 00:42:40 +0000 (00:42 +0000)
Add CPU_VOLATILE_REGISTERS definitions for CRx and DRx required to be restored
after APs received INIT IPI.

Add worker functions SaveVolatileRegisters()/RestoreVolatileRegisters() used to
save/restore CRx and DRx. It also check if Debugging Extensions supported or
not.

Cc: Feng Tian <feng.tian@intel.com>
Cc: Michael Kinney <michael.d.kinney@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Feng Tian <feng.tian@Intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19086 6f19259b-4bc3-4df7-8a09-765794883524

UefiCpuPkg/CpuMpPei/CpuMpPei.c
UefiCpuPkg/CpuMpPei/CpuMpPei.h

index ae071ac1f81abaab4d8d8c9342821412df4aeb9d..7bedf64210910aae946e51d5e1f2b1a583a4331b 100644 (file)
@@ -141,6 +141,73 @@ GetMpHobData (
   return CpuMpData;\r
 }\r
 \r
   return CpuMpData;\r
 }\r
 \r
+/**\r
+  Save the volatile registers required to be restored following INIT IPI\r
+  \r
+  @param  VolatileRegisters    Returns buffer saved the volatile resisters\r
+**/\r
+VOID\r
+SaveVolatileRegisters (\r
+  OUT CPU_VOLATILE_REGISTERS    *VolatileRegisters\r
+  )\r
+{\r
+  UINT32                        RegEdx;\r
+\r
+  VolatileRegisters->Cr0 = AsmReadCr0 ();\r
+  VolatileRegisters->Cr3 = AsmReadCr3 ();\r
+  VolatileRegisters->Cr4 = AsmReadCr4 ();\r
+\r
+  AsmCpuid (CPUID_VERSION_INFO, NULL, NULL, NULL, &RegEdx);\r
+  if ((RegEdx & BIT2) != 0) {\r
+    //\r
+    // If processor supports Debugging Extensions feature\r
+    // by CPUID.[EAX=01H]:EDX.BIT2\r
+    //\r
+    VolatileRegisters->Dr0 = AsmReadDr0 ();\r
+    VolatileRegisters->Dr1 = AsmReadDr1 ();\r
+    VolatileRegisters->Dr2 = AsmReadDr2 ();\r
+    VolatileRegisters->Dr3 = AsmReadDr3 ();\r
+    VolatileRegisters->Dr6 = AsmReadDr6 ();\r
+    VolatileRegisters->Dr7 = AsmReadDr7 ();\r
+  }\r
+}\r
+\r
+/**\r
+  Restore the volatile registers following INIT IPI\r
+  \r
+  @param  VolatileRegisters   Pointer to volatile resisters\r
+  @param  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
+  UINT32                        RegEdx;\r
+\r
+  AsmWriteCr0 (VolatileRegisters->Cr0);\r
+  AsmWriteCr3 (VolatileRegisters->Cr3);\r
+  AsmWriteCr4 (VolatileRegisters->Cr4);\r
+\r
+  if (IsRestoreDr) {\r
+    AsmCpuid (CPUID_VERSION_INFO, NULL, NULL, NULL, &RegEdx);\r
+    if ((RegEdx & BIT2) != 0) {\r
+      //\r
+      // If processor supports Debugging Extensions feature\r
+      // by CPUID.[EAX=01H]:EDX.BIT2\r
+      //\r
+      AsmWriteDr0 (VolatileRegisters->Dr0);\r
+      AsmWriteDr1 (VolatileRegisters->Dr1);\r
+      AsmWriteDr2 (VolatileRegisters->Dr2);\r
+      AsmWriteDr3 (VolatileRegisters->Dr3);\r
+      AsmWriteDr6 (VolatileRegisters->Dr6);\r
+      AsmWriteDr7 (VolatileRegisters->Dr7);\r
+    }\r
+  }\r
+}\r
+\r
 /**\r
   This function will be called from AP reset code if BSP uses WakeUpAP.\r
 \r
 /**\r
   This function will be called from AP reset code if BSP uses WakeUpAP.\r
 \r
index de9011329c0855d6cd595973d6fa60e5b18f7a1a..f2286b990ee9181b5377b5aece474e7ffbe96416 100644 (file)
@@ -113,11 +113,24 @@ typedef struct {
 \r
 #pragma pack()\r
 \r
 \r
 #pragma pack()\r
 \r
+typedef struct {\r
+  UINTN                          Cr0;\r
+  UINTN                          Cr3;\r
+  UINTN                          Cr4;\r
+  UINTN                          Dr0;\r
+  UINTN                          Dr1;\r
+  UINTN                          Dr2;\r
+  UINTN                          Dr3;\r
+  UINTN                          Dr6;\r
+  UINTN                          Dr7;\r
+} CPU_VOLATILE_REGISTERS;\r
+\r
 typedef struct {\r
   UINT32                         ApicId;\r
   EFI_HEALTH_FLAGS               Health;\r
   CPU_STATE                      State;\r
   BOOLEAN                        CpuHealthy;\r
 typedef struct {\r
   UINT32                         ApicId;\r
   EFI_HEALTH_FLAGS               Health;\r
   CPU_STATE                      State;\r
   BOOLEAN                        CpuHealthy;\r
+  CPU_VOLATILE_REGISTERS         VolatileRegisters;\r
 } PEI_CPU_DATA;\r
 \r
 //\r
 } PEI_CPU_DATA;\r
 \r
 //\r