From 2c0b250ae4bc8f14a7c5a5e733d57de6c6745d9c Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Tue, 23 Aug 2011 23:17:52 -0700 Subject: [PATCH] Fix jmpbuf unwind checks on sparc64. --- ChangeLog | 8 ++++++++ sysdeps/sparc/sparc64/dl-machine.h | 4 ++-- sysdeps/sparc/sparc64/jmpbuf-unwind.h | 4 ++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3de98c9..f14b70a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2011-08-23 David S. Miller + + * sysdeps/sparc/sparc64/dl-machine.h (DL_STACK_END): Do not + subtract stack bias. + * sysdeps/sparc/sparc64/jmpbuf-unwind.h (_JMPBUF_UNWINDS): Use + %sp not %fp in calculations. + (_JMPBUF_UNWINDS_ADJ): Likewise. + 2011-08-23 Andreas Schwab * sysdeps/i386/i686/multiarch/strspn.S (ENTRY): Add missing diff --git a/sysdeps/sparc/sparc64/dl-machine.h b/sysdeps/sparc/sparc64/dl-machine.h index aaa22d6..3f71a66 100644 --- a/sysdeps/sparc/sparc64/dl-machine.h +++ b/sysdeps/sparc/sparc64/dl-machine.h @@ -264,9 +264,9 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) #define elf_machine_relplt elf_machine_rela /* Undo the sub %sp, 6*8, %sp; add %sp, STACK_BIAS + 22*8, %o0 below - to get at the value we want in __libc_stack_end. */ + (but w/o STACK_BIAS) to get at the value we want in __libc_stack_end. */ #define DL_STACK_END(cookie) \ - ((void *) (((long) (cookie)) - (22 - 6) * 8 - STACK_BIAS)) + ((void *) (((long) (cookie)) - (22 - 6) * 8)) /* Initial entry point code for the dynamic linker. The C function `_dl_start' is the real entry point; diff --git a/sysdeps/sparc/sparc64/jmpbuf-unwind.h b/sysdeps/sparc/sparc64/jmpbuf-unwind.h index f7eed15..f19b649 100644 --- a/sysdeps/sparc/sparc64/jmpbuf-unwind.h +++ b/sysdeps/sparc/sparc64/jmpbuf-unwind.h @@ -24,14 +24,14 @@ /* Test if longjmp to JMPBUF would unwind the frame containing a local variable at ADDRESS. */ #define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \ - ((unsigned long int) (address) < (jmpbuf)->uc_mcontext.mc_fp + 2047) + ((unsigned long int) (address) < (jmpbuf)->uc_mcontext.mc_gregs[MC_O6] + 2047) #define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \ _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj) #define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \ ((uintptr_t) (_address) - (_adj) \ - < (uintptr_t) (_jmpbuf)[0].uc_mcontext.mc_fp + 2047 - (_adj)) + < (uintptr_t) (_jmpbuf)[0].uc_mcontext.mc_gregs[MC_O6] + 2047 - (_adj)) /* We use the normal lobngjmp for unwinding. */ #define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val) -- 2.7.4