Automatic date update in version.in
[deliverable/binutils-gdb.git] / gdb / sparc-nat.c
index 955e65e31400a9efa4676a8620970f9e3331600c..9b7691337713286d5fc1cb8c7cefc93100d53ac6 100644 (file)
@@ -1,12 +1,12 @@
 /* Native-dependent code for SPARC.
 
-   Copyright 2003, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2003-2019 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "inferior.h"
 #include "regcache.h"
 #include "target.h"
 
-#include "gdb_assert.h"
 #include <signal.h>
-#include "gdb_string.h"
 #include <sys/ptrace.h>
-#include "gdb_wait.h"
+#include "gdbsupport/gdb_wait.h"
 #ifdef HAVE_MACHINE_REG_H
 #include <machine/reg.h>
 #endif
 
 #include "sparc-tdep.h"
 #include "sparc-nat.h"
+#include "inf-ptrace.h"
 
 /* With some trickery we can use the code in this file for most (if
    not all) ptrace(2) based SPARC systems, which includes SunOS 4,
@@ -82,20 +79,23 @@ typedef struct fp_status fpregset_t;
 #endif
 
 /* Register set description.  */
-const struct sparc_gregset *sparc_gregset;
-void (*sparc_supply_gregset) (const struct sparc_gregset *,
+const struct sparc_gregmap *sparc_gregmap;
+const struct sparc_fpregmap *sparc_fpregmap;
+void (*sparc_supply_gregset) (const struct sparc_gregmap *,
                              struct regcache *, int , const void *);
-void (*sparc_collect_gregset) (const struct sparc_gregset *,
+void (*sparc_collect_gregset) (const struct sparc_gregmap *,
                               const struct regcache *, int, void *);
-void (*sparc_supply_fpregset) (struct regcache *, int , const void *);
-void (*sparc_collect_fpregset) (const struct regcache *, int , void *);
-int (*sparc_gregset_supplies_p) (int);
-int (*sparc_fpregset_supplies_p) (int);
+void (*sparc_supply_fpregset) (const struct sparc_fpregmap *,
+                              struct regcache *, int , const void *);
+void (*sparc_collect_fpregset) (const struct sparc_fpregmap *,
+                               const struct regcache *, int , void *);
+int (*sparc_gregset_supplies_p) (struct gdbarch *, int);
+int (*sparc_fpregset_supplies_p) (struct gdbarch *, int);
 
 /* Determine whether `gregset_t' contains register REGNUM.  */
 
 int
-sparc32_gregset_supplies_p (int regnum)
+sparc32_gregset_supplies_p (struct gdbarch *gdbarch, int regnum)
 {
   /* Integer registers.  */
   if ((regnum >= SPARC_G1_REGNUM && regnum <= SPARC_G7_REGNUM)
@@ -117,7 +117,7 @@ sparc32_gregset_supplies_p (int regnum)
 /* Determine whether `fpregset_t' contains register REGNUM.  */
 
 int
-sparc32_fpregset_supplies_p (int regnum)
+sparc32_fpregset_supplies_p (struct gdbarch *gdbarch, int regnum)
 {
   /* Floating-point registers.  */
   if (regnum >= SPARC_F0_REGNUM && regnum <= SPARC_F31_REGNUM)
@@ -134,10 +134,10 @@ sparc32_fpregset_supplies_p (int regnum)
    for all registers (including the floating-point registers).  */
 
 void
-fetch_inferior_registers (int regnum)
+sparc_fetch_inferior_registers (struct regcache *regcache, int regnum)
 {
-  struct regcache *regcache = current_regcache;
-  int pid;
+  struct gdbarch *gdbarch = regcache->arch ();
+  pid_t pid;
 
   /* NOTE: cagney/2002-12-03: This code assumes that the currently
      selected light weight processes' registers can be written
@@ -149,65 +149,63 @@ fetch_inferior_registers (int regnum)
      belong to the selected thread (the LWP could be in the middle of
      executing the thread switch code).
 
-     These functions should instead be paramaterized with an explicit
+     These functions should instead be parameterized with an explicit
      object (struct regcache, struct thread_info?) into which the LWPs
      registers can be written.  */
-  pid = TIDGET (inferior_ptid);
-  if (pid == 0)
-    pid = PIDGET (inferior_ptid);
+  pid = get_ptrace_pid (regcache->ptid ());
 
   if (regnum == SPARC_G0_REGNUM)
     {
-      regcache_raw_supply (regcache, SPARC_G0_REGNUM, NULL);
+      gdb_byte zero[8] = { 0 };
+
+      regcache->raw_supply (SPARC_G0_REGNUM, &zero);
       return;
     }
 
-  if (regnum == -1 || sparc_gregset_supplies_p (regnum))
+  if (regnum == -1 || sparc_gregset_supplies_p (gdbarch, regnum))
     {
       gregset_t regs;
 
-      if (ptrace (PTRACE_GETREGS, pid, (PTRACE_ARG3_TYPE) &regs, 0) == -1)
-       perror_with_name ("Couldn't get registers");
+      if (ptrace (PTRACE_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
+       perror_with_name (_("Couldn't get registers"));
 
-      sparc_supply_gregset (sparc_gregset, regcache, -1, &regs);
+      sparc_supply_gregset (sparc_gregmap, regcache, -1, &regs);
       if (regnum != -1)
        return;
     }
 
-  if (regnum == -1 || sparc_fpregset_supplies_p (regnum))
+  if (regnum == -1 || sparc_fpregset_supplies_p (gdbarch, regnum))
     {
       fpregset_t fpregs;
 
-      if (ptrace (PTRACE_GETFPREGS, pid, (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
-       perror_with_name ("Couldn't get floating point status");
+      if (ptrace (PTRACE_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
+       perror_with_name (_("Couldn't get floating point status"));
 
-      sparc_supply_fpregset (regcache, -1, &fpregs);
+      sparc_supply_fpregset (sparc_fpregmap, regcache, -1, &fpregs);
     }
 }
 
 void
-store_inferior_registers (int regnum)
+sparc_store_inferior_registers (struct regcache *regcache, int regnum)
 {
-  struct regcache *regcache = current_regcache;
-  int pid;
+  struct gdbarch *gdbarch = regcache->arch ();
+  pid_t pid;
 
   /* NOTE: cagney/2002-12-02: See comment in fetch_inferior_registers
      about threaded assumptions.  */
-  pid = TIDGET (inferior_ptid);
-  if (pid == 0)
-    pid = PIDGET (inferior_ptid);
+  pid = get_ptrace_pid (regcache->ptid ());
 
-  if (regnum == -1 || sparc_gregset_supplies_p (regnum))
+  if (regnum == -1 || sparc_gregset_supplies_p (gdbarch, regnum))
     {
       gregset_t regs;
 
-      if (ptrace (PTRACE_GETREGS, pid, (PTRACE_ARG3_TYPE) &regs, 0) == -1)
-       perror_with_name ("Couldn't get registers");
+      if (ptrace (PTRACE_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
+       perror_with_name (_("Couldn't get registers"));
 
-      sparc_collect_gregset (sparc_gregset, regcache, regnum, &regs);
+      sparc_collect_gregset (sparc_gregmap, regcache, regnum, &regs);
 
-      if (ptrace (PTRACE_SETREGS, pid, (PTRACE_ARG3_TYPE) &regs, 0) == -1)
-       perror_with_name ("Couldn't write registers");
+      if (ptrace (PTRACE_SETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
+       perror_with_name (_("Couldn't write registers"));
 
       /* Deal with the stack regs.  */
       if (regnum == -1 || regnum == SPARC_SP_REGNUM
@@ -223,15 +221,15 @@ store_inferior_registers (int regnum)
        return;
     }
 
-  if (regnum == -1 || sparc_fpregset_supplies_p (regnum))
+  if (regnum == -1 || sparc_fpregset_supplies_p (gdbarch, regnum))
     {
       fpregset_t fpregs, saved_fpregs;
 
-      if (ptrace (PTRACE_GETFPREGS, pid, (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
-       perror_with_name ("Couldn't get floating-point registers");
+      if (ptrace (PTRACE_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
+       perror_with_name (_("Couldn't get floating-point registers"));
 
       memcpy (&saved_fpregs, &fpregs, sizeof (fpregs));
-      sparc_collect_fpregset (regcache, regnum, &fpregs);
+      sparc_collect_fpregset (sparc_fpregmap, regcache, regnum, &fpregs);
 
       /* Writing the floating-point registers will fail on NetBSD with
         EINVAL if the inferior process doesn't have an FPU state
@@ -240,8 +238,8 @@ store_inferior_registers (int regnum)
       if (memcmp (&saved_fpregs, &fpregs, sizeof (fpregs)) != 0)
        {
          if (ptrace (PTRACE_SETFPREGS, pid,
-                     (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
-           perror_with_name ("Couldn't write floating-point registers");
+                     (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
+           perror_with_name (_("Couldn't write floating-point registers"));
        }
 
       if (regnum != -1)
@@ -250,12 +248,14 @@ store_inferior_registers (int regnum)
 }
 
 \f
-/* Fetch StackGhost Per-Process XOR cookie.  */
-
-LONGEST
-sparc_xfer_wcookie (struct target_ops *ops, enum target_object object,
-                   const char *annex, void *readbuf, const void *writebuf,
-                   ULONGEST offset, LONGEST len)
+/* Implement the to_xfer_partial target_ops method for
+   TARGET_OBJECT_WCOOKIE.  Fetch StackGhost Per-Process XOR cookie.  */
+
+enum target_xfer_status
+sparc_xfer_wcookie (enum target_object object,
+                   const char *annex, gdb_byte *readbuf,
+                   const gdb_byte *writebuf, ULONGEST offset, ULONGEST len,
+                   ULONGEST *xfered_len)
 {
   unsigned long wcookie = 0;
   char *buf = (char *)&wcookie;
@@ -263,20 +263,18 @@ sparc_xfer_wcookie (struct target_ops *ops, enum target_object object,
   gdb_assert (object == TARGET_OBJECT_WCOOKIE);
   gdb_assert (readbuf && writebuf == NULL);
 
-  if (offset >= sizeof (unsigned long))
-    return -1;
+  if (offset == sizeof (unsigned long))
+    return TARGET_XFER_EOF;                    /* Signal EOF.  */
+  if (offset > sizeof (unsigned long))
+    return TARGET_XFER_E_IO;
 
 #ifdef PT_WCOOKIE
   /* If PT_WCOOKIE is defined (by <sys/ptrace.h>), assume we're
      running on an OpenBSD release that uses StackGhost (3.1 or
-     later).  As of release 3.4, OpenBSD doesn't use a randomized
-     cookie yet, but a future release probably will.  */
+     later).  Since release 3.6, OpenBSD uses a fully randomized
+     cookie.  */
   {
-    int pid;
-
-    pid = TIDGET (inferior_ptid);
-    if (pid == 0)
-      pid = PIDGET (inferior_ptid);
+    int pid = inferior_ptid.pid ();
 
     /* Sanity check.  The proper type for a cookie is register_t, but
        we can't assume that this type exists on all systems supported
@@ -284,10 +282,10 @@ sparc_xfer_wcookie (struct target_ops *ops, enum target_object object,
     gdb_assert (sizeof (wcookie) == sizeof (register_t));
 
     /* Fetch the cookie.  */
-    if (ptrace (PT_WCOOKIE, pid, (PTRACE_ARG3_TYPE) &wcookie, 0) == -1)
+    if (ptrace (PT_WCOOKIE, pid, (PTRACE_TYPE_ARG3) &wcookie, 0) == -1)
       {
        if (errno != EINVAL)
-         perror_with_name ("Couldn't get StackGhost cookie");
+         perror_with_name (_("Couldn't get StackGhost cookie"));
 
        /* Although PT_WCOOKIE is defined on OpenBSD 3.1 and later,
           the request wasn't implemented until after OpenBSD 3.4.  If
@@ -302,19 +300,19 @@ sparc_xfer_wcookie (struct target_ops *ops, enum target_object object,
     len = sizeof (unsigned long) - offset;
 
   memcpy (readbuf, buf + offset, len);
-  return len;
+  *xfered_len = (ULONGEST) len;
+  return TARGET_XFER_OK;
 }
-
 \f
-/* Provide a prototype to silence -Wmissing-prototypes.  */
-void _initialize_sparc_nat (void);
 
 void
 _initialize_sparc_nat (void)
 {
-  /* Deafult to using SunOS 4 register sets.  */
-  if (sparc_gregset == NULL)
-    sparc_gregset = &sparc32_sunos4_gregset;
+  /* Default to using SunOS 4 register sets.  */
+  if (sparc_gregmap == NULL)
+    sparc_gregmap = &sparc32_sunos4_gregmap;
+  if (sparc_fpregmap == NULL)
+    sparc_fpregmap = &sparc32_sunos4_fpregmap;
   if (sparc_supply_gregset == NULL)
     sparc_supply_gregset = sparc32_supply_gregset;
   if (sparc_collect_gregset == NULL)
This page took 0.028831 seconds and 4 git commands to generate.