2004-02-14 Andrew Cagney <cagney@redhat.com>
[deliverable/binutils-gdb.git] / gdb / sparc-nat.c
index 09ee7c6471bef512541c99af0c58d6a53e274697..955e65e31400a9efa4676a8620970f9e3331600c 100644 (file)
@@ -1,6 +1,6 @@
 /* Native-dependent code for SPARC.
 
-   Copyright 2003 Free Software Foundation, Inc.
+   Copyright 2003, 2004 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -22,7 +22,9 @@
 #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>
@@ -36,7 +38,7 @@
 
 /* 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,
-   Linux and the various SPARC BSD's.
+   GNU/Linux and the various SPARC BSD's.
 
    First, we need a data structure for use with ptrace(2).  SunOS has
    `struct regs' and `struct fp_status' in <machine/reg.h>.  BSD's
@@ -246,8 +248,64 @@ store_inferior_registers (int regnum)
        return;
     }
 }
+
 \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)
+{
+  unsigned long wcookie = 0;
+  char *buf = (char *)&wcookie;
+
+  gdb_assert (object == TARGET_OBJECT_WCOOKIE);
+  gdb_assert (readbuf && writebuf == NULL);
+
+  if (offset >= sizeof (unsigned long))
+    return -1;
+
+#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.  */
+  {
+    int pid;
+
+    pid = TIDGET (inferior_ptid);
+    if (pid == 0)
+      pid = PIDGET (inferior_ptid);
+
+    /* Sanity check.  The proper type for a cookie is register_t, but
+       we can't assume that this type exists on all systems supported
+       by the code in this file.  */
+    gdb_assert (sizeof (wcookie) == sizeof (register_t));
+
+    /* Fetch the cookie.  */
+    if (ptrace (PT_WCOOKIE, pid, (PTRACE_ARG3_TYPE) &wcookie, 0) == -1)
+      {
+       if (errno != EINVAL)
+         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
+          the kernel doesn't support the PT_WCOOKIE request, assume
+          we're running on a kernel that uses non-randomized cookies.  */
+       wcookie = 0x3;
+      }
+  }
+#endif /* PT_WCOOKIE */
+
+  if (len > sizeof (unsigned long) - offset)
+    len = sizeof (unsigned long) - offset;
+
+  memcpy (readbuf, buf + offset, len);
+  return len;
+}
+
+\f
 /* Provide a prototype to silence -Wmissing-prototypes.  */
 void _initialize_sparc_nat (void);
 
This page took 0.024868 seconds and 4 git commands to generate.