From f7db5ce6267b8b54fb71768f6577ef8386d36644 Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Fri, 15 Nov 2002 23:24:21 +0000 Subject: 2002-11-15 Andrew Cagney * frame.h (sigtramp_saved_pc): Delete declaration. * blockframe.c (sigtramp_saved_pc): Delete function. * ns32k-tdep.c (ns32k_sigtramp_saved_pc): New function. (ns32k_frame_saved_pc): Call ns32k_sigtramp_saved_pc. * vax-tdep.c (vax_sigtramp_saved_pc): New function. (vax_frame_saved_pc): Call vax_sigtramp_saved_pc. --- gdb/vax-tdep.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'gdb/vax-tdep.c') diff --git a/gdb/vax-tdep.c b/gdb/vax-tdep.c index e82227fe5e2..b76c4f87473 100644 --- a/gdb/vax-tdep.c +++ b/gdb/vax-tdep.c @@ -157,11 +157,37 @@ vax_frame_init_saved_regs (struct frame_info *frame) frame->saved_regs[PS_REGNUM] = frame->frame + 4; } +/* Get saved user PC for sigtramp from sigcontext for BSD style sigtramp. */ + +static CORE_ADDR +vax_sigtramp_saved_pc (struct frame_info *frame) +{ + CORE_ADDR sigcontext_addr; + char *buf; + int ptrbytes = TYPE_LENGTH (builtin_type_void_func_ptr); + int sigcontext_offs = (2 * TARGET_INT_BIT) / TARGET_CHAR_BIT; + + buf = alloca (ptrbytes); + /* Get sigcontext address, it is the third parameter on the stack. */ + if (frame->next) + sigcontext_addr = read_memory_typed_address + (FRAME_ARGS_ADDRESS (frame->next) + FRAME_ARGS_SKIP + sigcontext_offs, + builtin_type_void_data_ptr); + else + sigcontext_addr = read_memory_typed_address + (read_register (SP_REGNUM) + sigcontext_offs, builtin_type_void_data_ptr); + + /* Don't cause a memory_error when accessing sigcontext in case the stack + layout has changed or the stack is corrupt. */ + target_read_memory (sigcontext_addr + SIGCONTEXT_PC_OFFSET, buf, ptrbytes); + return extract_typed_address (buf, builtin_type_void_func_ptr); +} + static CORE_ADDR vax_frame_saved_pc (struct frame_info *frame) { if (frame->signal_handler_caller) - return (sigtramp_saved_pc (frame)); /* XXXJRT */ + return (vax_sigtramp_saved_pc (frame)); /* XXXJRT */ return (read_memory_integer (frame->frame + 16, 4)); } -- cgit v1.2.1