mirror of https://github.com/acidanthera/audk.git
191 lines
5.5 KiB
C
191 lines
5.5 KiB
C
/** @file
|
|
SMRAM Save State Map Definitions.
|
|
|
|
SMRAM Save State Map definitions based on contents of the
|
|
Intel(R) 64 and IA-32 Architectures Software Developer's Manual
|
|
Volume 3C, Section 34.4 SMRAM
|
|
Volume 3C, Section 34.5 SMI Handler Execution Environment
|
|
Volume 3C, Section 34.7 Managing Synchronous and Asynchronous SMIs
|
|
|
|
Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
|
|
This program and the accompanying materials
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
**/
|
|
|
|
#ifndef __SMRAM_SAVE_STATE_MAP_H__
|
|
#define __SMRAM_SAVE_STATE_MAP_H__
|
|
|
|
///
|
|
/// Default SMBASE address
|
|
///
|
|
#define SMM_DEFAULT_SMBASE 0x30000
|
|
|
|
///
|
|
/// Offset of SMM handler from SMBASE
|
|
///
|
|
#define SMM_HANDLER_OFFSET 0x8000
|
|
|
|
///
|
|
/// Offset of SMRAM Save State Map from SMBASE
|
|
///
|
|
#define SMRAM_SAVE_STATE_MAP_OFFSET 0xfc00
|
|
|
|
#pragma pack (1)
|
|
|
|
///
|
|
/// 32-bit SMRAM Save State Map
|
|
///
|
|
typedef struct {
|
|
UINT8 Reserved[0x200]; // 7c00h
|
|
// Padded an extra 0x200 bytes so 32-bit and 64-bit
|
|
// SMRAM Save State Maps are the same size
|
|
UINT8 Reserved1[0xf8]; // 7e00h
|
|
UINT32 SMBASE; // 7ef8h
|
|
UINT32 SMMRevId; // 7efch
|
|
UINT16 IORestart; // 7f00h
|
|
UINT16 AutoHALTRestart; // 7f02h
|
|
UINT8 Reserved2[0x9C]; // 7f08h
|
|
UINT32 IOMemAddr; // 7fa0h
|
|
UINT32 IOMisc; // 7fa4h
|
|
UINT32 _ES; // 7fa8h
|
|
UINT32 _CS; // 7fach
|
|
UINT32 _SS; // 7fb0h
|
|
UINT32 _DS; // 7fb4h
|
|
UINT32 _FS; // 7fb8h
|
|
UINT32 _GS; // 7fbch
|
|
UINT32 Reserved3; // 7fc0h
|
|
UINT32 _TR; // 7fc4h
|
|
UINT32 _DR7; // 7fc8h
|
|
UINT32 _DR6; // 7fcch
|
|
UINT32 _EAX; // 7fd0h
|
|
UINT32 _ECX; // 7fd4h
|
|
UINT32 _EDX; // 7fd8h
|
|
UINT32 _EBX; // 7fdch
|
|
UINT32 _ESP; // 7fe0h
|
|
UINT32 _EBP; // 7fe4h
|
|
UINT32 _ESI; // 7fe8h
|
|
UINT32 _EDI; // 7fech
|
|
UINT32 _EIP; // 7ff0h
|
|
UINT32 _EFLAGS; // 7ff4h
|
|
UINT32 _CR3; // 7ff8h
|
|
UINT32 _CR0; // 7ffch
|
|
} SMRAM_SAVE_STATE_MAP32;
|
|
|
|
///
|
|
/// 64-bit SMRAM Save State Map
|
|
///
|
|
typedef struct {
|
|
UINT8 Reserved1[0x1d0]; // 7c00h
|
|
UINT32 GdtBaseHiDword; // 7dd0h
|
|
UINT32 LdtBaseHiDword; // 7dd4h
|
|
UINT32 IdtBaseHiDword; // 7dd8h
|
|
UINT8 Reserved2[0xc]; // 7ddch
|
|
UINT64 IO_EIP; // 7de8h
|
|
UINT8 Reserved3[0x50]; // 7df0h
|
|
UINT32 _CR4; // 7e40h
|
|
UINT8 Reserved4[0x48]; // 7e44h
|
|
UINT32 GdtBaseLoDword; // 7e8ch
|
|
UINT32 Reserved5; // 7e90h
|
|
UINT32 IdtBaseLoDword; // 7e94h
|
|
UINT32 Reserved6; // 7e98h
|
|
UINT32 LdtBaseLoDword; // 7e9ch
|
|
UINT8 Reserved7[0x38]; // 7ea0h
|
|
UINT64 EptVmxControl; // 7ed8h
|
|
UINT32 EnEptVmxControl; // 7ee0h
|
|
UINT8 Reserved8[0x14]; // 7ee4h
|
|
UINT32 SMBASE; // 7ef8h
|
|
UINT32 SMMRevId; // 7efch
|
|
UINT16 IORestart; // 7f00h
|
|
UINT16 AutoHALTRestart; // 7f02h
|
|
UINT8 Reserved9[0x18]; // 7f04h
|
|
UINT64 _R15; // 7f1ch
|
|
UINT64 _R14;
|
|
UINT64 _R13;
|
|
UINT64 _R12;
|
|
UINT64 _R11;
|
|
UINT64 _R10;
|
|
UINT64 _R9;
|
|
UINT64 _R8;
|
|
UINT64 _RAX; // 7f5ch
|
|
UINT64 _RCX;
|
|
UINT64 _RDX;
|
|
UINT64 _RBX;
|
|
UINT64 _RSP;
|
|
UINT64 _RBP;
|
|
UINT64 _RSI;
|
|
UINT64 _RDI;
|
|
UINT64 IOMemAddr; // 7f9ch
|
|
UINT32 IOMisc; // 7fa4h
|
|
UINT32 _ES; // 7fa8h
|
|
UINT32 _CS;
|
|
UINT32 _SS;
|
|
UINT32 _DS;
|
|
UINT32 _FS;
|
|
UINT32 _GS;
|
|
UINT32 _LDTR; // 7fc0h
|
|
UINT32 _TR;
|
|
UINT64 _DR7; // 7fc8h
|
|
UINT64 _DR6;
|
|
UINT64 _RIP; // 7fd8h
|
|
UINT64 IA32_EFER; // 7fe0h
|
|
UINT64 _RFLAGS; // 7fe8h
|
|
UINT64 _CR3; // 7ff0h
|
|
UINT64 _CR0; // 7ff8h
|
|
} SMRAM_SAVE_STATE_MAP64;
|
|
|
|
///
|
|
/// Union of 32-bit and 64-bit SMRAM Save State Maps
|
|
///
|
|
typedef union {
|
|
SMRAM_SAVE_STATE_MAP32 x86;
|
|
SMRAM_SAVE_STATE_MAP64 x64;
|
|
} SMRAM_SAVE_STATE_MAP;
|
|
|
|
///
|
|
/// Minimum SMM Revision ID that supports IOMisc field in SMRAM Save State Map
|
|
///
|
|
#define SMRAM_SAVE_STATE_MIN_REV_ID_IOMISC 0x30004
|
|
|
|
///
|
|
/// SMRAM Save State Map IOMisc I/O Length Values
|
|
///
|
|
#define SMM_IO_LENGTH_BYTE 0x01
|
|
#define SMM_IO_LENGTH_WORD 0x02
|
|
#define SMM_IO_LENGTH_DWORD 0x04
|
|
|
|
///
|
|
/// SMRAM Save State Map IOMisc I/O Instruction Type Values
|
|
///
|
|
#define SMM_IO_TYPE_IN_IMMEDIATE 0x9
|
|
#define SMM_IO_TYPE_IN_DX 0x1
|
|
#define SMM_IO_TYPE_OUT_IMMEDIATE 0x8
|
|
#define SMM_IO_TYPE_OUT_DX 0x0
|
|
#define SMM_IO_TYPE_INS 0x3
|
|
#define SMM_IO_TYPE_OUTS 0x2
|
|
#define SMM_IO_TYPE_REP_INS 0x7
|
|
#define SMM_IO_TYPE_REP_OUTS 0x6
|
|
|
|
///
|
|
/// SMRAM Save State Map IOMisc structure
|
|
///
|
|
typedef union {
|
|
struct {
|
|
UINT32 SmiFlag:1;
|
|
UINT32 Length:3;
|
|
UINT32 Type:4;
|
|
UINT32 Reserved1:8;
|
|
UINT32 Port:16;
|
|
} Bits;
|
|
UINT32 Uint32;
|
|
} SMRAM_SAVE_STATE_IOMISC;
|
|
|
|
#pragma pack ()
|
|
|
|
#endif
|