X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fi386nbsd-nat.c;h=9ef5175400ff46eb876137d1a3aca08a6c48bad5;hb=49b64de6e430e38adcc791398f81a9da0aa95a03;hp=c1d2cd7c733b365f18e440b2f0307c06768ea21c;hpb=d0352a18a504a4e7b761f6b3264cf11347d8d056;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/i386nbsd-nat.c b/gdb/i386nbsd-nat.c index c1d2cd7c73..9ef5175400 100644 --- a/gdb/i386nbsd-nat.c +++ b/gdb/i386nbsd-nat.c @@ -1,12 +1,12 @@ -/* Native-dependent code for NetBSD/i386, for GDB. - Copyright 1988, 1989, 1991, 1992, 1994, 1996, 2000 - Free Software Foundation, Inc. +/* Native-dependent code for NetBSD/i386. + + Copyright (C) 2004-2013 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 + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -15,204 +15,76 @@ 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. */ + along with this program. If not, see . */ #include "defs.h" +#include "gdbcore.h" +#include "regcache.h" +#include "target.h" + +#include "i386-tdep.h" +#include "i386bsd-nat.h" + +/* Support for debugging kernel virtual memory images. */ + #include -#include -#include #include -#include "inferior.h" -#include "gdbcore.h" /* for registers_fetched() */ - -#define RF(dst, src) \ - memcpy(®isters[REGISTER_BYTE(dst)], &src, sizeof(src)) - -#define RS(src, dst) \ - memcpy(&dst, ®isters[REGISTER_BYTE(src)], sizeof(dst)) - -struct env387 - { - unsigned short control; - unsigned short r0; - unsigned short status; - unsigned short r1; - unsigned short tag; - unsigned short r2; - unsigned long eip; - unsigned short code_seg; - unsigned short opcode; - unsigned long operand; - unsigned short operand_seg; - unsigned short r3; - unsigned char regs[8][10]; - }; +#include -void -fetch_inferior_registers (regno) - int regno; -{ - struct reg inferior_registers; - struct env387 inferior_fpregisters; - - ptrace (PT_GETREGS, inferior_pid, - (PTRACE_ARG3_TYPE) &inferior_registers, 0); - ptrace (PT_GETFPREGS, inferior_pid, - (PTRACE_ARG3_TYPE) &inferior_fpregisters, 0); - - RF ( 0, inferior_registers.r_eax); - RF ( 1, inferior_registers.r_ecx); - RF ( 2, inferior_registers.r_edx); - RF ( 3, inferior_registers.r_ebx); - RF ( 4, inferior_registers.r_esp); - RF ( 5, inferior_registers.r_ebp); - RF ( 6, inferior_registers.r_esi); - RF ( 7, inferior_registers.r_edi); - RF ( 8, inferior_registers.r_eip); - RF ( 9, inferior_registers.r_eflags); - RF (10, inferior_registers.r_cs); - RF (11, inferior_registers.r_ss); - RF (12, inferior_registers.r_ds); - RF (13, inferior_registers.r_es); - RF (14, inferior_registers.r_fs); - RF (15, inferior_registers.r_gs); - - RF (FP0_REGNUM, inferior_fpregisters.regs[0]); - RF (FP0_REGNUM + 1, inferior_fpregisters.regs[1]); - RF (FP0_REGNUM + 2, inferior_fpregisters.regs[2]); - RF (FP0_REGNUM + 3, inferior_fpregisters.regs[3]); - RF (FP0_REGNUM + 4, inferior_fpregisters.regs[4]); - RF (FP0_REGNUM + 5, inferior_fpregisters.regs[5]); - RF (FP0_REGNUM + 6, inferior_fpregisters.regs[6]); - RF (FP0_REGNUM + 7, inferior_fpregisters.regs[7]); - - RF (FCTRL_REGNUM, inferior_fpregisters.control); - RF (FSTAT_REGNUM, inferior_fpregisters.status); - RF (FTAG_REGNUM, inferior_fpregisters.tag); - RF (FCS_REGNUM, inferior_fpregisters.code_seg); - RF (FCOFF_REGNUM, inferior_fpregisters.eip); - RF (FDS_REGNUM, inferior_fpregisters.operand_seg); - RF (FDOFF_REGNUM, inferior_fpregisters.operand); - RF (FOP_REGNUM, inferior_fpregisters.opcode); - - registers_fetched (); -} +#include "nbsd-nat.h" +#include "bsd-kvm.h" -void -store_inferior_registers (regno) - int regno; +static int +i386nbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) { - struct reg inferior_registers; - struct env387 inferior_fpregisters; - - RS ( 0, inferior_registers.r_eax); - RS ( 1, inferior_registers.r_ecx); - RS ( 2, inferior_registers.r_edx); - RS ( 3, inferior_registers.r_ebx); - RS ( 4, inferior_registers.r_esp); - RS ( 5, inferior_registers.r_ebp); - RS ( 6, inferior_registers.r_esi); - RS ( 7, inferior_registers.r_edi); - RS ( 8, inferior_registers.r_eip); - RS ( 9, inferior_registers.r_eflags); - RS (10, inferior_registers.r_cs); - RS (11, inferior_registers.r_ss); - RS (12, inferior_registers.r_ds); - RS (13, inferior_registers.r_es); - RS (14, inferior_registers.r_fs); - RS (15, inferior_registers.r_gs); - - - RS (FP0_REGNUM, inferior_fpregisters.regs[0]); - RS (FP0_REGNUM + 1, inferior_fpregisters.regs[1]); - RS (FP0_REGNUM + 2, inferior_fpregisters.regs[2]); - RS (FP0_REGNUM + 3, inferior_fpregisters.regs[3]); - RS (FP0_REGNUM + 4, inferior_fpregisters.regs[4]); - RS (FP0_REGNUM + 5, inferior_fpregisters.regs[5]); - RS (FP0_REGNUM + 6, inferior_fpregisters.regs[6]); - RS (FP0_REGNUM + 7, inferior_fpregisters.regs[7]); - - RS (FCTRL_REGNUM, inferior_fpregisters.control); - RS (FSTAT_REGNUM, inferior_fpregisters.status); - RS (FTAG_REGNUM, inferior_fpregisters.tag); - RS (FCS_REGNUM, inferior_fpregisters.code_seg); - RS (FCOFF_REGNUM, inferior_fpregisters.eip); - RS (FDS_REGNUM, inferior_fpregisters.operand_seg); - RS (FDOFF_REGNUM, inferior_fpregisters.operand); - RS (FOP_REGNUM, inferior_fpregisters.opcode); - - ptrace (PT_SETREGS, inferior_pid, - (PTRACE_ARG3_TYPE) &inferior_registers, 0); - ptrace (PT_SETFPREGS, inferior_pid, - (PTRACE_ARG3_TYPE) &inferior_fpregisters, 0); + struct switchframe sf; + + /* The following is true for NetBSD 1.6.2: + + The pcb contains %esp and %ebp at the point of the context switch + in cpu_switch(). At that point we have a stack frame as + described by `struct switchframe', which for NetBSD 1.6.2 has the + following layout: + + interrupt level + %edi + %esi + %ebx + %eip + + we reconstruct the register state as it would look when we just + returned from cpu_switch(). */ + + /* The stack pointer shouldn't be zero. */ + if (pcb->pcb_esp == 0) + return 0; + + read_memory (pcb->pcb_esp, (gdb_byte *)&sf, sizeof sf); + pcb->pcb_esp += sizeof (struct switchframe); + regcache_raw_supply (regcache, I386_EDI_REGNUM, &sf.sf_edi); + regcache_raw_supply (regcache, I386_ESI_REGNUM, &sf.sf_esi); + regcache_raw_supply (regcache, I386_EBP_REGNUM, &pcb->pcb_ebp); + regcache_raw_supply (regcache, I386_ESP_REGNUM, &pcb->pcb_esp); + regcache_raw_supply (regcache, I386_EBX_REGNUM, &sf.sf_ebx); + regcache_raw_supply (regcache, I386_EIP_REGNUM, &sf.sf_eip); + + return 1; } -int -i386nbsd_use_struct_convention (int gcc_p, struct type *type) -{ - return !(TYPE_LENGTH (type) == 1 - || TYPE_LENGTH (type) == 2 - || TYPE_LENGTH (type) == 4 - || TYPE_LENGTH (type) == 8); -} - -struct md_core -{ - struct reg intreg; - struct env387 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 */ - memcpy (®isters[REGISTER_BYTE (0)], &core_reg->intreg, - sizeof (struct reg)); - - /* floating point registers */ - RF (FP0_REGNUM, core_reg->freg.regs[0]); - RF (FP0_REGNUM + 1, core_reg->freg.regs[1]); - RF (FP0_REGNUM + 2, core_reg->freg.regs[2]); - RF (FP0_REGNUM + 3, core_reg->freg.regs[3]); - RF (FP0_REGNUM + 4, core_reg->freg.regs[4]); - RF (FP0_REGNUM + 5, core_reg->freg.regs[5]); - RF (FP0_REGNUM + 6, core_reg->freg.regs[6]); - RF (FP0_REGNUM + 7, core_reg->freg.regs[7]); - - RF (FCTRL_REGNUM, core_reg->freg.control); - RF (FSTAT_REGNUM, core_reg->freg.status); - RF (FTAG_REGNUM, core_reg->freg.tag); - RF (FCS_REGNUM, core_reg->freg.code_seg); - RF (FCOFF_REGNUM, core_reg->freg.eip); - RF (FDS_REGNUM, core_reg->freg.operand_seg); - RF (FDOFF_REGNUM, core_reg->freg.operand); - RF (FOP_REGNUM, core_reg->freg.opcode); - - registers_fetched (); -} -/* Register that we are able to handle i386nbsd core file formats. - FIXME: is this really bfd_target_unknown_flavour? */ - -static struct core_fns i386nbsd_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 */ -}; +/* Provide a prototype to silence -Wmissing-prototypes. */ +void _initialize_i386nbsd_nat (void); void -_initialize_i386nbsd_nat () +_initialize_i386nbsd_nat (void) { - add_core_fns (&i386nbsd_core_fns); + struct target_ops *t; + + /* Add some extra features to the common *BSD/i386 target. */ + t = i386bsd_target (); + t->to_pid_to_exec_file = nbsd_pid_to_exec_file; + add_target (t); + + /* Support debugging kernel virtual memory images. */ + bsd_kvm_add_target (i386nbsd_supply_pcb); }