From 24f033e800a318cbfa00f79a06e037c98fe5883f Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Fri, 23 Jul 2004 13:43:36 +0000 Subject: [PATCH] * sparc64obsd-tdep.c (sparc64obsd_pc_in_sigtramp): Adjust for changed signal trampoline in OpenBSD 3.5-current. --- gdb/ChangeLog | 3 +++ gdb/sparc64obsd-tdep.c | 19 ++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d434c5651a7..65eaef06fb6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,8 @@ 2004-07-23 Mark Kettenis + * sparc64obsd-tdep.c (sparc64obsd_pc_in_sigtramp): Adjust for + changed signal trampoline in OpenBSD 3.5-current. + * sparc64nbsd-nat.c: Include "regcache.h", , and "bsd-kvm.h". (sparc64nbsd_supply_pcb): New function. diff --git a/gdb/sparc64obsd-tdep.c b/gdb/sparc64obsd-tdep.c index b74679c1a4f..8ad88b556aa 100644 --- a/gdb/sparc64obsd-tdep.c +++ b/gdb/sparc64obsd-tdep.c @@ -83,17 +83,30 @@ sparc64obsd_pc_in_sigtramp (CORE_ADDR pc, char *name) { CORE_ADDR start_pc = (pc & ~(sparc64obsd_page_size - 1)); unsigned long insn; + int offset = 0; if (name) return 0; + retry: /* Check for "restore %g0, SYS_sigreturn, %g1". */ - insn = sparc_fetch_instruction (start_pc + 0xe8); + insn = sparc_fetch_instruction (start_pc + offset + 0xec); if (insn != 0x83e82067) - return 0; + { + if (offset == 0) + { + /* In OpenBSD 3.5 and earlier releases, the code + implementing the sigreturn system call was at a different + offset within the signal trampoline. Try again. */ + offset = -4; + goto retry; + } + + return 0; + } /* Check for "t ST_SYSCALL". */ - insn = sparc_fetch_instruction (start_pc + 0xf0); + insn = sparc_fetch_instruction (start_pc + offset + 0xf4); if (insn != 0x91d02000) return 0; -- 2.30.2