/** @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
#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
///\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
\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
\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
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
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
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
\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
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