/* Functions specific to running gdb native on a VAX running NetBSD Copyright 1989, 1992, 1993, 1994, 1996 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 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. */ #include #include #include #include #include #include "defs.h" #include "inferior.h" #include "target.h" #include "gdbcore.h" static void supply_regs (regs) char *regs; { int i; for (i = 0; i < NUM_REGS; i++) supply_register (i, regs + (i * REGISTER_SIZE)); } void fetch_inferior_registers (regno) int regno; { struct reg inferior_registers; ptrace (PT_GETREGS, inferior_pid, (PTRACE_ARG3_TYPE) &inferior_registers, 0); supply_regs ((char *) &inferior_registers); } void store_inferior_registers (regno) int regno; { struct reg inferior_registers; memcpy (&inferior_registers, ®isters[REGISTER_BYTE (0)], sizeof(inferior_registers)); ptrace (PT_SETREGS, inferior_pid, (PTRACE_ARG3_TYPE) &inferior_registers, 0); } /* XXX - Add this to machine/regs.h instead? */ struct md_core { struct trapframe intreg; /* struct fpreg freg; XXX */ }; static void fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr) char *core_reg_sect; unsigned core_reg_size; int which; unsigned int reg_addr; /* Unused in this version */ { struct md_core *core_reg; struct reg 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(®.r0, &core_reg->intreg.r0, sizeof(reg.r0)*12); reg.ap = core_reg->intreg.ap; reg.fp = core_reg->intreg.fp; reg.sp = core_reg->intreg.sp; reg.pc = core_reg->intreg.pc; reg.psl = core_reg->intreg.psl; supply_regs ((char *) ®); } static void fetch_elfcore_registers (core_reg_sect, core_reg_size, which, ignore) char *core_reg_sect; unsigned core_reg_size; int which; CORE_ADDR ignore; { switch (which) { case 0: /* Integer registers */ if (core_reg_size != sizeof (struct reg)) warning ("Wrong size register set in core file."); else supply_regs (core_reg_sect); break; default: /* Don't know what kind of register request this is; just ignore it. */ break; } } /* Register that we are able to handle vaxnbsd core file formats. FIXME: is this really bfd_target_unknown_flavour? */ static struct core_fns vaxnbsd_core_fns = { bfd_target_unknown_flavour, /* core_flavour */ default_check_format, /* check_format */ default_core_sniffer, /* core_sniffer */ fetch_core_registers, /* core_read_registers */ NULL /* next */ }; static struct core_fns vaxnbsd_elfcore_fns = { bfd_target_elf_flavour, /* core_flavour */ default_check_format, /* check_format */ default_core_sniffer, /* core_sniffer */ fetch_elfcore_registers, /* core_read_registers */ NULL /* next */ }; void _initialize_vaxnbsd_nat () { add_core_fns (&vaxnbsd_core_fns); add_core_fns (&vaxnbsd_elfcore_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; { printf("XXX: fetch_kcore_registers\n"); /* The kernel does not use the FPU, so ignore it. */ registers_fetched (); } #endif /* FETCH_KCORE_REGISTERS */