diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e28c37d220..aca860a26a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2005-04-09 Mark Kettenis + + * ppcobsd-tdep.c: Update copyright year. Include "trad-frame.h" + and "tramp-frame.h". + (ppcobsd_sigtramp_cache_init): New function. + (ppcobsd_sigtramp): New variable. + (ppcobsd_init_abi): Prepend signal trampoline unwinder. + * Makefile.in (ppcobsd-tdep.o): Update dependencies. + 2005-04-08 Andrew Cagney * MAINTAINERS (GDB/MI): Andrew Cagney, Elena Zannoni, and Fernando diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 2d390af16a..55341be69b 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -2373,8 +2373,9 @@ ppcnbsd-tdep.o: ppcnbsd-tdep.c $(defs_h) $(gdbcore_h) $(regcache_h) \ ppcobsd-nat.o: ppcobsd-nat.c $(defs_h) $(inferior_h) $(regcache_h) \ $(ppc_tdep_h) $(ppcobsd_tdep_h) ppcobsd-tdep.o: ppcobsd-tdep.c $(defs_h) $(arch_utils_h) $(osabi_h) \ - $(regcache_h) $(regset_h) $(gdb_assert_h) $(gdb_string_h) \ - $(ppc_tdep_h) $(ppcobsd_tdep_h) $(solib_svr4_h) + $(regcache_h) $(regset_h) $(trad_frame_h_ $(tramp_frame_h) \ + $(gdb_assert_h) $(gdb_string_h) $(ppc_tdep_h) $(ppcobsd_tdep_h) \ + $(solib_svr4_h) ppc-sysv-tdep.o: ppc-sysv-tdep.c $(defs_h) $(gdbcore_h) $(inferior_h) \ $(regcache_h) $(value_h) $(gdb_string_h) $(gdb_assert_h) \ $(ppc_tdep_h) $(target_h) $(objfiles_h) $(infcall_h) diff --git a/gdb/ppcobsd-tdep.c b/gdb/ppcobsd-tdep.c index 4266bf1590..82e23e66e0 100644 --- a/gdb/ppcobsd-tdep.c +++ b/gdb/ppcobsd-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for OpenBSD/powerpc. - Copyright 2004 Free Software Foundation, Inc. + Copyright 2004, 2005 Free Software Foundation, Inc. This file is part of GDB. @@ -24,8 +24,10 @@ #include "osabi.h" #include "regcache.h" #include "regset.h" -#include "gdb_assert.h" +#include "trad-frame.h" +#include "tramp-frame.h" +#include "gdb_assert.h" #include "gdb_string.h" #include "ppc-tdep.h" @@ -111,6 +113,59 @@ ppcobsd_regset_from_core_section (struct gdbarch *gdbarch, } +/* Signal trampolines. */ + +static void +ppcobsd_sigtramp_cache_init (const struct tramp_frame *self, + struct frame_info *next_frame, + struct trad_frame_cache *this_cache, + CORE_ADDR func) +{ + struct gdbarch *gdbarch = get_frame_arch (next_frame); + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + CORE_ADDR addr, base; + int i; + + base = frame_unwind_register_unsigned (next_frame, SP_REGNUM); + addr = base + 0x18 + 2 * tdep->wordsize; + for (i = 0; i < ppc_num_gprs; i++, addr += tdep->wordsize) + { + int regnum = i + tdep->ppc_gp0_regnum; + trad_frame_set_reg_addr (this_cache, regnum, addr); + } + trad_frame_set_reg_addr (this_cache, tdep->ppc_lr_regnum, addr); + addr += tdep->wordsize; + trad_frame_set_reg_addr (this_cache, tdep->ppc_cr_regnum, addr); + addr += tdep->wordsize; + trad_frame_set_reg_addr (this_cache, tdep->ppc_xer_regnum, addr); + addr += tdep->wordsize; + trad_frame_set_reg_addr (this_cache, tdep->ppc_ctr_regnum, addr); + addr += tdep->wordsize; + trad_frame_set_reg_addr (this_cache, PC_REGNUM, addr); /* SRR0? */ + addr += tdep->wordsize; + + /* Construct the frame ID using the function start. */ + trad_frame_set_id (this_cache, frame_id_build (base, func)); +} + +static const struct tramp_frame ppcobsd_sigtramp = +{ + SIGTRAMP_FRAME, + 4, + { + { 0x3821fff0, -1 }, /* add r1,r1,-16 */ + { 0x4e800021, -1 }, /* blrl */ + { 0x38610018, -1 }, /* addi r3,r1,24 */ + { 0x38000067, -1 }, /* li r0,103 */ + { 0x44000002, -1 }, /* sc */ + { 0x38000001, -1 }, /* li r0,1 */ + { 0x44000002, -1 }, /* sc */ + { TRAMP_SENTINEL_INSN, -1 } + }, + ppcobsd_sigtramp_cache_init +}; + + static void ppcobsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { @@ -120,6 +175,8 @@ ppcobsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_regset_from_core_section (gdbarch, ppcobsd_regset_from_core_section); + + tramp_frame_prepend_unwinder (gdbarch, &ppcobsd_sigtramp); }