gdb: don't require displaced step copy_insn to be implemented in prepare/finish are
[deliverable/binutils-gdb.git] / gdb / linux-nat-trad.c
index 066d15a352b6a69254432fc61004567390018e50..8b2ca8f884685460f39cf18689be2391ce2736ff 100644 (file)
@@ -1,6 +1,6 @@
 /* Generic GNU/Linux target using traditional ptrace register access.
 
-   Copyright (C) 1988-2018 Free Software Foundation, Inc.
+   Copyright (C) 1988-2020 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -22,6 +22,7 @@
 
 #include "nat/gdb_ptrace.h"
 #include "inf-ptrace.h"
+#include "gdbarch.h"
 
 /* Fetch register REGNUM from the inferior.  */
 
@@ -29,9 +30,10 @@ void
 linux_nat_trad_target::fetch_register (struct regcache *regcache, int regnum)
 {
   struct gdbarch *gdbarch = regcache->arch ();
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR addr;
+  gdb_byte *buf;
   size_t size;
-  PTRACE_TYPE_RET *buf;
   pid_t pid;
   int i;
 
@@ -40,29 +42,32 @@ linux_nat_trad_target::fetch_register (struct regcache *regcache, int regnum)
   if (addr == (CORE_ADDR)-1
       || gdbarch_cannot_fetch_register (gdbarch, regnum))
     {
-      regcache_raw_supply (regcache, regnum, NULL);
+      regcache->raw_supply (regnum, NULL);
       return;
     }
 
-  pid = get_ptrace_pid (regcache_get_ptid (regcache));
+  pid = get_ptrace_pid (regcache->ptid ());
 
   size = register_size (gdbarch, regnum);
-  gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
-  buf = (PTRACE_TYPE_RET *) alloca (size);
+  buf = (gdb_byte *) alloca (size);
 
   /* Read the register contents from the inferior a chunk at a time.  */
-  for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
+  for (i = 0; i < size; i += sizeof (PTRACE_TYPE_RET))
     {
+      size_t chunk = std::min (sizeof (PTRACE_TYPE_RET), size - i);
+      PTRACE_TYPE_RET val;
+
       errno = 0;
-      buf[i] = ptrace (PT_READ_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, 0);
+      val = ptrace (PT_READ_U, pid, (PTRACE_TYPE_ARG3) (uintptr_t) addr, 0);
       if (errno != 0)
        error (_("Couldn't read register %s (#%d): %s."),
               gdbarch_register_name (gdbarch, regnum),
               regnum, safe_strerror (errno));
+      store_unsigned_integer (buf + i, chunk, byte_order, val);
 
       addr += sizeof (PTRACE_TYPE_RET);
     }
-  regcache_raw_supply (regcache, regnum, buf);
+  regcache->raw_supply (regnum, buf);
 }
 
 /* Fetch register REGNUM from the inferior.  If REGNUM is -1, do this
@@ -87,9 +92,10 @@ linux_nat_trad_target::store_register (const struct regcache *regcache,
                                       int regnum)
 {
   struct gdbarch *gdbarch = regcache->arch ();
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR addr;
   size_t size;
-  PTRACE_TYPE_RET *buf;
+  gdb_byte *buf;
   pid_t pid;
   int i;
 
@@ -99,18 +105,21 @@ linux_nat_trad_target::store_register (const struct regcache *regcache,
       || gdbarch_cannot_store_register (gdbarch, regnum))
     return;
 
-  pid = get_ptrace_pid (regcache_get_ptid (regcache));
+  pid = get_ptrace_pid (regcache->ptid ());
 
   size = register_size (gdbarch, regnum);
-  gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
-  buf = (PTRACE_TYPE_RET *) alloca (size);
+  buf = (gdb_byte *) alloca (size);
 
   /* Write the register contents into the inferior a chunk at a time.  */
-  regcache_raw_collect (regcache, regnum, buf);
-  for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
+  regcache->raw_collect (regnum, buf);
+  for (i = 0; i < size; i += sizeof (PTRACE_TYPE_RET))
     {
+      size_t chunk = std::min (sizeof (PTRACE_TYPE_RET), size - i);
+      PTRACE_TYPE_RET val;
+
+      val = extract_unsigned_integer (buf + i, chunk, byte_order);
       errno = 0;
-      ptrace (PT_WRITE_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, buf[i]);
+      ptrace (PT_WRITE_U, pid, (PTRACE_TYPE_ARG3) (uintptr_t) addr, val);
       if (errno != 0)
        error (_("Couldn't write register %s (#%d): %s."),
               gdbarch_register_name (gdbarch, regnum),
This page took 0.039641 seconds and 4 git commands to generate.