Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/nathanw_sa]: src/gnu/dist/toolchain/gdb * Clean up the way registers are...
details: https://anonhg.NetBSD.org/src/rev/c66b30826b65
branches: nathanw_sa
changeset: 505447:c66b30826b65
user: thorpej <thorpej%NetBSD.org@localhost>
date: Sun Dec 09 23:29:48 2001 +0000
description:
* Clean up the way registers are provided to the debugger proper.
* Add support for ELF core files.
diffstat:
gnu/dist/toolchain/gdb/m68knbsd-nat.c | 252 ++++++++++++++++++++++++++++++++++
1 files changed, 252 insertions(+), 0 deletions(-)
diffs (256 lines):
diff -r 3ff709bc70a0 -r c66b30826b65 gnu/dist/toolchain/gdb/m68knbsd-nat.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/gnu/dist/toolchain/gdb/m68knbsd-nat.c Sun Dec 09 23:29:48 2001 +0000
@@ -0,0 +1,252 @@
+/* Native-dependent code for Motorola m68k's running NetBSD, for GDB.
+ Copyright 1988, 1989, 1991, 1992, 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 <sys/types.h>
+#include <sys/ptrace.h>
+#include <machine/reg.h>
+#include <machine/frame.h>
+#include <machine/pcb.h>
+
+#include "defs.h"
+#include "inferior.h"
+#include "gdbcore.h"
+
+/* Map GDB register index to ptrace register buffer offset. */
+static const int regmap[] =
+{
+ 0x00, /* d0 */
+ 0x04, /* d1 */
+ 0x08, /* d2 */
+ 0x0c, /* d3 */
+ 0x10, /* d4 */
+ 0x14, /* d5 */
+ 0x18, /* d6 */
+ 0x1c, /* d7 */
+ 0x20, /* a0 */
+ 0x24, /* a1 */
+ 0x28, /* a2 */
+ 0x2c, /* a3 */
+ 0x30, /* a4 */
+ 0x34, /* a5 */
+ 0x38, /* a6 */
+ 0x3c, /* a7 */
+ 0x40, /* sr */
+ 0x44, /* pc */
+};
+
+/* Map GDB FP register index to ptrace FP register buffer offset. */
+static const int fpregmap[] =
+{
+ 0x00, /* fp0 */
+ 0x0c, /* fp1 *
+ 0x18, /* fp2 */
+ 0x24, /* fp3 */
+ 0x30, /* fp4 */
+ 0x3c, /* fp5 */
+ 0x48, /* fp6 */
+ 0x54, /* fp7 */
+ 0x60, /* fpcr */
+ 0x64, /* fpsr */
+ 0x68, /* fpiar */
+};
+
+/* Determine if PT_GETREGS fetches this register. */
+#define GETREGS_SUPPLIES(regno) \
+ ((regno) >= D0_REGNUM && (regno) <= PC_REGNUM)
+
+static void
+supply_regs (regs)
+ char *regs;
+{
+ int i;
+
+ for (i = D0_REGNUM; i <= PC_REGNUM; i++)
+ supply_register (i, regs + regmap[i - D0_REGNUM]);
+}
+
+static void
+supply_fpregs (freg)
+ char *freg;
+{
+ int i;
+
+ for (i = FP0_REGNUM; i <= FPI_REGNUM; i++)
+ supply_register (i, freg + fpregmap[i - FP0_REGNUM]);
+}
+
+void
+fetch_inferior_registers (regno)
+ int regno;
+{
+ struct reg inferior_registers;
+ struct fpreg inferior_fp_registers;
+
+ if (regno == -1 || GETREGS_SUPPLIES (regno))
+ {
+ ptrace (PT_GETREGS, inferior_pid,
+ (PTRACE_ARG3_TYPE) & inferior_registers, 0);
+ supply_regs ((char *) &inferior_registers);
+
+ if (regno != -1)
+ return;
+ }
+
+ ptrace (PT_GETFPREGS, inferior_pid,
+ (PTRACE_ARG3_TYPE) & inferior_fp_registers, 0);
+ supply_fpregs ((char *) &inferior_fp_registers);
+}
+
+void
+store_inferior_registers (regno)
+ int regno;
+{
+ struct reg inferior_registers;
+ struct fpreg inferior_fp_registers;
+
+ memcpy (&inferior_registers, ®isters[REGISTER_BYTE (0)],
+ sizeof (inferior_registers));
+ 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_ARG3_TYPE) & inferior_fp_registers, 0);
+}
+
+struct md_core
+{
+ struct reg intreg;
+ struct fpreg freg;
+};
+
+static void
+fetch_core_registers (core_reg_sect, core_reg_size, which, ignore)
+ char *core_reg_sect;
+ unsigned core_reg_size;
+ int which;
+ CORE_ADDR ignore;
+{
+ struct md_core *core_reg = (struct md_core *) core_reg_sect;
+
+ /* Integer registers */
+ supply_regs ((char *) &core_reg->intreg);
+
+ /* Floating point registers */
+ supply_fpregs ((char *) &core_reg->freg);
+}
+
+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;
+
+ case 2: /* Floating point registers */
+ if (core_reg_size != sizeof (struct fpreg))
+ warning ("Wrong size FP register set in core file.");
+ else
+ supply_fpregs (core_reg_sect);
+ break;
+
+ default:
+ /* Don't know what kind of register request this is; just ignore it. */
+ break;
+ }
+}
+
+#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);
+}
+#endif /* FETCH_KCORE_REGISTERS */
+
+/* Register that we are able to handle m68knbsd core file formats.
+ FIXME: is this really bfd_target_unknown_flavour? */
+
+static struct core_fns m68knbsd_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 m68knbsd_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_m68knbsd_nat ()
+{
+ add_core_fns (&m68knbsd_core_fns);
+ add_core_fns (&m68knbsd_elfcore_fns);
+}
Home |
Main Index |
Thread Index |
Old Index