(root)/
strace-6.5/
src/
linux/
x86_64/
arch_regs.c
       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