diff options
Diffstat (limited to 'gdb/ns32knbsd-nat.c')
-rw-r--r-- | gdb/ns32knbsd-nat.c | 367 |
1 files changed, 0 insertions, 367 deletions
diff --git a/gdb/ns32knbsd-nat.c b/gdb/ns32knbsd-nat.c deleted file mode 100644 index 520dfe4..0000000 --- a/gdb/ns32knbsd-nat.c +++ /dev/null @@ -1,367 +0,0 @@ -/* Functions specific to running gdb native on an ns32k running NetBSD - - Copyright 1989, 1992, 1993, 1994, 1996, 1998, 1999, 2000, 2001, - 2004 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 "target.h" -#include "gdbcore.h" -#include "regcache.h" - -#define RF(dst, src) \ - memcpy(&deprecated_registers[DEPRECATED_REGISTER_BYTE(dst)], &src, sizeof(src)) - -#define RS(src, dst) \ - memcpy(&dst, &deprecated_registers[DEPRECATED_REGISTER_BYTE(src)], sizeof(dst)) - -void -fetch_inferior_registers (int regno) -{ - struct reg inferior_registers; - struct fpreg inferior_fpregisters; - - ptrace (PT_GETREGS, PIDGET (inferior_ptid), - (PTRACE_TYPE_ARG3) & inferior_registers, 0); - ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), - (PTRACE_TYPE_ARG3) & inferior_fpregisters, 0); - - RF (R0_REGNUM + 0, inferior_registers.r_r0); - RF (R0_REGNUM + 1, inferior_registers.r_r1); - RF (R0_REGNUM + 2, inferior_registers.r_r2); - RF (R0_REGNUM + 3, inferior_registers.r_r3); - RF (R0_REGNUM + 4, inferior_registers.r_r4); - RF (R0_REGNUM + 5, inferior_registers.r_r5); - RF (R0_REGNUM + 6, inferior_registers.r_r6); - RF (R0_REGNUM + 7, inferior_registers.r_r7); - - RF (SP_REGNUM, inferior_registers.r_sp); - RF (DEPRECATED_FP_REGNUM, inferior_registers.r_fp); - RF (PC_REGNUM, inferior_registers.r_pc); - RF (PS_REGNUM, inferior_registers.r_psr); - - RF (FPS_REGNUM, inferior_fpregisters.r_fsr); - RF (FP0_REGNUM + 0, inferior_fpregisters.r_freg[0]); - RF (FP0_REGNUM + 2, inferior_fpregisters.r_freg[2]); - RF (FP0_REGNUM + 4, inferior_fpregisters.r_freg[4]); - RF (FP0_REGNUM + 6, inferior_fpregisters.r_freg[6]); - RF (LP0_REGNUM + 1, inferior_fpregisters.r_freg[1]); - RF (LP0_REGNUM + 3, inferior_fpregisters.r_freg[3]); - RF (LP0_REGNUM + 5, inferior_fpregisters.r_freg[5]); - RF (LP0_REGNUM + 7, inferior_fpregisters.r_freg[7]); - deprecated_registers_fetched (); -} - -void -store_inferior_registers (int regno) -{ - struct reg inferior_registers; - struct fpreg inferior_fpregisters; - - RS (R0_REGNUM + 0, inferior_registers.r_r0); - RS (R0_REGNUM + 1, inferior_registers.r_r1); - RS (R0_REGNUM + 2, inferior_registers.r_r2); - RS (R0_REGNUM + 3, inferior_registers.r_r3); - RS (R0_REGNUM + 4, inferior_registers.r_r4); - RS (R0_REGNUM + 5, inferior_registers.r_r5); - RS (R0_REGNUM + 6, inferior_registers.r_r6); - RS (R0_REGNUM + 7, inferior_registers.r_r7); - - RS (SP_REGNUM, inferior_registers.r_sp); - RS (DEPRECATED_FP_REGNUM, inferior_registers.r_fp); - RS (PC_REGNUM, inferior_registers.r_pc); - RS (PS_REGNUM, inferior_registers.r_psr); - - RS (FPS_REGNUM, inferior_fpregisters.r_fsr); - RS (FP0_REGNUM + 0, inferior_fpregisters.r_freg[0]); - RS (FP0_REGNUM + 2, inferior_fpregisters.r_freg[2]); - RS (FP0_REGNUM + 4, inferior_fpregisters.r_freg[4]); - RS (FP0_REGNUM + 6, inferior_fpregisters.r_freg[6]); - RS (LP0_REGNUM + 1, inferior_fpregisters.r_freg[1]); - RS (LP0_REGNUM + 3, inferior_fpregisters.r_freg[3]); - RS (LP0_REGNUM + 5, inferior_fpregisters.r_freg[5]); - RS (LP0_REGNUM + 7, inferior_fpregisters.r_freg[7]); - - ptrace (PT_SETREGS, PIDGET (inferior_ptid), - (PTRACE_TYPE_ARG3) & inferior_registers, 0); - ptrace (PT_SETFPREGS, PIDGET (inferior_ptid), - (PTRACE_TYPE_ARG3) & inferior_fpregisters, 0); -} - - -/* XXX - Add this to machine/regs.h instead? */ -struct coreregs -{ - struct reg intreg; - struct fpreg freg; -}; - -/* Get registers from a core file. REG_ADDR is unused. */ -static void -fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which, - unsigned int reg_addr) -{ - struct coreregs *core_reg; - - core_reg = (struct coreregs *) core_reg_sect; - - /* - * We have *all* registers - * in the first core section. - * Ignore which. - */ - - if (core_reg_size < sizeof (*core_reg)) - { - fprintf_unfiltered (gdb_stderr, "Couldn't read regs from core file\n"); - return; - } - - /* Integer registers */ - RF (R0_REGNUM + 0, core_reg->intreg.r_r0); - RF (R0_REGNUM + 1, core_reg->intreg.r_r1); - RF (R0_REGNUM + 2, core_reg->intreg.r_r2); - RF (R0_REGNUM + 3, core_reg->intreg.r_r3); - RF (R0_REGNUM + 4, core_reg->intreg.r_r4); - RF (R0_REGNUM + 5, core_reg->intreg.r_r5); - RF (R0_REGNUM + 6, core_reg->intreg.r_r6); - RF (R0_REGNUM + 7, core_reg->intreg.r_r7); - - RF (SP_REGNUM, core_reg->intreg.r_sp); - RF (DEPRECATED_FP_REGNUM, core_reg->intreg.r_fp); - RF (PC_REGNUM, core_reg->intreg.r_pc); - RF (PS_REGNUM, core_reg->intreg.r_psr); - - /* Floating point registers */ - RF (FPS_REGNUM, core_reg->freg.r_fsr); - RF (FP0_REGNUM + 0, core_reg->freg.r_freg[0]); - RF (FP0_REGNUM + 2, core_reg->freg.r_freg[2]); - RF (FP0_REGNUM + 4, core_reg->freg.r_freg[4]); - RF (FP0_REGNUM + 6, core_reg->freg.r_freg[6]); - RF (LP0_REGNUM + 1, core_reg->freg.r_freg[1]); - RF (LP0_REGNUM + 3, core_reg->freg.r_freg[3]); - RF (LP0_REGNUM + 5, core_reg->freg.r_freg[5]); - RF (LP0_REGNUM + 7, core_reg->freg.r_freg[7]); - deprecated_registers_fetched (); -} - -/* Register that we are able to handle ns32knbsd core file formats. - FIXME: is this really bfd_target_unknown_flavour? */ - -static struct core_fns nat_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 */ -}; - -void -_initialize_ns32knbsd_nat (void) -{ - deprecated_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 (struct pcb *pcb) -{ - struct switchframe sf; - struct reg intreg; - int dummy; - - /* Integer registers */ - if (target_read_memory ((CORE_ADDR) pcb->pcb_ksp, (char *) &sf, sizeof sf)) - error ("Cannot read integer registers."); - - /* We use the psr at kernel entry */ - if (target_read_memory ((CORE_ADDR) pcb->pcb_onstack, (char *) &intreg, sizeof intreg)) - error ("Cannot read processor status register."); - - dummy = 0; - RF (R0_REGNUM + 0, dummy); - RF (R0_REGNUM + 1, dummy); - RF (R0_REGNUM + 2, dummy); - RF (R0_REGNUM + 3, sf.sf_r3); - RF (R0_REGNUM + 4, sf.sf_r4); - RF (R0_REGNUM + 5, sf.sf_r5); - RF (R0_REGNUM + 6, sf.sf_r6); - RF (R0_REGNUM + 7, sf.sf_r7); - - dummy = pcb->pcb_kfp + 8; - RF (SP_REGNUM, dummy); - RF (DEPRECATED_FP_REGNUM, sf.sf_fp); - RF (PC_REGNUM, sf.sf_pc); - RF (PS_REGNUM, intreg.r_psr); - - /* Floating point registers */ - RF (FPS_REGNUM, pcb->pcb_fsr); - RF (FP0_REGNUM + 0, pcb->pcb_freg[0]); - RF (FP0_REGNUM + 2, pcb->pcb_freg[2]); - RF (FP0_REGNUM + 4, pcb->pcb_freg[4]); - RF (FP0_REGNUM + 6, pcb->pcb_freg[6]); - RF (LP0_REGNUM + 1, pcb->pcb_freg[1]); - RF (LP0_REGNUM + 3, pcb->pcb_freg[3]); - RF (LP0_REGNUM + 5, pcb->pcb_freg[5]); - RF (LP0_REGNUM + 7, pcb->pcb_freg[7]); - deprecated_registers_fetched (); -} -#endif /* FETCH_KCORE_REGISTERS */ - -void -clear_regs (void) -{ - double zero = 0.0; - int null = 0; - - /* Integer registers */ - RF (R0_REGNUM + 0, null); - RF (R0_REGNUM + 1, null); - RF (R0_REGNUM + 2, null); - RF (R0_REGNUM + 3, null); - RF (R0_REGNUM + 4, null); - RF (R0_REGNUM + 5, null); - RF (R0_REGNUM + 6, null); - RF (R0_REGNUM + 7, null); - - RF (SP_REGNUM, null); - RF (DEPRECATED_FP_REGNUM, null); - RF (PC_REGNUM, null); - RF (PS_REGNUM, null); - - /* Floating point registers */ - RF (FPS_REGNUM, zero); - RF (FP0_REGNUM + 0, zero); - RF (FP0_REGNUM + 2, zero); - RF (FP0_REGNUM + 4, zero); - RF (FP0_REGNUM + 6, zero); - RF (LP0_REGNUM + 0, zero); - RF (LP0_REGNUM + 1, zero); - RF (LP0_REGNUM + 2, zero); - RF (LP0_REGNUM + 3, zero); - return; -} - -/* Return number of args passed to a frame. - Can return -1, meaning no way to tell. */ - -int -frame_num_args (struct frame_info *fi) -{ - CORE_ADDR enter_addr; - CORE_ADDR argp; - int inst; - int args; - int i; - - if (read_memory_integer (fi->frame, 4) == 0 && fi->pc < 0x10000) - { - /* main is always called with three args */ - return (3); - } - enter_addr = ns32k_get_enter_addr (fi->pc); - if (enter_addr = 0) - return (-1); - argp = (enter_addr == 1 - ? DEPRECATED_SAVED_PC_AFTER_CALL (fi) - : DEPRECATED_FRAME_SAVED_PC (fi)); - for (i = 0; i < 16; i++) - { - /* - * After a bsr gcc may emit the following instructions - * to remove the arguments from the stack: - * cmpqd 0,tos - to remove 4 bytes from the stack - * cmpd tos,tos - to remove 8 bytes from the stack - * adjsp[bwd] -n - to remove n bytes from the stack - * Gcc sometimes delays emitting these instructions and - * may even throw a branch between our feet. - */ - inst = read_memory_integer (argp, 4); - args = read_memory_integer (argp + 2, 4); - if ((inst & 0xff) == 0xea) - { /* br */ - args = ((inst >> 8) & 0xffffff) | (args << 24); - if (args & 0x80) - { - if (args & 0x40) - { - args = ntohl (args); - } - else - { - args = ntohs (args & 0xffff); - if (args & 0x2000) - args |= 0xc000; - } - } - else - { - args = args & 0xff; - if (args & 0x40) - args |= 0x80; - } - argp += args; - continue; - } - if ((inst & 0xffff) == 0xb81f) /* cmpqd 0,tos */ - return (1); - else if ((inst & 0xffff) == 0xbdc7) /* cmpd tos,tos */ - return (2); - else if ((inst & 0xfffc) == 0xa57c) - { /* adjsp[bwd] */ - switch (inst & 3) - { - case 0: - args = ((args & 0xff) + 0x80); - break; - case 1: - args = ((ntohs (args) & 0xffff) + 0x8000); - break; - case 3: - args = -ntohl (args); - break; - default: - return (-1); - } - if (args / 4 > 10 || (args & 3) != 0) - continue; - return (args / 4); - } - argp += 1; - } - return (-1); -} |