From 50c9bd316dea4c2a2103d5856a9a942c999e16ae Mon Sep 17 00:00:00 2001 From: Kevin Buettner Date: Tue, 22 Feb 2000 18:47:41 +0000 Subject: Cleanups and signal handler backtrace fix for GNU/Linux PPC port. --- gdb/ppc-linux-tdep.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'gdb/ppc-linux-tdep.c') diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c index c9a6812..b7182f9 100644 --- a/gdb/ppc-linux-tdep.c +++ b/gdb/ppc-linux-tdep.c @@ -95,6 +95,8 @@ #define PPC_LINUX_PT_FPR31 (PPC_LINUX_PT_FPR0 + 2*31) #define PPC_LINUX_PT_FPSCR (PPC_LINUX_PT_FPR0 + 2*32 + 1) +int ppc_linux_at_sigtramp_return_path (CORE_ADDR pc); + /* Determine if pc is in a signal trampoline... Ha! That's not what this does at all. wait_for_inferior in infrun.c @@ -312,12 +314,19 @@ ppc_linux_frame_saved_pc (struct frame_info *fi) if (fi->signal_handler_caller) { CORE_ADDR regs_addr = - read_memory_integer (fi->frame + PPC_LINUX_REGS_PTR_OFFSET, 4); + read_memory_integer (fi->frame + PPC_LINUX_REGS_PTR_OFFSET, 4); /* return the NIP in the regs array */ return read_memory_integer (regs_addr + 4 * PPC_LINUX_PT_NIP, 4); } - - return rs6000_frame_saved_pc (fi); + else if (fi->next && fi->next->signal_handler_caller) + { + CORE_ADDR regs_addr = + read_memory_integer (fi->next->frame + PPC_LINUX_REGS_PTR_OFFSET, 4); + /* return LNK in the regs array */ + return read_memory_integer (regs_addr + 4 * PPC_LINUX_PT_LNK, 4); + } + else + return rs6000_frame_saved_pc (fi); } void -- cgit v1.1