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