diff options
Diffstat (limited to 'gnu/usr.bin/binutils/gdb/m68knbsd-nat.c')
-rw-r--r-- | gnu/usr.bin/binutils/gdb/m68knbsd-nat.c | 124 |
1 files changed, 106 insertions, 18 deletions
diff --git a/gnu/usr.bin/binutils/gdb/m68knbsd-nat.c b/gnu/usr.bin/binutils/gdb/m68knbsd-nat.c index c2e71dfb570..c1a604f7045 100644 --- a/gnu/usr.bin/binutils/gdb/m68knbsd-nat.c +++ b/gnu/usr.bin/binutils/gdb/m68knbsd-nat.c @@ -1,5 +1,5 @@ -/* Native-dependent code for Motorola m68k's running NetBSD, for GDB. - Copyright 1988, 1989, 1991, 1992, 1994, 1996 Free Software Foundation, Inc. +/* Functions specific to running gdb native on an m68k running NetBSD + Copyright 1989, 1992, 1993, 1994, 1996 Free Software Foundation, Inc. This file is part of GDB. @@ -19,34 +19,41 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <sys/types.h> #include <sys/ptrace.h> -#include <machine/reg.h> -#include <machine/frame.h> +#include <m68k/reg.h> +#include <m68k/frame.h> +#ifdef __OpenBSD__ +#include <machine/pcb.h> +#else +#include <m68k/pcb.h> +#endif #include "defs.h" #include "inferior.h" +#include "target.h" +#include "gdbcore.h" void -fetch_inferior_registers(regno) +fetch_inferior_registers (regno) int regno; { struct reg inferior_registers; struct fpreg inferior_fp_registers; - ptrace (PT_GETREGS, inferior_pid, + ptrace (PT_GETREGS, inferior_pid, (PTRACE_ARG3_TYPE) &inferior_registers, 0); - memcpy (®isters[REGISTER_BYTE (0)], &inferior_registers, + memcpy (®isters[REGISTER_BYTE (0)], &inferior_registers, sizeof(inferior_registers)); - ptrace (PT_GETFPREGS, inferior_pid, + ptrace (PT_GETFPREGS, inferior_pid, (PTRACE_ARG3_TYPE) &inferior_fp_registers, 0); - memcpy (®isters[REGISTER_BYTE (FP0_REGNUM)], &inferior_fp_registers, + memcpy (®isters[REGISTER_BYTE (FP0_REGNUM)], &inferior_fp_registers, sizeof(inferior_fp_registers)); registers_fetched (); } void -store_inferior_registers(regno) +store_inferior_registers (regno) int regno; { struct reg inferior_registers; @@ -54,33 +61,114 @@ store_inferior_registers(regno) memcpy (&inferior_registers, ®isters[REGISTER_BYTE (0)], sizeof(inferior_registers)); - ptrace (PT_SETREGS, inferior_pid, + ptrace (PT_SETREGS, inferior_pid, (PTRACE_ARG3_TYPE) &inferior_registers, 0); memcpy (&inferior_fp_registers, ®isters[REGISTER_BYTE (FP0_REGNUM)], sizeof(inferior_fp_registers)); - ptrace (PT_SETFPREGS, inferior_pid, + ptrace (PT_SETFPREGS, inferior_pid, (PTRACE_ARG3_TYPE) &inferior_fp_registers, 0); } + +/* XXX - Add this to machine/regs.h instead? */ struct md_core { - struct reg intreg; + struct reg intreg; struct fpreg freg; }; -void -fetch_core_registers (core_reg_sect, core_reg_size, which, ignore) +static void +fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr) char *core_reg_sect; unsigned core_reg_size; int which; - CORE_ADDR ignore; + unsigned int reg_addr; /* Unused in this version */ { - struct md_core *core_reg = (struct md_core *)core_reg_sect; - + struct md_core *core_reg; + + core_reg = (struct md_core *)core_reg_sect; + + /* We get everything from the .reg section. */ + if (which != 0) + return; + + if (core_reg_size < sizeof(*core_reg)) { + fprintf_unfiltered (gdb_stderr, "Couldn't read regs from core file\n"); + return; + } + /* Integer registers */ memcpy(®isters[REGISTER_BYTE (0)], &core_reg->intreg, sizeof(struct reg)); /* Floating point registers */ memcpy(®isters[REGISTER_BYTE (FP0_REGNUM)], &core_reg->freg, sizeof(struct fpreg)); + + registers_fetched (); +} + +/* Register that we are able to handle m68knbsd core file formats. + FIXME: is this really bfd_target_unknown_flavour? */ + +static struct core_fns nat_core_fns = +{ + bfd_target_unknown_flavour, + fetch_core_registers, + NULL +}; + +void +_initialize_m68knbsd_nat () +{ + add_core_fns (&nat_core_fns); +} + + +/* + * kernel_u_size() is not helpful on NetBSD because + * the "u" struct is NOT in the core dump file. + */ + +#ifdef FETCH_KCORE_REGISTERS +/* + * Get registers from a kernel crash dump or live kernel. + * Called by kcore-nbsd.c:get_kcore_registers(). + */ +void +fetch_kcore_registers (pcb) + struct pcb *pcb; +{ + int i, *ip, tmp=0; + + /* D0,D1 */ + ip = &tmp; + supply_register(0, (char *)ip); + supply_register(1, (char *)ip); + /* D2-D7 */ + ip = &pcb->pcb_regs[0]; + for (i = 2; i < 8; i++, ip++) + supply_register(i, (char *)ip); + + /* A0,A1 */ + ip = &tmp; + supply_register(8, (char *)ip); + supply_register(9, (char *)ip); + /* A2-A7 */ + ip = &pcb->pcb_regs[6]; + for (i = 10; i < 16; i++, (char *)ip++) + supply_register(i, (char *)ip); + + /* PS (sr) */ + tmp = pcb->pcb_ps & 0xFFFF; + supply_register(PS_REGNUM, (char *)&tmp); + + /* PC (use return address) */ + tmp = pcb->pcb_regs[10] + 4; + if (target_read_memory(tmp, (char *)&tmp, sizeof(tmp))) + tmp = 0; + supply_register(PC_REGNUM, (char *)&tmp); + + /* The kernel does not use the FPU, so ignore it. */ + registers_fetched (); } +#endif /* FETCH_KCORE_REGISTERS */ |