Reviewed by Daniel Jacobowitz <drow@false.org>
[deliverable/binutils-gdb.git] / gdb / sparc64fbsd-nat.c
index 8cbcc38f451e5aa5eb0ba8b8b703960cf4e2ebdb..fc22ad6c94af8601c8237aa188fb163652535e8a 100644 (file)
@@ -1,6 +1,6 @@
 /* Native-dependent code for FreeBSD/sparc64.
 
-   Copyright 2003 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
    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.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #include "defs.h"
+#include "regcache.h"
+#include "target.h"
 
+#include "fbsd-nat.h"
 #include "sparc64-tdep.h"
-#include "sparcbsd-nat.h"
+#include "sparc-nat.h"
+\f
 
-/* Determine whether `struct reg' contains register REGNUM.  */
+/* Support for debugging kernel virtual memory images.  */
 
-static int
-sparc64fbsd_reg_supplies_p (int regnum)
-{
-  /* Integer registers.  */
-  if ((regnum >= SPARC_G0_REGNUM && regnum <= SPARC_G7_REGNUM)
-      || (regnum >= SPARC_O0_REGNUM && regnum <= SPARC_O7_REGNUM)
-      || (regnum >= SPARC_L0_REGNUM && regnum <= SPARC_L7_REGNUM)
-      || (regnum >= SPARC_I0_REGNUM && regnum <= SPARC_I7_REGNUM))
-    return 1;
-
-  /* Control registers.  */
-  if (regnum == SPARC64_PC_REGNUM
-      || regnum == SPARC64_NPC_REGNUM
-      || regnum == SPARC64_STATE_REGNUM
-      || regnum == SPARC64_FPRS_REGNUM
-      || regnum == SPARC64_Y_REGNUM)
-    return 1;
-
-  return 0;
-}
+#include <sys/types.h>
+#include <machine/pcb.h>
 
-/* Determine whether `struct fpreg' contains register REGNUM.  */
+#include "bsd-kvm.h"
 
 static int
-sparc64fbsd_fpreg_supplies_p (int regnum)
+sparc64fbsd_kvm_supply_pcb (struct regcache *regcache, struct pcb *pcb)
 {
-  /* Floating-point registers.  */
-  if ((regnum >= SPARC_F0_REGNUM && regnum <= SPARC_F31_REGNUM)
-      || (regnum >= SPARC64_F32_REGNUM && regnum <= SPARC64_F62_REGNUM))
-    return 1;
+  /* The following is true for FreeBSD 5.4:
+
+     The pcb contains %sp and %pc.  Since the register windows are
+     explicitly flushed, we can find the `local' and `in' registers on
+     the stack.  */
+
+  /* The stack pointer shouldn't be zero.  */
+  if (pcb->pcb_sp == 0)
+    return 0;
 
-  /* Control registers.  */
-  if (regnum == SPARC64_FSR_REGNUM)
-    return 1;
+  regcache_raw_supply (regcache, SPARC_SP_REGNUM, &pcb->pcb_sp);
+  regcache_raw_supply (regcache, SPARC64_PC_REGNUM, &pcb->pcb_pc);
 
-  return 0;
+  /* Synthesize %npc.  */
+  pcb->pcb_pc += 4;
+  regcache_raw_supply (regcache, SPARC64_NPC_REGNUM, &pcb->pcb_pc);
+
+  /* Read `local' and `in' registers from the stack.  */
+  sparc_supply_rwindow (regcache, pcb->pcb_sp, -1);
+
+  return 1;
 }
+\f
 
 /* Provide a prototype to silence -Wmissing-prototypes.  */
 void _initialize_sparc64fbsd_nat (void);
@@ -70,11 +68,17 @@ void _initialize_sparc64fbsd_nat (void);
 void
 _initialize_sparc64fbsd_nat (void)
 {
-  sparcbsd_supply_reg = sparc64fbsd_supply_reg;
-  sparcbsd_fill_reg = sparc64fbsd_fill_reg;
-  sparcbsd_supply_fpreg = sparc64fbsd_supply_fpreg;
-  sparcbsd_fill_fpreg = sparc64fbsd_fill_fpreg;
+  struct target_ops *t;
+
+  /* Add some extra features to the generic SPARC target.  */
+  t = sparc_target ();
+  t->to_pid_to_exec_file = fbsd_pid_to_exec_file;
+  t->to_find_memory_regions = fbsd_find_memory_regions;
+  t->to_make_corefile_notes = fbsd_make_corefile_notes;
+  add_target (t);
+
+  sparc_gregset = &sparc64fbsd_gregset;
 
-  sparcbsd_reg_supplies_p = sparc64fbsd_reg_supplies_p;
-  sparcbsd_fpreg_supplies_p = sparc64fbsd_reg_supplies_p;
+  /* Support debugging kernel virtual memory images.  */
+  bsd_kvm_add_target (sparc64fbsd_kvm_supply_pcb);
 }
This page took 0.02681 seconds and 4 git commands to generate.