summaryrefslogtreecommitdiffstats
path: root/MdePkg/Include/Register/Intel/SmramSaveStateMap.h
blob: 36035b9819cf85deb7a152f9a69b9347304ca971 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
/** @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 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __INTEL_SMRAM_SAVE_STATE_MAP_H__
#define __INTEL_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