1 /* 2 * On i386, pt_regs and user_regs_struct are the same, 3 * but on 64 bit x86, user_regs_struct has six more fields: 4 * fs_base, gs_base, ds, es, fs, gs. 5 * PTRACE_GETREGS fills them too, so struct pt_regs would overflow. 6 */ 7 struct i386_user_regs_struct { 8 uint32_t ebx; 9 uint32_t ecx; 10 uint32_t edx; 11 uint32_t esi; 12 uint32_t edi; 13 uint32_t ebp; 14 uint32_t eax; 15 uint32_t xds; 16 uint32_t xes; 17 uint32_t xfs; 18 uint32_t xgs; 19 uint32_t orig_eax; 20 uint32_t eip; 21 uint32_t xcs; 22 uint32_t eflags; 23 uint32_t esp; 24 uint32_t xss; 25 }; 26 static union { 27 struct user_regs_struct x86_64_r; 28 struct i386_user_regs_struct i386_r; 29 } x86_regs_union; 30 #define x86_64_regs x86_regs_union.x86_64_r 31 #define i386_regs x86_regs_union.i386_r 32 33 uint32_t *const i386_esp_ptr = &i386_regs.esp; 34 uint64_t *const x86_64_rsp_ptr = (uint64_t *) &x86_64_regs.rsp; 35 static struct iovec x86_io = { 36 .iov_base = &x86_regs_union 37 }; 38 39 #define ARCH_REGS_FOR_GETREGSET x86_regs_union 40 #define ARCH_IOVEC_FOR_GETREGSET x86_io 41 #define ARCH_PC_REG (x86_io.iov_len == sizeof(i386_regs) ? i386_regs.eip : x86_64_regs.rip) 42