blob: 0607d2a1914521dd4fef9703e8be1f206caa8c4d [file] [log] [blame]
/** @file
AMD SMRAM Save State Map Definitions.
SMRAM Save State Map definitions based on contents of the
AMD64 Architecture Programmer Manual:
Volume 2, System Programming, Section 10.2 SMM Resources
Copyright (c) 2015 - 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 AMD_SMRAM_SAVE_STATE_MAP_H_
#define AMD_SMRAM_SAVE_STATE_MAP_H_
///
/// Default SMBASE address
///
#define SMM_DEFAULT_SMBASE 0x30000
///
/// Offset of SMM handler from SMBASE
///
#define SMM_HANDLER_OFFSET 0x8000
// SMM-Revision Identifier for AMD64 Architecture.
#define AMD_SMM_MIN_REV_ID_X64 0x30064
#pragma pack (1)
///
/// 32-bit SMRAM Save State Map
///
typedef struct {
// Padded an extra 0x200 bytes to match Intel/EDK2
UINT8 Reserved[0x200]; // fc00h
// AMD Save State area starts @ 0xfe00
UINT8 Reserved1[0xf8]; // fe00h
UINT32 SMBASE; // fef8h
UINT32 SMMRevId; // fefch
UINT16 IORestart; // ff00h
UINT16 AutoHALTRestart; // ff02h
UINT8 Reserved2[0x84]; // ff04h
UINT32 GDTBase; // ff88h
UINT64 Reserved3; // ff8ch
UINT32 IDTBase; // ff94h
UINT8 Reserved4[0x10]; // ff98h
UINT32 _ES; // ffa8h
UINT32 _CS; // ffach
UINT32 _SS; // ffb0h
UINT32 _DS; // ffb4h
UINT32 _FS; // ffb8h
UINT32 _GS; // ffbch
UINT32 LDTBase; // ffc0h
UINT32 _TR; // ffc4h
UINT32 _DR7; // ffc8h
UINT32 _DR6; // ffcch
UINT32 _EAX; // ffd0h
UINT32 _ECX; // ffd4h
UINT32 _EDX; // ffd8h
UINT32 _EBX; // ffdch
UINT32 _ESP; // ffe0h
UINT32 _EBP; // ffe4h
UINT32 _ESI; // ffe8h
UINT32 _EDI; // ffech
UINT32 _EIP; // fff0h
UINT32 _EFLAGS; // fff4h
UINT32 _CR3; // fff8h
UINT32 _CR0; // fffch
} AMD_SMRAM_SAVE_STATE_MAP32;
///
/// 64-bit SMRAM Save State Map
///
typedef struct {
// Padded an extra 0x200 bytes to match Intel/EDK2
UINT8 Reserved[0x200]; // fc00h
// AMD Save State area starts @ 0xfe00
UINT16 _ES; // fe00h
UINT16 _ESAttributes; // fe02h
UINT32 _ESLimit; // fe04h
UINT64 _ESBase; // fe08h
UINT16 _CS; // fe10h
UINT16 _CSAttributes; // fe12h
UINT32 _CSLimit; // fe14h
UINT64 _CSBase; // fe18h
UINT16 _SS; // fe20h
UINT16 _SSAttributes; // fe22h
UINT32 _SSLimit; // fe24h
UINT64 _SSBase; // fe28h
UINT16 _DS; // fe30h
UINT16 _DSAttributes; // fe32h
UINT32 _DSLimit; // fe34h
UINT64 _DSBase; // fe38h
UINT16 _FS; // fe40h
UINT16 _FSAttributes; // fe42h
UINT32 _FSLimit; // fe44h
UINT64 _FSBase; // fe48h
UINT16 _GS; // fe50h
UINT16 _GSAttributes; // fe52h
UINT32 _GSLimit; // fe54h
UINT64 _GSBase; // fe58h
UINT32 _GDTRReserved1; // fe60h
UINT16 _GDTRLimit; // fe64h
UINT16 _GDTRReserved2; // fe66h
// UINT64 _GDTRBase; // fe68h
UINT32 _GDTRBaseLoDword;
UINT32 _GDTRBaseHiDword;
UINT16 _LDTR; // fe70h
UINT16 _LDTRAttributes; // fe72h
UINT32 _LDTRLimit; // fe74h
// UINT64 _LDTRBase; // fe78h
UINT32 _LDTRBaseLoDword;
UINT32 _LDTRBaseHiDword;
UINT32 _IDTRReserved1; // fe80h
UINT16 _IDTRLimit; // fe84h
UINT16 _IDTRReserved2; // fe86h
// UINT64 _IDTRBase; // fe88h
UINT32 _IDTRBaseLoDword;
UINT32 _IDTRBaseHiDword;
UINT16 _TR; // fe90h
UINT16 _TRAttributes; // fe92h
UINT32 _TRLimit; // fe94h
UINT64 _TRBase; // fe98h
UINT64 IO_RIP; // fea0h
UINT64 IO_RCX; // fea8h
UINT64 IO_RSI; // feb0h
UINT64 IO_RDI; // feb8h
UINT32 IO_DWord; // fec0h
UINT8 Reserved1[0x04]; // fec4h
UINT8 IORestart; // fec8h
UINT8 AutoHALTRestart; // fec9h
UINT8 Reserved2[0x06]; // fecah
UINT64 EFER; // fed0h
UINT64 SVM_Guest; // fed8h
UINT64 SVM_GuestVMCB; // fee0h
UINT64 SVM_GuestVIntr; // fee8h
UINT8 Reserved3[0x0c]; // fef0h
UINT32 SMMRevId; // fefch
UINT32 SMBASE; // ff00h
UINT8 Reserved4[0x14]; // ff04h
UINT64 SSP; // ff18h
UINT64 SVM_GuestPAT; // ff20h
UINT64 SVM_HostEFER; // ff28h
UINT64 SVM_HostCR4; // ff30h
UINT64 SVM_HostCR3; // ff38h
UINT64 SVM_HostCR0; // ff40h
UINT64 _CR4; // ff48h
UINT64 _CR3; // ff50h
UINT64 _CR0; // ff58h
UINT64 _DR7; // ff60h
UINT64 _DR6; // ff68h
UINT64 _RFLAGS; // ff70h
UINT64 _RIP; // ff78h
UINT64 _R15; // ff80h
UINT64 _R14; // ff88h
UINT64 _R13; // ff90h
UINT64 _R12; // ff98h
UINT64 _R11; // ffa0h
UINT64 _R10; // ffa8h
UINT64 _R9; // ffb0h
UINT64 _R8; // ffb8h
UINT64 _RDI; // ffc0h
UINT64 _RSI; // ffc8h
UINT64 _RBP; // ffd0h
UINT64 _RSP; // ffd8h
UINT64 _RBX; // ffe0h
UINT64 _RDX; // ffe8h
UINT64 _RCX; // fff0h
UINT64 _RAX; // fff8h
} AMD_SMRAM_SAVE_STATE_MAP64;
///
/// Union of 32-bit and 64-bit SMRAM Save State Maps
///
typedef union {
AMD_SMRAM_SAVE_STATE_MAP32 x86;
AMD_SMRAM_SAVE_STATE_MAP64 x64;
} AMD_SMRAM_SAVE_STATE_MAP;
#pragma pack ()
#endif