2004-04-22 Andrew Cagney <cagney@redhat.com>
* ppcnbsd-tdep.c: Update copyright. Include "tramp-frame.h" and "trad-frame.h". (ppcnbsd_sigtramp_cache_init, ppcnbsd_sigtramp): Implement a NetBSD signal trampoline unwinder. (ppcnbsd_init_abi): Register ppcnbsd_sigtramp.
This commit is contained in:
parent
0fdea5ce57
commit
476be15e2e
2 changed files with 67 additions and 1 deletions
|
@ -1,3 +1,11 @@
|
|||
2004-04-22 Andrew Cagney <cagney@redhat.com>
|
||||
|
||||
* ppcnbsd-tdep.c: Update copyright. Include "tramp-frame.h" and
|
||||
"trad-frame.h".
|
||||
(ppcnbsd_sigtramp_cache_init, ppcnbsd_sigtramp): Implement a NetBSD
|
||||
signal trampoline unwinder.
|
||||
(ppcnbsd_init_abi): Register ppcnbsd_sigtramp.
|
||||
|
||||
2004-04-22 Mark Kettenis <kettenis@gnu.org>
|
||||
|
||||
Add OpenBSD/powerpc support.
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
/* Target-dependent code for PowerPC systems running NetBSD.
|
||||
Copyright 2002, 2003 Free Software Foundation, Inc.
|
||||
|
||||
Copyright 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by Wasabi Systems, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
@ -30,6 +32,8 @@
|
|||
#include "ppc-tdep.h"
|
||||
#include "ppcnbsd-tdep.h"
|
||||
#include "nbsd-tdep.h"
|
||||
#include "tramp-frame.h"
|
||||
#include "trad-frame.h"
|
||||
|
||||
#include "solib-svr4.h"
|
||||
|
||||
|
@ -227,6 +231,59 @@ ppcnbsd_return_value (struct gdbarch *gdbarch, struct type *valtype,
|
|||
readbuf, writebuf);
|
||||
}
|
||||
|
||||
static void
|
||||
ppcnbsd_sigtramp_cache_init (const struct tramp_frame *self,
|
||||
struct frame_info *next_frame,
|
||||
struct trad_frame_cache *this_cache,
|
||||
CORE_ADDR func)
|
||||
{
|
||||
CORE_ADDR base;
|
||||
CORE_ADDR offset;
|
||||
int i;
|
||||
struct gdbarch *gdbarch = get_frame_arch (next_frame);
|
||||
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||
|
||||
base = frame_unwind_register_unsigned (next_frame, SP_REGNUM);
|
||||
offset = base + 0x18 + 2 * tdep->wordsize;
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
int regnum = i + tdep->ppc_gp0_regnum;
|
||||
trad_frame_set_reg_addr (this_cache, regnum, offset);
|
||||
offset += tdep->wordsize;
|
||||
}
|
||||
trad_frame_set_reg_addr (this_cache, tdep->ppc_lr_regnum, offset);
|
||||
offset += tdep->wordsize;
|
||||
trad_frame_set_reg_addr (this_cache, tdep->ppc_cr_regnum, offset);
|
||||
offset += tdep->wordsize;
|
||||
trad_frame_set_reg_addr (this_cache, tdep->ppc_xer_regnum, offset);
|
||||
offset += tdep->wordsize;
|
||||
trad_frame_set_reg_addr (this_cache, tdep->ppc_ctr_regnum, offset);
|
||||
offset += tdep->wordsize;
|
||||
trad_frame_set_reg_addr (this_cache, PC_REGNUM, offset); /* SRR0? */
|
||||
offset += tdep->wordsize;
|
||||
|
||||
/* Construct the frame ID using the function start. */
|
||||
trad_frame_set_id (this_cache, frame_id_build (base, func));
|
||||
}
|
||||
|
||||
/* Given the NEXT frame, examine the instructions at and around this
|
||||
frame's resume address (aka PC) to see of they look like a signal
|
||||
trampoline. Return the address of the trampolines first
|
||||
instruction, or zero if it isn't a signal trampoline. */
|
||||
|
||||
static const struct tramp_frame ppcnbsd_sigtramp = {
|
||||
4, /* insn size */
|
||||
{ /* insn */
|
||||
0x38610018, /* addi r3,r1,24 */
|
||||
0x38000127, /* li r0,295 */
|
||||
0x44000002, /* sc */
|
||||
0x38000001, /* li r0,1 */
|
||||
0x44000002, /* sc */
|
||||
TRAMP_SENTINEL_INSN
|
||||
},
|
||||
ppcnbsd_sigtramp_cache_init
|
||||
};
|
||||
|
||||
static void
|
||||
ppcnbsd_init_abi (struct gdbarch_info info,
|
||||
struct gdbarch *gdbarch)
|
||||
|
@ -237,6 +294,7 @@ ppcnbsd_init_abi (struct gdbarch_info info,
|
|||
set_gdbarch_return_value (gdbarch, ppcnbsd_return_value);
|
||||
set_solib_svr4_fetch_link_map_offsets (gdbarch,
|
||||
nbsd_ilp32_solib_svr4_fetch_link_map_offsets);
|
||||
tramp_frame_prepend_unwinder (gdbarch, &ppcnbsd_sigtramp);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
Loading…
Reference in a new issue