* gdbarch.sh (software_single_step): Replace REGCACHE argument by
[deliverable/binutils-gdb.git] / gdb / sparc64-linux-tdep.c
index 8e0498e681703ed8fa448f834f93f6fe94673b27..cbeeb218b9e44925c1e569f9b3ad0a20e15b0a1e 100644 (file)
@@ -1,6 +1,6 @@
 /* Target-dependent code for GNU/Linux UltraSPARC.
 
-   Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -22,6 +22,8 @@
 #include "defs.h"
 #include "frame.h"
 #include "frame-unwind.h"
+#include "dwarf2-frame.h"
+#include "regset.h"
 #include "regcache.h"
 #include "gdbarch.h"
 #include "gdbcore.h"
@@ -104,14 +106,11 @@ sparc64_linux_sigframe_init (const struct tramp_frame *self,
    address.  */
 
 static CORE_ADDR
-sparc64_linux_step_trap (unsigned long insn)
+sparc64_linux_step_trap (struct frame_info *frame, unsigned long insn)
 {
   if (insn == 0x91d0206d)
     {
-      ULONGEST sp;
-
-      regcache_cooked_read_unsigned (current_regcache,
-                                    SPARC_SP_REGNUM, &sp);
+      ULONGEST sp = get_frame_register_unsigned (frame, SPARC_SP_REGNUM);
       if (sp & 1)
        sp += BIAS;
 
@@ -131,13 +130,72 @@ sparc64_linux_step_trap (unsigned long insn)
 }
 \f
 
+const struct sparc_gregset sparc64_linux_core_gregset =
+{
+  32 * 8,                      /* %tstate */
+  33 * 8,                      /* %tpc */
+  34 * 8,                      /* %tnpc */
+  35 * 8,                      /* %y */
+  -1,                          /* %wim */
+  -1,                          /* %tbr */
+  1 * 8,                       /* %g1 */
+  16 * 8,                      /* %l0 */
+  8,                           /* y size */
+};
+\f
+
+static void
+sparc64_linux_supply_core_gregset (const struct regset *regset,
+                                  struct regcache *regcache,
+                                  int regnum, const void *gregs, size_t len)
+{
+  sparc64_supply_gregset (&sparc64_linux_core_gregset, regcache, regnum, gregs);
+}
+
+static void
+sparc64_linux_collect_core_gregset (const struct regset *regset,
+                                   const struct regcache *regcache,
+                                   int regnum, void *gregs, size_t len)
+{
+  sparc64_collect_gregset (&sparc64_linux_core_gregset, regcache, regnum, gregs);
+}
+
+static void
+sparc64_linux_supply_core_fpregset (const struct regset *regset,
+                                   struct regcache *regcache,
+                                   int regnum, const void *fpregs, size_t len)
+{
+  sparc64_supply_fpregset (regcache, regnum, fpregs);
+}
+
+static void
+sparc64_linux_collect_core_fpregset (const struct regset *regset,
+                                    const struct regcache *regcache,
+                                    int regnum, void *fpregs, size_t len)
+{
+  sparc64_collect_fpregset (regcache, regnum, fpregs);
+}
+
+\f
+
 static void
 sparc64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
+  tdep->gregset = regset_alloc (gdbarch, sparc64_linux_supply_core_gregset,
+                               sparc64_linux_collect_core_gregset);
+  tdep->sizeof_gregset = 288;
+
+  tdep->fpregset = regset_alloc (gdbarch, sparc64_linux_supply_core_fpregset,
+                                sparc64_linux_collect_core_fpregset);
+  tdep->sizeof_fpregset = 280;
+
   tramp_frame_prepend_unwinder (gdbarch, &sparc64_linux_rt_sigframe);
 
+  /* Hook in the DWARF CFI frame unwinder.  */
+  frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
+
   sparc64_init_abi (info, gdbarch);
 
   /* GNU/Linux has SVR4-style shared libraries...  */
This page took 0.025956 seconds and 4 git commands to generate.