]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/PiSmmCpuDxeSmm/SmramSaveState.c
UefiCpuPkg/PiSmm: Fix various typos
[mirror_edk2.git] / UefiCpuPkg / PiSmmCpuDxeSmm / SmramSaveState.c
index f0c289254330d3949a0f00dcd3fcc98818c13b9f..661cc51f361a2932495d31c71e3b849c153507d4 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
 Provides services to access SMRAM Save State Map\r
 \r
-Copyright (c) 2010 - 2017, 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
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -20,8 +14,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/SmmServicesTableLib.h>\r
 #include <Library/DebugLib.h>\r
-#include <Register/Cpuid.h>\r
-#include <Register/SmramSaveStateMap.h>\r
 \r
 #include "PiSmmCpuDxeSmm.h"\r
 \r
@@ -107,7 +99,7 @@ typedef struct {
 ///\r
 X86_ASSEMBLY_PATCH_LABEL gPatchSmbase;\r
 X86_ASSEMBLY_PATCH_LABEL gPatchSmiStack;\r
-extern UINT32            gSmiCr3;\r
+X86_ASSEMBLY_PATCH_LABEL gPatchSmiCr3;\r
 extern volatile UINT8    gcSmiHandlerTemplate[];\r
 extern CONST UINT16      gcSmiHandlerSize;\r
 \r
@@ -268,7 +260,7 @@ GetRegisterIndex (
 \r
   @retval EFI_SUCCESS           The register was read from Save State.\r
   @retval EFI_NOT_FOUND         The register is not defined for the Save State of Processor.\r
-  @retval EFI_INVALID_PARAMTER  This or Buffer is NULL.\r
+  @retval EFI_INVALID_PARAMETER  This or Buffer is NULL.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -351,7 +343,7 @@ ReadSaveStateRegisterByIndex (
 \r
   @retval EFI_SUCCESS           The register was read from Save State.\r
   @retval EFI_NOT_FOUND         The register is not defined for the Save State of Processor.\r
-  @retval EFI_INVALID_PARAMTER  This or Buffer is NULL.\r
+  @retval EFI_INVALID_PARAMETER  This or Buffer is NULL.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -366,7 +358,6 @@ ReadSaveStateRegister (
   UINT32                      SmmRevId;\r
   SMRAM_SAVE_STATE_IOMISC     IoMisc;\r
   EFI_SMM_SAVE_STATE_IO_INFO  *IoInfo;\r
-  VOID                        *IoMemAddr;\r
 \r
   //\r
   // Check for special EFI_SMM_SAVE_STATE_REGISTER_LMA\r
@@ -412,6 +403,14 @@ ReadSaveStateRegister (
       return EFI_NOT_FOUND;\r
     }\r
 \r
+    //\r
+    // Only support IN/OUT, but not INS/OUTS/REP INS/REP OUTS.\r
+    //\r
+    if ((mSmmCpuIoType[IoMisc.Bits.Type] != EFI_SMM_SAVE_STATE_IO_TYPE_INPUT) &&\r
+        (mSmmCpuIoType[IoMisc.Bits.Type] != EFI_SMM_SAVE_STATE_IO_TYPE_OUTPUT)) {\r
+      return EFI_NOT_FOUND;\r
+    }\r
+\r
     //\r
     // Compute index for the I/O Length and I/O Type lookup tables\r
     //\r
@@ -431,13 +430,7 @@ ReadSaveStateRegister (
     IoInfo->IoPort = (UINT16)IoMisc.Bits.Port;\r
     IoInfo->IoWidth = mSmmCpuIoWidth[IoMisc.Bits.Length].IoWidth;\r
     IoInfo->IoType = mSmmCpuIoType[IoMisc.Bits.Type];\r
-    if (IoInfo->IoType == EFI_SMM_SAVE_STATE_IO_TYPE_INPUT || IoInfo->IoType == EFI_SMM_SAVE_STATE_IO_TYPE_OUTPUT) {\r
-      ReadSaveStateRegister (CpuIndex, EFI_SMM_SAVE_STATE_REGISTER_RAX, mSmmCpuIoWidth[IoMisc.Bits.Length].Width, &IoInfo->IoData);\r
-    }\r
-    else {\r
-      ReadSaveStateRegisterByIndex(CpuIndex, SMM_SAVE_STATE_REGISTER_IOMEMADDR_INDEX, sizeof(IoMemAddr), &IoMemAddr);\r
-      CopyMem(&IoInfo->IoData, IoMemAddr, mSmmCpuIoWidth[IoMisc.Bits.Length].Width);\r
-    }\r
+    ReadSaveStateRegister (CpuIndex, EFI_SMM_SAVE_STATE_REGISTER_RAX, mSmmCpuIoWidth[IoMisc.Bits.Length].Width, &IoInfo->IoData);\r
     return EFI_SUCCESS;\r
   }\r
 \r
@@ -462,7 +455,7 @@ ReadSaveStateRegister (
 \r
   @retval EFI_SUCCESS           The register was written to Save State.\r
   @retval EFI_NOT_FOUND         The register is not defined for the Save State of Processor.\r
-  @retval EFI_INVALID_PARAMTER  ProcessorIndex or Width is not correct.\r
+  @retval EFI_INVALID_PARAMETER  ProcessorIndex or Width is not correct.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -714,12 +707,14 @@ InstallSmiHandler (
     return;\r
   }\r
 \r
+  InitShadowStack (CpuIndex, (VOID *)((UINTN)SmiStack + StackSize));\r
+\r
   //\r
   // Initialize values in template before copy\r
   //\r
   CpuSmiStack = (UINT32)((UINTN)SmiStack + StackSize - sizeof (UINTN));\r
   PatchInstructionX86 (gPatchSmiStack, CpuSmiStack, 4);\r
-  gSmiCr3               = Cr3;\r
+  PatchInstructionX86 (gPatchSmiCr3, Cr3, 4);\r
   PatchInstructionX86 (gPatchSmbase, SmBase, 4);\r
   gSmiHandlerIdtr.Base  = IdtBase;\r
   gSmiHandlerIdtr.Limit = (UINT16)(IdtSize - 1);\r