]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/amd64-linux-nat.c
gdb, gdbserver, gdbsupport: remove includes of early headers
[thirdparty/binutils-gdb.git] / gdb / amd64-linux-nat.c
index f98d992070a340d0c37d249f0a8c10a3c5d71aa9..aa9295d57230d4f559f6b5c346658b786c0b0688 100644 (file)
@@ -1,6 +1,6 @@
 /* Native-dependent code for GNU/Linux x86-64.
 
-   Copyright (C) 2001-2020 Free Software Foundation, Inc.
+   Copyright (C) 2001-2024 Free Software Foundation, Inc.
    Contributed by Jiri Smid, SuSE Labs.
 
    This file is part of GDB.
@@ -18,7 +18,6 @@
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
-#include "defs.h"
 #include "inferior.h"
 #include "regcache.h"
 #include "elf/common.h"
@@ -99,7 +98,7 @@ static int amd64_linux_gregset32_reg_offset[] =
 
 static void
 amd64_linux_collect_native_gregset (const struct regcache *regcache,
-                                   void *gregs, int regnum)
+                                   void *gregs, int regnum)
 {
   amd64_collect_native_gregset (regcache, gregs, regnum);
 
@@ -210,6 +209,7 @@ void
 amd64_linux_nat_target::fetch_registers (struct regcache *regcache, int regnum)
 {
   struct gdbarch *gdbarch = regcache->arch ();
+  const i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
   int tid;
 
   /* GNU/Linux LWP ID's are process ID's.  */
@@ -235,7 +235,7 @@ amd64_linux_nat_target::fetch_registers (struct regcache *regcache, int regnum)
 
       if (have_ptrace_getregset == TRIBOOL_TRUE)
        {
-         char xstateregs[X86_XSTATE_MAX_SIZE];
+         char xstateregs[tdep->xsave_layout.sizeof_xsave];
          struct iovec iov;
 
          /* Pre-4.14 kernels have a bug (fixed by commit 0852b374173b
@@ -259,30 +259,6 @@ amd64_linux_nat_target::fetch_registers (struct regcache *regcache, int regnum)
 
          amd64_supply_fxsave (regcache, -1, &fpregs);
        }
-#ifndef HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE
-      {
-       /* PTRACE_ARCH_PRCTL is obsolete since 2.6.25, where the
-          fs_base and gs_base fields of user_regs_struct can be
-          used directly.  */
-       unsigned long base;
-
-       if (regnum == -1 || regnum == AMD64_FSBASE_REGNUM)
-         {
-           if (ptrace (PTRACE_ARCH_PRCTL, tid, &base, ARCH_GET_FS) < 0)
-             perror_with_name (_("Couldn't get segment register fs_base"));
-
-           regcache->raw_supply (AMD64_FSBASE_REGNUM, &base);
-         }
-
-       if (regnum == -1 || regnum == AMD64_GSBASE_REGNUM)
-         {
-           if (ptrace (PTRACE_ARCH_PRCTL, tid, &base, ARCH_GET_GS) < 0)
-             perror_with_name (_("Couldn't get segment register gs_base"));
-
-           regcache->raw_supply (AMD64_GSBASE_REGNUM, &base);
-         }
-      }
-#endif
     }
 }
 
@@ -294,6 +270,7 @@ void
 amd64_linux_nat_target::store_registers (struct regcache *regcache, int regnum)
 {
   struct gdbarch *gdbarch = regcache->arch ();
+  const i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
   int tid;
 
   /* GNU/Linux LWP ID's are process ID's.  */
@@ -323,7 +300,7 @@ amd64_linux_nat_target::store_registers (struct regcache *regcache, int regnum)
 
       if (have_ptrace_getregset == TRIBOOL_TRUE)
        {
-         char xstateregs[X86_XSTATE_MAX_SIZE];
+         char xstateregs[tdep->xsave_layout.sizeof_xsave];
          struct iovec iov;
 
          iov.iov_base = xstateregs;
@@ -348,30 +325,6 @@ amd64_linux_nat_target::store_registers (struct regcache *regcache, int regnum)
          if (ptrace (PTRACE_SETFPREGS, tid, 0, (long) &fpregs) < 0)
            perror_with_name (_("Couldn't write floating point status"));
        }
-
-#ifndef HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE
-      {
-       /* PTRACE_ARCH_PRCTL is obsolete since 2.6.25, where the
-          fs_base and gs_base fields of user_regs_struct can be
-          used directly.  */
-       void *base;
-
-       if (regnum == -1 || regnum == AMD64_FSBASE_REGNUM)
-         {
-           regcache->raw_collect (AMD64_FSBASE_REGNUM, &base);
-
-           if (ptrace (PTRACE_ARCH_PRCTL, tid, base, ARCH_SET_FS) < 0)
-             perror_with_name (_("Couldn't write segment register fs_base"));
-         }
-       if (regnum == -1 || regnum == AMD64_GSBASE_REGNUM)
-         {
-
-           regcache->raw_collect (AMD64_GSBASE_REGNUM, &base);
-           if (ptrace (PTRACE_ARCH_PRCTL, tid, base, ARCH_SET_GS) < 0)
-             perror_with_name (_("Couldn't write segment register gs_base"));
-         }
-      }
-#endif
     }
 }
 \f
@@ -381,9 +334,9 @@ amd64_linux_nat_target::store_registers (struct regcache *regcache, int regnum)
 
 ps_err_e
 ps_get_thread_area (struct ps_prochandle *ph,
-                    lwpid_t lwpid, int idx, void **base)
+                   lwpid_t lwpid, int idx, void **base)
 {
-  if (gdbarch_bfd_arch_info (target_gdbarch ())->bits_per_word == 32)
+  if (gdbarch_bfd_arch_info (ph->thread->inf->arch ())->bits_per_word == 32)
     {
       unsigned int base_addr;
       ps_err_e result;
@@ -408,11 +361,7 @@ ps_get_thread_area (struct ps_prochandle *ph,
       switch (idx)
        {
        case FS:
-#ifdef HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE
            {
-             /* PTRACE_ARCH_PRCTL is obsolete since 2.6.25, where the
-                fs_base and gs_base fields of user_regs_struct can be
-                used directly.  */
              unsigned long fs;
              errno = 0;
              fs = ptrace (PTRACE_PEEKUSER, lwpid,
@@ -423,12 +372,10 @@ ps_get_thread_area (struct ps_prochandle *ph,
                  return PS_OK;
                }
            }
-#endif
-         if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_FS) == 0)
-           return PS_OK;
+
          break;
+
        case GS:
-#ifdef HAVE_STRUCT_USER_REGS_STRUCT_GS_BASE
            {
              unsigned long gs;
              errno = 0;
@@ -440,10 +387,8 @@ ps_get_thread_area (struct ps_prochandle *ph,
                  return PS_OK;
                }
            }
-#endif
-         if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_GS) == 0)
-           return PS_OK;
          break;
+
        default:                   /* Should not happen.  */
          return PS_BADADDR;
        }
@@ -478,8 +423,9 @@ amd64_linux_nat_target::low_siginfo_fixup (siginfo_t *ptrace,
     return false;
 }
 
+void _initialize_amd64_linux_nat ();
 void
-_initialize_amd64_linux_nat (void)
+_initialize_amd64_linux_nat ()
 {
   amd64_native_gregset32_reg_offset = amd64_linux_gregset32_reg_offset;
   amd64_native_gregset32_num_regs = I386_LINUX_NUM_REGS;