Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH] Make mips-linux signal frame unwinding more robust.
@ 2010-02-22 18:36 David Daney
  2010-02-25 17:47 ` Joel Brobecker
  0 siblings, 1 reply; 5+ messages in thread
From: David Daney @ 2010-02-22 18:36 UTC (permalink / raw)
  To: gdb-patches; +Cc: Pinski, Andrew

[-- Attachment #1: Type: text/plain, Size: 1070 bytes --]

Greetings,

The current signal frame unwinding code in mips-linux-tdep.c assumes a 
constant offset from the signal return trampoline to the signal frame. 
The assumption does not hold for all kernels.  Specifically those that 
have to be compiled with ICACHE_REFILLS_WORKAROUND_WAR set (SGI O2 for 
example).  In the near future, it is likely that the assumption will 
cease to hold universally, as we are attempting to move the signal 
return trampoline off the stack entirely.

The libgcc unwinder already gets this right by using the signal frame's 
SP to locate the sigcontext.

This patch makes gdb follow suit and find the sigcontext_base using the 
signal frame's SP rather than an offset from the trampoline.

Tested on mips64-linux with no regressions (and more than 100 improvements).

OK to commit?

How about on the 7.1 branch?

2010-02-22  David Daney  <ddaney@caviumnetworks.com>

	* mips-linux-tdep.c: Update struct sigframe comments.
	(mips_linux_o32_sigframe_init): Set sigcontext_base using
	this_frame's sp.
	(mips_linux_n32n64_sigframe_init): Same.

[-- Attachment #2: gdb.patch --]
[-- Type: text/plain, Size: 1691 bytes --]

Index: gdb/mips-linux-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/mips-linux-tdep.c,v
retrieving revision 1.81
diff -u -p -r1.81 mips-linux-tdep.c
--- gdb/mips-linux-tdep.c	1 Jan 2010 07:31:37 -0000	1.81
+++ gdb/mips-linux-tdep.c	19 Feb 2010 21:58:32 -0000
@@ -797,7 +797,7 @@ static const struct tramp_frame mips_lin
 
    struct sigframe {
      u32 sf_ass[4];            [argument save space for o32]
-     u32 sf_code[2];           [signal trampoline]
+     u32 sf_code[2];           [signal trampoline or fill]
      struct sigcontext sf_sc;
      sigset_t sf_mask;
    };
@@ -827,7 +827,7 @@ static const struct tramp_frame mips_lin
 
    struct rt_sigframe {
      u32 rs_ass[4];            [argument save space for o32]
-     u32 rs_code[2]            [signal trampoline]
+     u32 rs_code[2]            [signal trampoline or fill]
      struct siginfo rs_info;
      struct ucontext rs_uc;
    };
@@ -871,7 +871,7 @@ mips_linux_o32_sigframe_init (const stru
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   int ireg, reg_position;
-  CORE_ADDR sigcontext_base = func - SIGFRAME_CODE_OFFSET;
+  CORE_ADDR sigcontext_base = get_frame_sp (this_frame);
   const struct mips_regnum *regs = mips_regnum (gdbarch);
   CORE_ADDR regs_base;
 
@@ -1038,7 +1038,7 @@ mips_linux_n32n64_sigframe_init (const s
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   int ireg, reg_position;
-  CORE_ADDR sigcontext_base = func - SIGFRAME_CODE_OFFSET;
+  CORE_ADDR sigcontext_base =  get_frame_sp (this_frame);
   const struct mips_regnum *regs = mips_regnum (gdbarch);
 
   if (self == &mips_linux_n32_rt_sigframe)

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2010-02-26 20:50 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-02-22 18:36 [PATCH] Make mips-linux signal frame unwinding more robust David Daney
2010-02-25 17:47 ` Joel Brobecker
2010-02-25 18:49   ` David Daney
2010-02-26 18:23     ` David Daney
2010-02-26 20:50       ` Daniel Jacobowitz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox