1 //===-- RegisterContext_x86.h -----------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef liblldb_RegisterContext_x86_H_
11 #define liblldb_RegisterContext_x86_H_
13 //---------------------------------------------------------------------------
14 // i386 gcc, dwarf, gdb enums
15 //---------------------------------------------------------------------------
17 // Register numbers seen in eh_frame (eRegisterKindGCC)
19 // From Jason Molenda: "gcc registers" is the register numbering used in the eh_frame
20 // CFI. The only registers that are described in eh_frame CFI are those that are
21 // preserved across function calls aka callee-saved aka non-volatile. And none
22 // of the floating point registers on x86 are preserved across function calls.
24 // The only reason there is a "gcc register" and a "dwarf register" is because of a
25 // mistake years and years ago with i386 where they got esp and ebp
26 // backwards when they emitted the eh_frame instructions. Once there were
27 // binaries In The Wild using the reversed numbering, we had to stick with it
31 // 2nd parameter in DwarfRegNum() is regnum for exception handling on x86-32.
32 // See http://llvm.org/docs/WritingAnLLVMBackend.html#defining-a-register
37 gcc_ebp_i386, // Warning: these are switched from dwarf values
69 // DWARF register numbers (eRegisterKindDWARF)
70 // Intel's x86 or IA-32
73 // General Purpose Registers.
84 // Floating Point Registers
111 dwarf_fctrl_i386 = 37, // x87 control word
112 dwarf_fstat_i386 = 38, // x87 status word
113 dwarf_mxcsr_i386 = 39,
121 // I believe the ymm registers use the dwarf_xmm%_i386 register numbers and
122 // then differentiate based on size of the register.
125 // Register numbers GDB uses (eRegisterKindGDB)
127 // From Jason Molenda: The "gdb numbers" are what you would see in the stabs debug format.
154 gdb_fctrl_i386, // FPU Control Word
155 gdb_fstat_i386, // FPU Status Word
156 gdb_ftag_i386, // FPU Tag Word
157 gdb_fiseg_i386, // FPU IP Selector
158 gdb_fioff_i386, // FPU IP Offset
159 gdb_foseg_i386, // FPU Operand Pointer Selector
160 gdb_fooff_i386, // FPU Operand Pointer Offset
161 gdb_fop_i386, // Last Instruction Opcode
189 //---------------------------------------------------------------------------
190 // AMD x86_64, AMD64, Intel EM64T, or Intel 64 gcc, dwarf, gdb enums
191 //---------------------------------------------------------------------------
193 // GCC and DWARF Register numbers (eRegisterKindGCC & eRegisterKindDWARF)
194 // This is the spec I used (as opposed to x86-64-abi-0.99.pdf):
195 // http://software.intel.com/sites/default/files/article/402129/mpx-linux64-abi.pdf
199 gcc_dwarf_rax_x86_64 = 0,
200 gcc_dwarf_rdx_x86_64,
201 gcc_dwarf_rcx_x86_64,
202 gcc_dwarf_rbx_x86_64,
203 gcc_dwarf_rsi_x86_64,
204 gcc_dwarf_rdi_x86_64,
205 gcc_dwarf_rbp_x86_64,
206 gcc_dwarf_rsp_x86_64,
207 // Extended GP Registers
208 gcc_dwarf_r8_x86_64 = 8,
210 gcc_dwarf_r10_x86_64,
211 gcc_dwarf_r11_x86_64,
212 gcc_dwarf_r12_x86_64,
213 gcc_dwarf_r13_x86_64,
214 gcc_dwarf_r14_x86_64,
215 gcc_dwarf_r15_x86_64,
216 // Return Address (RA) mapped to RIP
217 gcc_dwarf_rip_x86_64 = 16,
218 // SSE Vector Registers
219 gcc_dwarf_xmm0_x86_64 = 17,
220 gcc_dwarf_xmm1_x86_64,
221 gcc_dwarf_xmm2_x86_64,
222 gcc_dwarf_xmm3_x86_64,
223 gcc_dwarf_xmm4_x86_64,
224 gcc_dwarf_xmm5_x86_64,
225 gcc_dwarf_xmm6_x86_64,
226 gcc_dwarf_xmm7_x86_64,
227 gcc_dwarf_xmm8_x86_64,
228 gcc_dwarf_xmm9_x86_64,
229 gcc_dwarf_xmm10_x86_64,
230 gcc_dwarf_xmm11_x86_64,
231 gcc_dwarf_xmm12_x86_64,
232 gcc_dwarf_xmm13_x86_64,
233 gcc_dwarf_xmm14_x86_64,
234 gcc_dwarf_xmm15_x86_64,
235 // Floating Point Registers
236 gcc_dwarf_st0_x86_64 = 33,
237 gcc_dwarf_st1_x86_64,
238 gcc_dwarf_st2_x86_64,
239 gcc_dwarf_st3_x86_64,
240 gcc_dwarf_st4_x86_64,
241 gcc_dwarf_st5_x86_64,
242 gcc_dwarf_st6_x86_64,
243 gcc_dwarf_st7_x86_64,
245 gcc_dwarf_mm0_x86_64 = 41,
246 gcc_dwarf_mm1_x86_64,
247 gcc_dwarf_mm2_x86_64,
248 gcc_dwarf_mm3_x86_64,
249 gcc_dwarf_mm4_x86_64,
250 gcc_dwarf_mm5_x86_64,
251 gcc_dwarf_mm6_x86_64,
252 gcc_dwarf_mm7_x86_64,
253 // Control and Status Flags Register
254 gcc_dwarf_rflags_x86_64 = 49,
255 // selector registers
256 gcc_dwarf_es_x86_64 = 50,
262 // Floating point control registers
263 gcc_dwarf_mxcsr_x86_64 = 64, // Media Control and Status
264 gcc_dwarf_fctrl_x86_64, // x87 control word
265 gcc_dwarf_fstat_x86_64, // x87 status word
266 // Upper Vector Registers
267 gcc_dwarf_ymm0h_x86_64 = 67,
268 gcc_dwarf_ymm1h_x86_64,
269 gcc_dwarf_ymm2h_x86_64,
270 gcc_dwarf_ymm3h_x86_64,
271 gcc_dwarf_ymm4h_x86_64,
272 gcc_dwarf_ymm5h_x86_64,
273 gcc_dwarf_ymm6h_x86_64,
274 gcc_dwarf_ymm7h_x86_64,
275 gcc_dwarf_ymm8h_x86_64,
276 gcc_dwarf_ymm9h_x86_64,
277 gcc_dwarf_ymm10h_x86_64,
278 gcc_dwarf_ymm11h_x86_64,
279 gcc_dwarf_ymm12h_x86_64,
280 gcc_dwarf_ymm13h_x86_64,
281 gcc_dwarf_ymm14h_x86_64,
282 gcc_dwarf_ymm15h_x86_64,
283 // AVX2 Vector Mask Registers
284 // gcc_dwarf_k0_x86_64 = 118,
285 // gcc_dwarf_k1_x86_64,
286 // gcc_dwarf_k2_x86_64,
287 // gcc_dwarf_k3_x86_64,
288 // gcc_dwarf_k4_x86_64,
289 // gcc_dwarf_k5_x86_64,
290 // gcc_dwarf_k6_x86_64,
291 // gcc_dwarf_k7_x86_64,
294 // GDB Register numbers (eRegisterKindGDB)
306 // Extended GP Registers
315 // Return Address (RA) mapped to RIP
317 // Control and Status Flags Register
325 // Floating Point Registers
342 // SSE Vector Registers
343 gdb_xmm0_x86_64 = 40,
359 // Floating point control registers
360 gdb_mxcsr_x86_64 = 56,
379 //---------------------------------------------------------------------------
380 // Generic floating-point registers
381 //---------------------------------------------------------------------------
391 uint8_t bytes[16]; // 128-bits for each XMM register
394 // i387_fxsave_struct
397 uint16_t fctrl; // FPU Control Word (fcw)
398 uint16_t fstat; // FPU Status Word (fsw)
399 uint16_t ftag; // FPU Tag Word (ftw)
400 uint16_t fop; // Last Instruction Opcode (fop)
405 uint64_t fip; // Instruction Pointer
406 uint64_t fdp; // Data Pointer
410 uint32_t fioff; // FPU IP Offset (fip)
411 uint32_t fiseg; // FPU IP Selector (fcs)
412 uint32_t fooff; // FPU Operand Pointer Offset (foo)
413 uint32_t foseg; // FPU Operand Pointer Selector (fos)
416 uint32_t mxcsr; // MXCSR Register State
417 uint32_t mxcsrmask; // MXCSR Mask
418 MMSReg stmm[8]; // 8*16 bytes for each FP-reg = 128 bytes
419 XMMReg xmm[16]; // 16*16 bytes for each XMM-reg = 256 bytes
420 uint32_t padding[24];
423 //---------------------------------------------------------------------------
424 // Extended floating-point registers
425 //---------------------------------------------------------------------------
429 uint8_t bytes[16]; // 16 * 8 bits for the high bytes of each YMM register
434 uint8_t bytes[32]; // 16 * 16 bits for each YMM register
439 YMMReg ymm[16]; // assembled from ymmh and xmm registers
444 uint64_t xstate_bv; // OS enabled xstate mask to determine the extended states supported by the processor
445 uint64_t reserved1[2];
446 uint64_t reserved2[5];
447 } __attribute__((packed));
449 // x86 extensions to FXSAVE (i.e. for AVX processors)
452 FXSAVE i387; // floating point registers typical in i387_fxsave_struct
453 XSAVE_HDR header; // The xsave_hdr_struct can be used to determine if the following extensions are usable
454 YMMHReg ymmh[16]; // High 16 bytes of each of 16 YMM registers (the low bytes are in FXSAVE.xmm for compatibility with SSE)
455 // Slot any extensions to the register file here
456 } __attribute__((packed, aligned (64)));
458 // Floating-point registers
461 // Thread state for the floating-point unit of the processor read by ptrace.
464 FXSAVE fxsave; // Generic floating-point registers.
465 XSAVE xsave; // x86 extended processor state.
469 //---------------------------------------------------------------------------
470 // ptrace PTRACE_GETREGSET, PTRACE_SETREGSET structure
471 //---------------------------------------------------------------------------
475 void *iov_base; // pointer to XSAVE
476 size_t iov_len; // sizeof(XSAVE)