xref: /aosp_15_r20/external/strace/linux/x86_64/arch_regs.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
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