This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] sigaltstack fixes for hppa-linux


well, only because the hppa sigtramp unwinder is slightly broken :-) for
the sigtramp frame it current uses the sp stored in the sigcontext as
the frame base. instead it should probably use the handler's stack.


here's a fixed version. No frame.c modifications needed :)

one question related to this: i noticed that some of the tests are
failing when:
- a breakpoint is placed in the signal trampoline (e.g. "finish" from the signal handler)
- we try to unwind from the signal trampoline frame


they fail because breakpoints are not yet disabled when the unwinding
starts (get_frame_id() is called early on in handle_inferior_event, which runs through the unwinders)


Are the unwinders that do code matching supposed to deal with the case
where there are breakpoints inserted in the code stream? or does this
point to something else that is broken?

Yes, use frame*memory* and it will work (see tramp-frame.c: tramp_frame_start()) (and yes, having those memory routines possibly include breakpoints is just weird).


Feel free to fix any other HP unwinders with a follow-on commit.

Some suggested tweaks before committing follow:

2004-05-06 Randolph Chung <tausq@debian.org>

* hppa-linux-tdep.c (hppa_linux_sigtramp_find_sigcontext): Pass in pc
instead of sp, handle sigaltstack case.
(hppa_linux_sigtramp_frame_unwind_cache): Adjust calls to hppa_linux_sigtramp_find_sigcontext, and set base to the frame of the
signal handler and not that of the caller.
(hppa_linux_sigtramp_unwind_sniffer): Adjust calls to
hppa_linux_sigtramp_find_sigcontext.


Index: hppa-linux-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/hppa-linux-tdep.c,v
retrieving revision 1.2
diff -u -p -r1.2 hppa-linux-tdep.c
--- hppa-linux-tdep.c	7 May 2004 05:48:49 -0000	1.2
+++ hppa-linux-tdep.c	7 May 2004 06:24:07 -0000
@@ -282,7 +284,7 @@ hppa_linux_skip_trampoline_code (CORE_AD
    Note that with a 2.4 64-bit kernel, the signal context is not properly
    passed back to userspace so the unwind will not work correctly.  */
 static CORE_ADDR
-hppa_linux_sigtramp_find_sigcontext (CORE_ADDR sp)
+hppa_linux_sigtramp_find_sigcontext (CORE_ADDR pc)
 {
   unsigned int dummy[HPPA_MAX_INSN_PATTERN_LEN];
   int offs = 0;
@@ -291,6 +293,12 @@ hppa_linux_sigtramp_find_sigcontext (COR
   static int pcoffs[] = { 0, 4*4, 5*4 };
   /* offsets to the rt_sigframe structure */
   static int sfoffs[] = { 4*4, 10*4, 10*4 };
+  CORE_ADDR sp;
+
+  /* Most of the time, this will be correct.  The one case when this will
+     fail is if the user defined an alternate stack, in which case the
+     beginning of the stack will not be pc & 63.  */
+  sp = (pc & ~63);

Use align_down() (I never trust C's sign extension rules).


Andrew



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]