mirror of https://github.com/acidanthera/audk.git
95 lines
2.8 KiB
C
95 lines
2.8 KiB
C
/** @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
|