]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Enhance the SmmBaseHelper driver to support changing SMBASE/IORestart/AutoHALTRestart...
authorrsun3 <rsun3@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 30 Aug 2011 09:12:43 +0000 (09:12 +0000)
committerrsun3 <rsun3@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 30 Aug 2011 09:12:43 +0000 (09:12 +0000)
Signed-off-by: rsun3
Reviewed-by: jfan12
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12230 6f19259b-4bc3-4df7-8a09-765794883524

EdkCompatibilityPkg/Compatibility/SmmBaseHelper/SmmBaseHelper.c

index 83647b997358082264f290c1813e32c2d991bfa3..99dccab8e9f7d7803a60a1c39d7701e64814d413 100644 (file)
@@ -4,7 +4,7 @@
   This driver is the counterpart of the SMM Base On SMM Base2 Thunk driver. It\r
   provides helping services in SMM to the SMM Base On SMM Base2 Thunk driver.\r
 \r
-  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -144,17 +144,13 @@ ReadCpuSaveState (
     SaveState = &mFrameworkSmst->CpuSaveState[CpuIndex].Ia32SaveState;\r
   }\r
 \r
-  if (State->x86.SMMRevId < EFI_SMM_MIN_REV_ID_x64) {\r
-    SaveState->SMBASE = State->x86.SMBASE;\r
-    SaveState->SMMRevId = State->x86.SMMRevId;\r
-    SaveState->IORestart = State->x86.IORestart;\r
-    SaveState->AutoHALTRestart = State->x86.AutoHALTRestart;\r
-  } else {\r
-    SaveState->SMBASE = State->x64.SMBASE;\r
-    SaveState->SMMRevId = State->x64.SMMRevId;\r
-    SaveState->IORestart = State->x64.IORestart;\r
-    SaveState->AutoHALTRestart = State->x64.AutoHALTRestart;\r
-  }\r
+  //\r
+  // Note that SMBASE/SMMRevId/IORestart/AutoHALTRestart are in same location in IA32 and X64 CPU Save State Map.\r
+  //\r
+  SaveState->SMBASE = State->x86.SMBASE;\r
+  SaveState->SMMRevId = State->x86.SMMRevId;\r
+  SaveState->IORestart = State->x86.IORestart;\r
+  SaveState->AutoHALTRestart = State->x86.AutoHALTRestart;\r
 \r
   for (Index = 0; Index < sizeof (mCpuSaveStateConvTable) / sizeof (CPU_SAVE_STATE_CONVERSION); Index++) {\r
     ///\r
@@ -188,15 +184,26 @@ WriteCpuSaveState (
   IN EFI_SMM_CPU_SAVE_STATE  *ToWrite\r
   )\r
 {\r
-  EFI_STATUS Status;\r
-  UINTN      Index;\r
+  EFI_STATUS             Status;\r
+  UINTN                  Index;\r
+  EFI_SMM_CPU_STATE      *State;\r
   EFI_SMI_CPU_SAVE_STATE *SaveState;\r
 \r
+  State = (EFI_SMM_CPU_STATE *)gSmst->CpuSaveState[CpuIndex];\r
+\r
   if (ToWrite != NULL) {\r
     SaveState = &ToWrite->Ia32SaveState;\r
   } else {\r
     SaveState = &mFrameworkSmst->CpuSaveState[CpuIndex].Ia32SaveState;\r
   }\r
+\r
+  //\r
+  // SMMRevId is read-only.\r
+  // Note that SMBASE/IORestart/AutoHALTRestart are in same location in IA32 and X64 CPU Save State Map.\r
+  //\r
+  State->x86.SMBASE = SaveState->SMBASE;\r
+  State->x86.IORestart = SaveState->IORestart;\r
+  State->x86.AutoHALTRestart = SaveState->AutoHALTRestart;\r
   \r
   for (Index = 0; Index < sizeof (mCpuSaveStateConvTable) / sizeof (CPU_SAVE_STATE_CONVERSION); Index++) {\r
     Status = mSmmCpu->WriteSaveState (\r