1 /*
2 * Copyright (c) 2015-2021 The strace developers.
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: LGPL-2.1-or-later
6 */
7
8 /*
9 * On i386, pt_regs and user_regs_struct are the same,
10 * but on 64 bit x86, user_regs_struct has six more fields:
11 * fs_base, gs_base, ds, es, fs, gs.
12 * PTRACE_GETREGS fills them too, so struct pt_regs would overflow.
13 */
14 struct i386_user_regs_struct {
15 uint32_t ebx;
16 uint32_t ecx;
17 uint32_t edx;
18 uint32_t esi;
19 uint32_t edi;
20 uint32_t ebp;
21 uint32_t eax;
22 uint32_t xds;
23 uint32_t xes;
24 uint32_t xfs;
25 uint32_t xgs;
26 uint32_t orig_eax;
27 uint32_t eip;
28 uint32_t xcs;
29 uint32_t eflags;
30 uint32_t esp;
31 uint32_t xss;
32 };
33 static union {
34 struct user_regs_struct x86_64_r;
35 struct i386_user_regs_struct i386_r;
36 } x86_regs_union;
37 #define x86_64_regs x86_regs_union.x86_64_r
38 #define i386_regs x86_regs_union.i386_r
39
40 static struct iovec x86_io = {
41 .iov_base = &x86_regs_union
42 };
43
44 #define ARCH_REGS_FOR_GETREGSET x86_regs_union
45 #define ARCH_IOVEC_FOR_GETREGSET x86_io
46 #define ARCH_PC_REG \
47 (x86_io.iov_len == sizeof(i386_regs) ? i386_regs.eip : x86_64_regs.rip)
48 #define ARCH_SP_REG \
49 (x86_io.iov_len == sizeof(i386_regs) ? i386_regs.esp : x86_64_regs.rsp)
50
51 #undef ARCH_MIGHT_USE_SET_REGS
52 #define ARCH_MIGHT_USE_SET_REGS 0