UefiCpuPkg/PiSmmCpuDxeSmm: patch "gSmiStack" with PatchInstructionX86()
[mirror_edk2.git] / UefiCpuPkg / PiSmmCpuDxeSmm / SmramSaveState.c
index 3188d438181ccbed40e9d981e62dd4b8dfe792a9..f0c289254330d3949a0f00dcd3fcc98818c13b9f 100644 (file)
@@ -105,11 +105,11 @@ typedef struct {
 ///\r
 /// Variables from SMI Handler\r
 ///\r
-extern UINT32           gSmbase;\r
-extern volatile UINT32  gSmiStack;\r
-extern UINT32           gSmiCr3;\r
-extern volatile UINT8   gcSmiHandlerTemplate[];\r
-extern CONST UINT16     gcSmiHandlerSize;\r
+X86_ASSEMBLY_PATCH_LABEL gPatchSmbase;\r
+X86_ASSEMBLY_PATCH_LABEL gPatchSmiStack;\r
+extern UINT32            gSmiCr3;\r
+extern volatile UINT8    gcSmiHandlerTemplate[];\r
+extern CONST UINT16      gcSmiHandlerSize;\r
 \r
 //\r
 // Variables used by SMI Handler\r
@@ -686,6 +686,7 @@ InstallSmiHandler (
   )\r
 {\r
   PROCESSOR_SMM_DESCRIPTOR  *Psd;\r
+  UINT32                    CpuSmiStack;\r
 \r
   //\r
   // Initialize PROCESSOR_SMM_DESCRIPTOR\r
@@ -716,16 +717,17 @@ InstallSmiHandler (
   //\r
   // Initialize values in template before copy\r
   //\r
-  gSmiStack             = (UINT32)((UINTN)SmiStack + StackSize - sizeof (UINTN));\r
+  CpuSmiStack = (UINT32)((UINTN)SmiStack + StackSize - sizeof (UINTN));\r
+  PatchInstructionX86 (gPatchSmiStack, CpuSmiStack, 4);\r
   gSmiCr3               = Cr3;\r
-  gSmbase               = SmBase;\r
+  PatchInstructionX86 (gPatchSmbase, SmBase, 4);\r
   gSmiHandlerIdtr.Base  = IdtBase;\r
   gSmiHandlerIdtr.Limit = (UINT16)(IdtSize - 1);\r
 \r
   //\r
   // Set the value at the top of the CPU stack to the CPU Index\r
   //\r
-  *(UINTN*)(UINTN)gSmiStack = CpuIndex;\r
+  *(UINTN*)(UINTN)CpuSmiStack = CpuIndex;\r
 \r
   //\r
   // Copy template to CPU specific SMI handler location\r