summaryrefslogtreecommitdiffstats
path: root/SourceLevelDebugPkg/Include/Ia32/ProcessorContext.h
blob: 5989478b4222b44b5a57cff1f5bdfa6bfec19cbf (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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
/** @file
  IA32/x64 architecture specific definitions needed by debug transfer protocol.It is only
  intended to be used by Debug related module implementation.

  Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __PROCESSOR_CONTEXT_H__
#define __PROCESSOR_CONTEXT_H__

//
//  IA-32/x64 processor register index table
//
#define SOFT_DEBUGGER_REGISTER_DR0     0x00
#define SOFT_DEBUGGER_REGISTER_DR1     0x01
#define SOFT_DEBUGGER_REGISTER_DR2     0x02
#define SOFT_DEBUGGER_REGISTER_DR3     0x03
#define SOFT_DEBUGGER_REGISTER_DR6     0x04
#define SOFT_DEBUGGER_REGISTER_DR7     0x05
#define SOFT_DEBUGGER_REGISTER_EFLAGS  0x06
#define SOFT_DEBUGGER_REGISTER_LDTR    0x07
#define SOFT_DEBUGGER_REGISTER_TR      0x08
#define SOFT_DEBUGGER_REGISTER_GDTR0   0x09 // the low 32bit of GDTR
#define SOFT_DEBUGGER_REGISTER_GDTR1   0x0A // the high 32bit of GDTR
#define SOFT_DEBUGGER_REGISTER_IDTR0   0x0B // the low 32bit of IDTR
#define SOFT_DEBUGGER_REGISTER_IDTR1   0x0C // the high 32bot of IDTR
#define SOFT_DEBUGGER_REGISTER_EIP     0x0D
#define SOFT_DEBUGGER_REGISTER_GS      0x0E
#define SOFT_DEBUGGER_REGISTER_FS      0x0F
#define SOFT_DEBUGGER_REGISTER_ES      0x10
#define SOFT_DEBUGGER_REGISTER_DS      0x11
#define SOFT_DEBUGGER_REGISTER_CS      0x12
#define SOFT_DEBUGGER_REGISTER_SS      0x13
#define SOFT_DEBUGGER_REGISTER_CR0     0x14
#define SOFT_DEBUGGER_REGISTER_CR1     0x15
#define SOFT_DEBUGGER_REGISTER_CR2     0x16
#define SOFT_DEBUGGER_REGISTER_CR3     0x17
#define SOFT_DEBUGGER_REGISTER_CR4     0x18

#define SOFT_DEBUGGER_REGISTER_DI  0x19
#define SOFT_DEBUGGER_REGISTER_SI  0x1A
#define SOFT_DEBUGGER_REGISTER_BP  0x1B
#define SOFT_DEBUGGER_REGISTER_SP  0x1C
#define SOFT_DEBUGGER_REGISTER_DX  0x1D
#define SOFT_DEBUGGER_REGISTER_CX  0x1E
#define SOFT_DEBUGGER_REGISTER_BX  0x1F
#define SOFT_DEBUGGER_REGISTER_AX  0x20

//
// This below registers are only available for x64 (not valid for Ia32 mode)
//
#define SOFT_DEBUGGER_REGISTER_CR8  0x21
#define SOFT_DEBUGGER_REGISTER_R8   0x22
#define SOFT_DEBUGGER_REGISTER_R9   0x23
#define SOFT_DEBUGGER_REGISTER_R10  0x24
#define SOFT_DEBUGGER_REGISTER_R11  0x25
#define SOFT_DEBUGGER_REGISTER_R12  0x26
#define SOFT_DEBUGGER_REGISTER_R13  0x27
#define SOFT_DEBUGGER_REGISTER_R14  0x28
#define SOFT_DEBUGGER_REGISTER_R15  0x29

//
// This below registers are FP / MMX / XMM registers
//
#define SOFT_DEBUGGER_REGISTER_FP_BASE  0x30

#define SOFT_DEBUGGER_REGISTER_FP_FCW         (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x00)
#define SOFT_DEBUGGER_REGISTER_FP_FSW         (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x01)
#define SOFT_DEBUGGER_REGISTER_FP_FTW         (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x02)
#define SOFT_DEBUGGER_REGISTER_FP_OPCODE      (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x03)
#define SOFT_DEBUGGER_REGISTER_FP_EIP         (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x04)
#define SOFT_DEBUGGER_REGISTER_FP_CS          (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x05)
#define SOFT_DEBUGGER_REGISTER_FP_DATAOFFSET  (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x06)
#define SOFT_DEBUGGER_REGISTER_FP_DS          (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x07)
#define SOFT_DEBUGGER_REGISTER_FP_MXCSR       (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x08)
#define SOFT_DEBUGGER_REGISTER_FP_MXCSR_MASK  (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x09)
#define SOFT_DEBUGGER_REGISTER_ST0            (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x0A)
#define SOFT_DEBUGGER_REGISTER_ST1            (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x0B)
#define SOFT_DEBUGGER_REGISTER_ST2            (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x0C)
#define SOFT_DEBUGGER_REGISTER_ST3            (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x0D)
#define SOFT_DEBUGGER_REGISTER_ST4            (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x0E)
#define SOFT_DEBUGGER_REGISTER_ST5            (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x0F)
#define SOFT_DEBUGGER_REGISTER_ST6            (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x10)
#define SOFT_DEBUGGER_REGISTER_ST7            (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x11)
#define SOFT_DEBUGGER_REGISTER_XMM0           (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x12)
#define SOFT_DEBUGGER_REGISTER_XMM1           (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x13)
#define SOFT_DEBUGGER_REGISTER_XMM2           (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x14)
#define SOFT_DEBUGGER_REGISTER_XMM3           (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x15)
#define SOFT_DEBUGGER_REGISTER_XMM4           (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x16)
#define SOFT_DEBUGGER_REGISTER_XMM5           (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x17)
#define SOFT_DEBUGGER_REGISTER_XMM6           (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x18)
#define SOFT_DEBUGGER_REGISTER_XMM7           (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x19)
#define SOFT_DEBUGGER_REGISTER_XMM8           (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x1A)
#define SOFT_DEBUGGER_REGISTER_XMM9           (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x1B)
#define SOFT_DEBUGGER_REGISTER_XMM10          (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x1C)
#define SOFT_DEBUGGER_REGISTER_XMM11          (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x1D)
#define SOFT_DEBUGGER_REGISTER_XMM12          (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x1E)
#define SOFT_DEBUGGER_REGISTER_XMM13          (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x1F)
#define SOFT_DEBUGGER_REGISTER_XMM14          (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x20)
#define SOFT_DEBUGGER_REGISTER_XMM15          (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x21)
#define SOFT_DEBUGGER_REGISTER_MM0            (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x22)
#define SOFT_DEBUGGER_REGISTER_MM1            (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x23)
#define SOFT_DEBUGGER_REGISTER_MM2            (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x24)
#define SOFT_DEBUGGER_REGISTER_MM3            (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x25)
#define SOFT_DEBUGGER_REGISTER_MM4            (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x26)
#define SOFT_DEBUGGER_REGISTER_MM5            (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x27)
#define SOFT_DEBUGGER_REGISTER_MM6            (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x28)
#define SOFT_DEBUGGER_REGISTER_MM7            (SOFT_DEBUGGER_REGISTER_FP_BASE + 0x29)

#define SOFT_DEBUGGER_REGISTER_MAX  SOFT_DEBUGGER_REGISTER_MM7

#define SOFT_DEBUGGER_MSR_EFER  (0xC0000080)

#pragma pack(1)

///
/// FXSAVE_STATE
/// FP / MMX / XMM registers (see fxrstor instruction definition)
///
typedef struct {
  UINT16    Fcw;
  UINT16    Fsw;
  UINT16    Ftw;
  UINT16    Opcode;
  UINT32    Eip;
  UINT16    Cs;
  UINT16    Reserved1;
  UINT32    DataOffset;
  UINT16    Ds;
  UINT8     Reserved2[2];
  UINT32    Mxcsr;
  UINT32    Mxcsr_Mask;
  UINT8     St0Mm0[10];
  UINT8     Reserved3[6];
  UINT8     St1Mm1[10];
  UINT8     Reserved4[6];
  UINT8     St2Mm2[10];
  UINT8     Reserved5[6];
  UINT8     St3Mm3[10];
  UINT8     Reserved6[6];
  UINT8     St4Mm4[10];
  UINT8     Reserved7[6];
  UINT8     St5Mm5[10];
  UINT8     Reserved8[6];
  UINT8     St6Mm6[10];
  UINT8     Reserved9[6];
  UINT8     St7Mm7[10];
  UINT8     Reserved10[6];
  UINT8     Xmm0[16];
  UINT8     Xmm1[16];
  UINT8     Xmm2[16];
  UINT8     Xmm3[16];
  UINT8     Xmm4[16];
  UINT8     Xmm5[16];
  UINT8     Xmm6[16];
  UINT8     Xmm7[16];
  UINT8     Reserved11[14 * 16];
} DEBUG_DATA_IA32_FX_SAVE_STATE;

///
///  IA-32 processor context definition
///
typedef struct {
  UINT32                           ExceptionData;
  DEBUG_DATA_IA32_FX_SAVE_STATE    FxSaveState;
  UINT32                           Dr0;
  UINT32                           Dr1;
  UINT32                           Dr2;
  UINT32                           Dr3;
  UINT32                           Dr6;
  UINT32                           Dr7;
  UINT32                           Eflags;
  UINT32                           Ldtr;
  UINT32                           Tr;
  UINT32                           Gdtr[2];
  UINT32                           Idtr[2];
  UINT32                           Eip;
  UINT32                           Gs;
  UINT32                           Fs;
  UINT32                           Es;
  UINT32                           Ds;
  UINT32                           Cs;
  UINT32                           Ss;
  UINT32                           Cr0;
  UINT32                           Cr1; ///< Reserved
  UINT32                           Cr2;
  UINT32                           Cr3;
  UINT32                           Cr4;
  UINT32                           Edi;
  UINT32                           Esi;
  UINT32                           Ebp;
  UINT32                           Esp;
  UINT32                           Edx;
  UINT32                           Ecx;
  UINT32                           Ebx;
  UINT32                           Eax;
} DEBUG_DATA_IA32_SYSTEM_CONTEXT;

///
/// FXSAVE_STATE
/// FP / MMX / XMM registers (see fxrstor instruction definition)
///
typedef struct {
  UINT16    Fcw;
  UINT16    Fsw;
  UINT16    Ftw;
  UINT16    Opcode;
  UINT32    Eip;
  UINT16    Cs;
  UINT16    Reserved1;
  UINT32    DataOffset;
  UINT16    Ds;
  UINT8     Reserved2[2];
  UINT32    Mxcsr;
  UINT32    Mxcsr_Mask;
  UINT8     St0Mm0[10];
  UINT8     Reserved3[6];
  UINT8     St1Mm1[10];
  UINT8     Reserved4[6];
  UINT8     St2Mm2[10];
  UINT8     Reserved5[6];
  UINT8     St3Mm3[10];
  UINT8     Reserved6[6];
  UINT8     St4Mm4[10];
  UINT8     Reserved7[6];
  UINT8     St5Mm5[10];
  UINT8     Reserved8[6];
  UINT8     St6Mm6[10];
  UINT8     Reserved9[6];
  UINT8     St7Mm7[10];
  UINT8     Reserved10[6];
  UINT8     Xmm0[16];
  UINT8     Xmm1[16];
  UINT8     Xmm2[16];
  UINT8     Xmm3[16];
  UINT8     Xmm4[16];
  UINT8     Xmm5[16];
  UINT8     Xmm6[16];
  UINT8     Xmm7[16];
  UINT8     Xmm8[16];
  UINT8     Xmm9[16];
  UINT8     Xmm10[16];
  UINT8     Xmm11[16];
  UINT8     Xmm12[16];
  UINT8     Xmm13[16];
  UINT8     Xmm14[16];
  UINT8     Xmm15[16];
  UINT8     Reserved11[6 * 16];
} DEBUG_DATA_X64_FX_SAVE_STATE;

///
///  x64 processor context definition
///
typedef struct {
  UINT64                          ExceptionData;
  DEBUG_DATA_X64_FX_SAVE_STATE    FxSaveState;
  UINT64                          Dr0;
  UINT64                          Dr1;
  UINT64                          Dr2;
  UINT64                          Dr3;
  UINT64                          Dr6;
  UINT64                          Dr7;
  UINT64                          Eflags;
  UINT64                          Ldtr;
  UINT64                          Tr;
  UINT64                          Gdtr[2];
  UINT64                          Idtr[2];
  UINT64                          Eip;
  UINT64                          Gs;
  UINT64                          Fs;
  UINT64                          Es;
  UINT64                          Ds;
  UINT64                          Cs;
  UINT64                          Ss;
  UINT64                          Cr0;
  UINT64                          Cr1; ///< Reserved
  UINT64                          Cr2;
  UINT64                          Cr3;
  UINT64                          Cr4;
  UINT64                          Rdi;
  UINT64                          Rsi;
  UINT64                          Rbp;
  UINT64                          Rsp;
  UINT64                          Rdx;
  UINT64                          Rcx;
  UINT64                          Rbx;
  UINT64                          Rax;
  UINT64                          Cr8;
  UINT64                          R8;
  UINT64                          R9;
  UINT64                          R10;
  UINT64                          R11;
  UINT64                          R12;
  UINT64                          R13;
  UINT64                          R14;
  UINT64                          R15;
} DEBUG_DATA_X64_SYSTEM_CONTEXT;

#pragma pack()

#endif