aboutsummaryrefslogtreecommitdiff
path: root/gdb/alphabsd-nat.c
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2006-07-31 20:15:50 +0000
committerMark Kettenis <kettenis@gnu.org>2006-07-31 20:15:50 +0000
commit4816ec693b135323fdac7646368873c269d8eb8e (patch)
treea4103d85ac167c003d9d4ecd90d5c455361366f4 /gdb/alphabsd-nat.c
parent35d5d4ee3dee63dffe7bba8ae8b00f9d2679932b (diff)
downloadgdb-4816ec693b135323fdac7646368873c269d8eb8e.zip
gdb-4816ec693b135323fdac7646368873c269d8eb8e.tar.gz
gdb-4816ec693b135323fdac7646368873c269d8eb8e.tar.bz2
* alpha-tdep.h (ALPHA_S0_REGNUM): New define.
* alphabsd-nat.c: Include <sys/types.h>, <sys/signal.h>, <machine/pcb.h> and "bsd-kvm.h". (alphabsd_supply_pcb): New function. (_initialize_alphabsd_nat): Enable libkvm interface. * Makefile.in (alphabsd-nat.o): Update dependencies. * config/alpha/fbsd.mh (NATDEPFILES): Add bsd-kvm.o. (LOADLIBES): New variable. * config/alpha/nbsd.mh (NATDEPFILES): Add bsd-kvm.o. (LOADLIBES): New variable.
Diffstat (limited to 'gdb/alphabsd-nat.c')
-rw-r--r--gdb/alphabsd-nat.c40
1 files changed, 39 insertions, 1 deletions
diff --git a/gdb/alphabsd-nat.c b/gdb/alphabsd-nat.c
index 2b8c96d..8db1230 100644
--- a/gdb/alphabsd-nat.c
+++ b/gdb/alphabsd-nat.c
@@ -1,6 +1,7 @@
/* Native-dependent code for Alpha BSD's.
- Copyright (C) 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006
+ Free Software Foundation, Inc.
This file is part of GDB.
@@ -150,6 +151,40 @@ alphabsd_store_inferior_registers (int regno)
perror_with_name (_("Couldn't write floating point status"));
}
}
+
+
+/* Support for debugging kernel virtual memory images. */
+
+#include <sys/types.h>
+#include <sys/signal.h>
+#include <machine/pcb.h>
+
+#include "bsd-kvm.h"
+
+static int
+alphabsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
+{
+ int regnum;
+
+ /* The following is true for OpenBSD 3.9:
+
+ The pcb contains the register state at the context switch inside
+ cpu_switch(). */
+
+ /* The stack pointer shouldn't be zero. */
+ if (pcb->pcb_hw.apcb_ksp == 0)
+ return 0;
+
+ regcache_raw_supply (regcache, ALPHA_SP_REGNUM, &pcb->pcb_hw.apcb_ksp);
+
+ for (regnum = ALPHA_S0_REGNUM; regnum < ALPHA_A0_REGNUM; regnum++)
+ regcache_raw_supply (regcache, regnum,
+ &pcb->pcb_context[regnum - ALPHA_S0_REGNUM]);
+ regcache_raw_supply (regcache, ALPHA_RA_REGNUM, &pcb->pcb_context[7]);
+
+ return 1;
+}
+
/* Provide a prototype to silence -Wmissing-prototypes. */
void _initialize_alphabsd_nat (void);
@@ -163,4 +198,7 @@ _initialize_alphabsd_nat (void)
t->to_fetch_registers = alphabsd_fetch_inferior_registers;
t->to_store_registers = alphabsd_store_inferior_registers;
add_target (t);
+
+ /* Support debugging kernel virtual memory images. */
+ bsd_kvm_add_target (alphabsd_supply_pcb);
}