]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg\CpuSmm: Save & restore CR2 on-demand paging in SMM
authorVanguput, Narendra K <narendra.k.vanguput@intel.com>
Mon, 1 Apr 2019 08:16:01 +0000 (16:16 +0800)
committerEric Dong <eric.dong@intel.com>
Thu, 4 Apr 2019 06:00:32 +0000 (14:00 +0800)
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1593

For every SMI occurrence, save and restore CR2 register only when SMM
on-demand paging support is enabled in 64 bit operation mode.
This is not a bug but to have better improvement of code.

Patch5 is updated with separate functions for Save and Restore of CR2
based on review feedback.

Patch6 - Removed Global Cr2 instead used function parameter.

Patch7 - Removed checking Cr2 with 0 as per feedback.

Patch8 and 9 - Aligned with EDK2 Coding style.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Vanguput Narendra K <narendra.k.vanguput@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Yao Jiewen <jiewen.yao@intel.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/PageTbl.c
UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c

index b734a1ea8c607f5ae30b60959d2e544949d245e4..d1e146a70cbaf60667dc7eb5032b4fe859b3e3f9 100644 (file)
@@ -316,3 +316,29 @@ SetPageTableAttributes (
 \r
   return ;\r
 }\r
+\r
+/**\r
+  This function returns with no action for 32 bit.\r
+\r
+  @param[out]  *Cr2  Pointer to variable to hold CR2 register value.\r
+**/\r
+VOID\r
+SaveCr2 (\r
+  OUT UINTN  *Cr2\r
+  )\r
+{\r
+  return ;\r
+}\r
+\r
+/**\r
+  This function returns with no action for 32 bit.\r
+\r
+  @param[in]  Cr2  Value to write into CR2 register.\r
+**/\r
+VOID\r
+RestoreCr2 (\r
+  IN UINTN  Cr2\r
+  )\r
+{\r
+  return ;\r
+}\r
index 3b0b3b52ac21b2b2a2eb6045ad4ca4024ca73381..ce70f777096eb3db79ae407087f5729cab7ffd69 100644 (file)
@@ -1112,9 +1112,11 @@ SmiRendezvous (
   ASSERT(CpuIndex < mMaxNumberOfCpus);\r
 \r
   //\r
-  // Save Cr2 because Page Fault exception in SMM may override its value\r
+  // Save Cr2 because Page Fault exception in SMM may override its value,\r
+  // when using on-demand paging for above 4G memory.\r
   //\r
-  Cr2 = AsmReadCr2 ();\r
+  Cr2 = 0;\r
+  SaveCr2 (&Cr2);\r
 \r
   //\r
   // Perform CPU specific entry hooks\r
@@ -1253,10 +1255,11 @@ SmiRendezvous (
 \r
 Exit:\r
   SmmCpuFeaturesRendezvousExit (CpuIndex);\r
+\r
   //\r
   // Restore Cr2\r
   //\r
-  AsmWriteCr2 (Cr2);\r
+  RestoreCr2 (Cr2);\r
 }\r
 \r
 /**\r
index 84efb229819b727628c8b583c7180cc828d798f4..38f91041179c8e64e8bf00f15ca599d17de1782c 100644 (file)
@@ -1243,4 +1243,26 @@ EFIAPI
 PiSmmCpuSmiEntryFixupAddress (\r
  );\r
 \r
+/**\r
+  This function reads CR2 register when on-demand paging is enabled\r
+  for 64 bit and no action for 32 bit.\r
+\r
+  @param[out]  *Cr2  Pointer to variable to hold CR2 register value.\r
+**/\r
+VOID\r
+SaveCr2 (\r
+  OUT UINTN  *Cr2\r
+  );\r
+\r
+/**\r
+  This function writes into CR2 register when on-demand paging is enabled\r
+  for 64 bit and no action for 32 bit.\r
+\r
+  @param[in]  Cr2  Value to write into CR2 register.\r
+**/\r
+VOID\r
+RestoreCr2 (\r
+  IN UINTN  Cr2\r
+  );\r
+\r
 #endif\r
index 2c77cb47a48a435913e13a4689ca03ca587ae24b..95eaf0b01653434867b3e9e676226db9af25569f 100644 (file)
@@ -1053,3 +1053,33 @@ SetPageTableAttributes (
 \r
   return ;\r
 }\r
+\r
+/**\r
+  This function reads CR2 register when on-demand paging is enabled.\r
+\r
+  @param[out]  *Cr2  Pointer to variable to hold CR2 register value.\r
+**/\r
+VOID\r
+SaveCr2 (\r
+  OUT UINTN  *Cr2\r
+  )\r
+{\r
+  if (!mCpuSmmStaticPageTable) {\r
+    *Cr2 = AsmReadCr2 ();\r
+  }\r
+}\r
+\r
+/**\r
+  This function restores CR2 register when on-demand paging is enabled.\r
+\r
+  @param[in]  Cr2  Value to write into CR2 register.\r
+**/\r
+VOID\r
+RestoreCr2 (\r
+  IN UINTN  Cr2\r
+  )\r
+{\r
+  if (!mCpuSmmStaticPageTable) {\r
+    AsmWriteCr2 (Cr2);\r
+  }\r
+}\r