| /** @file | |
| SMRAM Save State Map header file. | |
| Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR> | |
| Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #ifndef MM_SAVESTATE_H_ | |
| #define MM_SAVESTATE_H_ | |
| #include <Uefi/UefiBaseType.h> | |
| #include <Protocol/MmCpu.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/MmSaveStateLib.h> | |
| #include <Library/MmServicesTableLib.h> | |
| #include <Library/BaseMemoryLib.h> | |
| // Macro used to simplify the lookup table entries of type CPU_MM_SAVE_STATE_REGISTER_RANGE | |
| #define MM_REGISTER_RANGE(Start, End) { Start, End, End - Start + 1 } | |
| // Structure used to describe a range of registers | |
| typedef struct { | |
| EFI_MM_SAVE_STATE_REGISTER Start; | |
| EFI_MM_SAVE_STATE_REGISTER End; | |
| UINTN Length; | |
| } CPU_MM_SAVE_STATE_REGISTER_RANGE; | |
| // Structure used to build a lookup table to retrieve the widths and offsets | |
| // associated with each supported EFI_MM_SAVE_STATE_REGISTER value | |
| typedef struct { | |
| UINT8 Width32; | |
| UINT8 Width64; | |
| UINT16 Offset32; | |
| UINT16 Offset64Lo; | |
| UINT16 Offset64Hi; | |
| BOOLEAN Writeable; | |
| } CPU_MM_SAVE_STATE_LOOKUP_ENTRY; | |
| /** | |
| Returns LMA value of the Processor. | |
| @retval UINT8 returns LMA bit value. | |
| **/ | |
| UINT8 | |
| MmSaveStateGetRegisterLma ( | |
| VOID | |
| ); | |
| /** | |
| Read information from the CPU save state. | |
| @param Register Specifies the CPU register to read form the save state. | |
| @param RegOffset Offset for the next register index. | |
| @retval 0 Register is not valid | |
| @retval >0 Index into mCpuWidthOffset[] associated with Register | |
| **/ | |
| UINTN | |
| MmSaveStateGetRegisterIndex ( | |
| IN EFI_MM_SAVE_STATE_REGISTER Register, | |
| IN UINTN RegOffset | |
| ); | |
| /** | |
| Read a CPU Save State register on the target processor. | |
| This function abstracts the differences that whether the CPU Save State register is in the | |
| IA32 CPU Save State Map or X64 CPU Save State Map. | |
| This function supports reading a CPU Save State register in SMBase relocation handler. | |
| @param[in] CpuIndex Specifies the zero-based index of the CPU save state. | |
| @param[in] RegisterIndex Index into mCpuWidthOffset[] look up table. | |
| @param[in] Width The number of bytes to read from the CPU save state. | |
| @param[out] Buffer Upon return, this holds the CPU register value read from the save state. | |
| @retval EFI_SUCCESS The register was read from Save State. | |
| @retval EFI_NOT_FOUND The register is not defined for the Save State of Processor. | |
| @retval EFI_INVALID_PARAMTER This or Buffer is NULL. | |
| **/ | |
| EFI_STATUS | |
| MmSaveStateReadRegisterByIndex ( | |
| IN UINTN CpuIndex, | |
| IN UINTN RegisterIndex, | |
| IN UINTN Width, | |
| OUT VOID *Buffer | |
| ); | |
| #endif |