summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2006-01-02 20:57:43 +0000
committerUlrich Drepper <drepper@redhat.com>2006-01-02 20:57:43 +0000
commit305bb37e1e4d39fe9e515fc5543fefea7c4e9653 (patch)
treeb6ffe62a76de136c56c8c6ca43394bb48546a019
parentcc792128be8ee299212c43b1c34f4433e257a7e6 (diff)
* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h (PTR_MANGLE,cvs/fedora-glibc-20060102T2114
PTR_MANGLE2, PTR_DEMANGLE, PTR_DEMANGLE2): Define. * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h (PTR_MANGLE, PTR_MANGLE2, PTR_DEMANGLE, PTR_DEMANGLE2): Define. * sysdeps/unix/sysv/linux/sparc/bits/setjmp.h [__WORDSIZE == 64] (_JMPBUF_UNWINDS): Don't demangle uc_mcontext.mc_fp. * sysdeps/sparc/sparc32/setjmp.S (__sigsetjmp): Mangle %fp, %sp and %o7. * sysdeps/sparc/sparc32/__longjmp.S (__longjmp): Demangle %fp, %sp and %o7. 2006-01-02 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h (PTR_MANGLE2): Define. * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h (PTR_MANGLE2): Likewise. * sysdeps/s390/s390-32/__longjmp.c (__longjmp): Demangle also %r15. * sysdeps/s390/s390-64/__longjmp.c (__longjmp): Likewise. * sysdeps/s390/s390-32/setjmp.S (__sigsetjmp): Mangle also %r15. * sysdeps/s390/s390-32/elf/setjmp.S (__sigsetjmp): Likewise. * sysdeps/s390/s390-64/setjmp.S (__sigsetjmp): Likewise. * sysdeps/s390/s390-64/elf/setjmp.S (__sigsetjmp): Likewise. * sysdeps/s390/bits/setjmp.h (__jmp_buf): Add __s390_jmp_buf struct tag to make C++ happy. 2006-01-02 Ulrich Drepper <drepper@redhat.com> * posix/Makefile ($(objpfx)annexc.out): Move -I.. to the end of the include list.
-rw-r--r--ChangeLog34
-rw-r--r--localedata/ChangeLog5
-rw-r--r--localedata/locales/fi_FI2
-rw-r--r--localedata/locales/mn_MN6
-rw-r--r--nptl/ChangeLog8
-rw-r--r--nptl/sysdeps/sparc/sparc64/jmpbuf-unwind.h15
-rw-r--r--nptl/sysdeps/sparc/tcb-offsets.sym1
-rw-r--r--nptl/sysdeps/sparc/tls.h11
-rw-r--r--posix/Makefile4
-rw-r--r--sysdeps/s390/bits/setjmp.h2
-rw-r--r--sysdeps/s390/s390-32/__longjmp.c28
-rw-r--r--sysdeps/s390/s390-32/elf/setjmp.S7
-rw-r--r--sysdeps/s390/s390-32/setjmp.S7
-rw-r--r--sysdeps/s390/s390-64/__longjmp.c28
-rw-r--r--sysdeps/s390/s390-64/elf/setjmp.S7
-rw-r--r--sysdeps/s390/s390-64/setjmp.S7
-rw-r--r--sysdeps/sparc/sparc32/__longjmp.S20
-rw-r--r--sysdeps/sparc/sparc32/setjmp.S12
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h2
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h2
-rw-r--r--sysdeps/unix/sysv/linux/sparc/bits/setjmp.h5
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h22
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h20
23 files changed, 197 insertions, 58 deletions
diff --git a/ChangeLog b/ChangeLog
index e5e1276abf..ed01b76522 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,37 @@
+2006-01-02 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h (PTR_MANGLE,
+ PTR_MANGLE2, PTR_DEMANGLE, PTR_DEMANGLE2): Define.
+ * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h (PTR_MANGLE,
+ PTR_MANGLE2, PTR_DEMANGLE, PTR_DEMANGLE2): Define.
+ * sysdeps/unix/sysv/linux/sparc/bits/setjmp.h [__WORDSIZE == 64]
+ (_JMPBUF_UNWINDS): Don't demangle uc_mcontext.mc_fp.
+ * sysdeps/sparc/sparc32/setjmp.S (__sigsetjmp): Mangle %fp, %sp
+ and %o7.
+ * sysdeps/sparc/sparc32/__longjmp.S (__longjmp): Demangle %fp, %sp
+ and %o7.
+
+2006-01-02 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h (PTR_MANGLE2):
+ Define.
+ * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h (PTR_MANGLE2):
+ Likewise.
+ * sysdeps/s390/s390-32/__longjmp.c (__longjmp): Demangle also %r15.
+ * sysdeps/s390/s390-64/__longjmp.c (__longjmp): Likewise.
+ * sysdeps/s390/s390-32/setjmp.S (__sigsetjmp): Mangle also %r15.
+ * sysdeps/s390/s390-32/elf/setjmp.S (__sigsetjmp): Likewise.
+ * sysdeps/s390/s390-64/setjmp.S (__sigsetjmp): Likewise.
+ * sysdeps/s390/s390-64/elf/setjmp.S (__sigsetjmp): Likewise.
+
+ * sysdeps/s390/bits/setjmp.h (__jmp_buf): Add __s390_jmp_buf
+ struct tag to make C++ happy.
+
+2006-01-02 Ulrich Drepper <drepper@redhat.com>
+
+ * posix/Makefile ($(objpfx)annexc.out): Move -I.. to the end of
+ the include list.
+
2006-01-01 Ulrich Drepper <drepper@redhat.com>
* posix/getconf.c: Update copyright year.
diff --git a/localedata/ChangeLog b/localedata/ChangeLog
index ad32e0bb52..67a60bd8be 100644
--- a/localedata/ChangeLog
+++ b/localedata/ChangeLog
@@ -1,3 +1,8 @@
+2006-01-02 Andreas Jaeger <aj@suse.de>
+
+ * locales/fi_FI: Fix date_fmt.
+ * locales/mn_MN: Likewise.
+
2005-11-21 Ulrich Drepper <drepper@redhat.com>
* locales/se_NO: Remove RCS ID line.
diff --git a/localedata/locales/fi_FI b/localedata/locales/fi_FI
index 5cc7aff454..f657480d59 100644
--- a/localedata/locales/fi_FI
+++ b/localedata/locales/fi_FI
@@ -2188,7 +2188,7 @@ d_fmt "<U0025><U0064><U002E><U0025><U006D><U002E><U0025><U0059>"
t_fmt "<U0025><U0054>"
am_pm "";""
t_fmt_ampm ""
-date_fmt "<U0025><U0061><U0020><U0025><U002D><U0064><U002E><U0025>\
+date_fmt "<U0025><U0061><U0020><U0025><U002D><U0064><U002E><U0025>/
<U002D><U006D><U002E><U0025><U0059><U0020><U0025><U0054><U0020><U0025><U007A>"
first_weekday 2 % Monday
first_workday 2 % Monday
diff --git a/localedata/locales/mn_MN b/localedata/locales/mn_MN
index 2921487314..82c1d2a12c 100644
--- a/localedata/locales/mn_MN
+++ b/localedata/locales/mn_MN
@@ -102,7 +102,7 @@ include "translit_combining";""
<U042A> "<U0022>" % "
<U042B> "<U0059>"
<U042C> "<U0027>" % '
-<U042D> "<U0045>"
+<U042D> "<U0045>"
<U042E> "<U0059><U0075>" % Yu
<U042F> "<U0059><U0061>" % Ya
% CYRILLIC SMALL LETTERS IN ALPHABETICAL ORDER.
@@ -218,8 +218,8 @@ am_pm "";""
t_fmt_ampm ""
% Full date and time representation
% "%Z %Y ony %B %e, %a %H:%M:%S"
-date_fmt "<U0025><U005A><U0020><U0025><U0059><U0020><U043E><U043D><U044B><U0020><U0025><U0042><U0020>";/
- "<U0025><U0065><U002C><U0020><U0025><U0061><U0020><U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053>"
+date_fmt "<U0025><U005A><U0020><U0025><U0059><U0020><U043E><U043D><U044B><U0020><U0025><U0042><U0020>/
+<U0025><U0065><U002C><U0020><U0025><U0061><U0020><U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053>"
END LC_TIME
LC_MESSAGES
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 116c816a96..b59fc5b2fb 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,11 @@
+2006-01-02 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/sparc/tls.h (tcbhead_t): Add pointer_guard field.
+ (THREAD_GET_POINTER_GUARD, THREAD_SET_POINTER_GUARD,
+ THREAD_COPY_POINTER_GUARD): Define.
+ * sysdeps/sparc/tcb-offsets.sym (POINTER_GUARD): Define.
+ * sysdeps/sparc/sparc64/jmpbuf-unwind.h: Revert 2005-12-27 changes.
+
2006-01-01 Ulrich Drepper <drepper@redhat.com>
* version.c: Update copyright year.
diff --git a/nptl/sysdeps/sparc/sparc64/jmpbuf-unwind.h b/nptl/sysdeps/sparc/sparc64/jmpbuf-unwind.h
index 7752fe971e..92c296b0cf 100644
--- a/nptl/sysdeps/sparc/sparc64/jmpbuf-unwind.h
+++ b/nptl/sysdeps/sparc/sparc64/jmpbuf-unwind.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@davemloft.net>, 2005.
@@ -20,23 +20,12 @@
#include <setjmp.h>
#include <stdint.h>
#include <unwind.h>
-#include <sysdep.h>
#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
_JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
-static inline uintptr_t __attribute__ ((unused))
-_jmpbuf_sp (__jmp_buf regs)
-{
- uintptr_t sp = regs[0].uc_mcontext.mc_fp;
-#ifdef PTR_DEMANGLE
- PTR_DEMANGLE (sp);
-#endif
- return sp;
-}
-
#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
- ((uintptr_t) (_address) - (_adj) < _jmpbuf_sp (_jmpbuf) - (_adj))
+ ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf)[0].uc_mcontext.mc_fp - (_adj))
/* We use the normal lobngjmp for unwinding. */
#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val)
diff --git a/nptl/sysdeps/sparc/tcb-offsets.sym b/nptl/sysdeps/sparc/tcb-offsets.sym
index 237f975b25..923af8a5b7 100644
--- a/nptl/sysdeps/sparc/tcb-offsets.sym
+++ b/nptl/sysdeps/sparc/tcb-offsets.sym
@@ -2,5 +2,6 @@
#include <tls.h>
MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads)
+POINTER_GUARD offsetof (tcbhead_t, pointer_guard)
PID offsetof (struct pthread, pid)
TID offsetof (struct pthread, tid)
diff --git a/nptl/sysdeps/sparc/tls.h b/nptl/sysdeps/sparc/tls.h
index ddc4848554..127bbf695f 100644
--- a/nptl/sysdeps/sparc/tls.h
+++ b/nptl/sysdeps/sparc/tls.h
@@ -1,5 +1,5 @@
/* Definitions for thread-local data handling. NPTL/sparc version.
- Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -48,6 +48,7 @@ typedef struct
int multiple_threads;
uintptr_t sysinfo;
uintptr_t stack_guard;
+ uintptr_t pointer_guard;
} tcbhead_t;
#else /* __ASSEMBLER__ */
@@ -135,6 +136,14 @@ register struct pthread *__thread_self __asm__("%g7");
((descr)->header.stack_guard \
= THREAD_GETMEM (THREAD_SELF, header.stack_guard))
+/* Get/set the stack guard field in TCB head. */
+#define THREAD_GET_POINTER_GUARD() \
+ THREAD_GETMEM (THREAD_SELF, header.pointer_guard)
+#define THREAD_SET_POINTER_GUARD(value) \
+ THREAD_SETMEM (THREAD_SELF, header.pointer_guard, value)
+# define THREAD_COPY_POINTER_GUARD(descr) \
+ ((descr)->header.pointer_guard = THREAD_GET_POINTER_GUARD ())
+
#endif /* !ASSEMBLER */
#endif /* tls.h */
diff --git a/posix/Makefile b/posix/Makefile
index 8e53fdac44..32326c5b7b 100644
--- a/posix/Makefile
+++ b/posix/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1991-1999, 2000-2003, 2004, 2005 Free Software Foundation, Inc.
+# Copyright (C) 1991-1999, 2000-2005, 2006 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@@ -220,7 +220,7 @@ endif
$(objpfx)annexc.out: $(objpfx)annexc
-$(dir $<)$(notdir $<) '$(CC)' \
- '$(patsubst %,-I../%,$(sorted-subdirs)) -I../include -I.. $(+sysdep-includes) $(sysincludes)' > $@
+ '$(patsubst %,-I../%,$(sorted-subdirs)) -I../include $(+sysdep-includes) $(sysincludes) -I..' > $@
annexc-CFLAGS = -O
$(objpfx)annexc: annexc.c
diff --git a/sysdeps/s390/bits/setjmp.h b/sysdeps/s390/bits/setjmp.h
index 01533ca367..37f600d0ad 100644
--- a/sysdeps/s390/bits/setjmp.h
+++ b/sysdeps/s390/bits/setjmp.h
@@ -40,7 +40,7 @@
#ifndef _ASM
-typedef struct {
+typedef struct __s390_jmp_buf {
/* We save registers 6-15. */
long int __gregs[10];
diff --git a/sysdeps/s390/s390-32/__longjmp.c b/sysdeps/s390/s390-32/__longjmp.c
index 07814e080a..c47ebbc52a 100644
--- a/sysdeps/s390/s390-32/__longjmp.c
+++ b/sysdeps/s390/s390-32/__longjmp.c
@@ -29,24 +29,32 @@
void
__longjmp (__jmp_buf env, int val)
{
+ register int r2 __asm ("%r2") = val == 0 ? 1 : val;
#ifdef PTR_DEMANGLE
- register uintptr_t r5 __asm ("%r5") = THREAD_GET_POINTER_GUARD ();
+ register uintptr_t r3 __asm ("%r3") = THREAD_GET_POINTER_GUARD ();
+ register void *r1 __asm ("%r1") = (void *) env;
#endif
/* Restore registers and jump back. */
- asm volatile ("lr %%r2,%0\n\t" /* PUT val in grp 2. */
- "ld %%f6,48(%1)\n\t"
+ asm volatile ("ld %%f6,48(%1)\n\t"
"ld %%f4,40(%1)\n\t"
- "lm %%r6,%%r15,0(%1)\n\t"
#ifdef PTR_DEMANGLE
- "xr %%r14,%2\n\t"
-#endif
+ "lm %%r6,%%r13,0(%1)\n\t"
+ "lm %%r4,%%r5,32(%1)\n\t"
+ "xr %%r4,%2\n\t"
+ "xr %%r5,%2\n\t"
+ "lr %%r15,%%r5\n\t"
+ "br %%r4"
+#else
+ "lm %%r6,%%r15,0(%1)\n\t"
"br %%r14"
- : : "r" (val == 0 ? 1 : val),
- "a" (env)
+#endif
+ : : "r" (r2),
#ifdef PTR_DEMANGLE
- , "r" (r5)
+ "r" (r1), "r" (r3)
+#else
+ "a" (env)
#endif
- : "2" );
+ );
/* Avoid `volatile function does return' warnings. */
for (;;);
diff --git a/sysdeps/s390/s390-32/elf/setjmp.S b/sysdeps/s390/s390-32/elf/setjmp.S
index f3ca8af6c2..ed28008a56 100644
--- a/sysdeps/s390/s390-32/elf/setjmp.S
+++ b/sysdeps/s390/s390-32/elf/setjmp.S
@@ -49,9 +49,10 @@ ENTRY(__sigsetjmp)
#ifdef PTR_MANGLE
stm %r6,%r13,0(%r2) /* store registers in jmp_buf */
lr %r4,%r14
- PTR_MANGLE (%r4, %r5)
- st %r4,32(%r2)
- st %r15,36(%r2)
+ lr %r5,%r15
+ PTR_MANGLE (%r4, %r1)
+ PTR_MANGLE2 (%r5, %r1)
+ stm %r4,%r5,32(%r2)
#else
stm %r6,%r15,0(%r2) /* store registers in jmp_buf */
#endif
diff --git a/sysdeps/s390/s390-32/setjmp.S b/sysdeps/s390/s390-32/setjmp.S
index a438595945..b943085e93 100644
--- a/sysdeps/s390/s390-32/setjmp.S
+++ b/sysdeps/s390/s390-32/setjmp.S
@@ -32,9 +32,10 @@ ENTRY(__sigsetjmp)
#ifdef PTR_MANGLE
stm %r6,%r13,0(%r2) /* store registers in jmp_buf */
lr %r4,%r14
- PTR_MANGLE (%r4, %r5)
- st %r4,32(%r2)
- st %r15,36(%r2)
+ lr %r5,%r15
+ PTR_MANGLE (%r4, %r1)
+ PTR_MANGLE2 (%r5, %r1)
+ stm %r4,%r5,32(%r2)
#else
stm %r6,%r15,0(%r2) /* store registers in jmp_buf */
#endif
diff --git a/sysdeps/s390/s390-64/__longjmp.c b/sysdeps/s390/s390-64/__longjmp.c
index 6650bf702f..030fb5b515 100644
--- a/sysdeps/s390/s390-64/__longjmp.c
+++ b/sysdeps/s390/s390-64/__longjmp.c
@@ -29,26 +29,34 @@
void
__longjmp (__jmp_buf env, int val)
{
+ register long int r2 __asm ("%r2") = val == 0 ? 1 : val;
#ifdef PTR_DEMANGLE
- register uintptr_t r5 __asm ("%r5") = THREAD_GET_POINTER_GUARD ();
+ register uintptr_t r3 __asm ("%r3") = THREAD_GET_POINTER_GUARD ();
+ register void *r1 __asm ("%r1") = (void *) env;
#endif
/* Restore registers and jump back. */
- asm volatile ("lgr %%r2,%0\n\t" /* Put val in grp 2. */
- "ld %%f7,104(%1)\n\t"
+ asm volatile ("ld %%f7,104(%1)\n\t"
"ld %%f5,96(%1)\n\t"
"ld %%f3,88(%1)\n\t"
"ld %%f1,80(%1)\n\t"
- "lmg %%r6,%%r15,0(%1)\n\t"
#ifdef PTR_DEMANGLE
- "xgr %%r14,%2\n\t"
-#endif
+ "lmg %%r6,%%r13,0(%1)\n\t"
+ "lmg %%r4,%%r5,64(%1)\n\t"
+ "xgr %%r4,%2\n\t"
+ "xgr %%r5,%2\n\t"
+ "lgr %%r15,%%r5\n\t"
+ "br %%r4"
+#else
+ "lmg %%r6,%%r15,0(%1)\n\t"
"br %%r14"
- : : "r" (val == 0 ? 1 : val),
- "a" (env)
+#endif
+ : : "r" (r2),
#ifdef PTR_DEMANGLE
- , "r" (r5)
+ "r" (r1), "r" (r3)
+#else
+ "a" (env)
#endif
- : "2" );
+ );
/* Avoid `volatile function does return' warnings. */
for (;;);
diff --git a/sysdeps/s390/s390-64/elf/setjmp.S b/sysdeps/s390/s390-64/elf/setjmp.S
index 44f7cf08cc..28b6a5a35b 100644
--- a/sysdeps/s390/s390-64/elf/setjmp.S
+++ b/sysdeps/s390/s390-64/elf/setjmp.S
@@ -49,9 +49,10 @@ ENTRY(__sigsetjmp)
#ifdef PTR_MANGLE
stmg %r6,%r13,0(%r2) /* Store registers in jmp_buf. */
lgr %r4,%r14
- PTR_MANGLE (%r4, %r5)
- stg %r4,64(%r2)
- stg %r15,72(%r2)
+ lgr %r5,%r15
+ PTR_MANGLE (%r4, %r1)
+ PTR_MANGLE2 (%r5, %r1)
+ stmg %r4,%r5,64(%r2)
#else
stmg %r6,%r15,0(%r2) /* Store registers in jmp_buf. */
#endif
diff --git a/sysdeps/s390/s390-64/setjmp.S b/sysdeps/s390/s390-64/setjmp.S
index 25d97b6a6a..a962db46ce 100644
--- a/sysdeps/s390/s390-64/setjmp.S
+++ b/sysdeps/s390/s390-64/setjmp.S
@@ -31,9 +31,10 @@ ENTRY(__sigsetjmp)
#ifdef PTR_MANGLE
stmg %r6,%r13,0(%r2) /* Store registers in jmp_buf. */
lgr %r4,%r14
- PTR_MANGLE (%r4, %r5)
- stg %r4,64(%r2)
- stg %r15,72(%r2)
+ lgr %r5,%r15
+ PTR_MANGLE (%r4, %r1)
+ PTR_MANGLE2 (%r5, %r1)
+ stmg %r4,%r5,64(%r2)
#else
stmg %r6,%r15,0(%r2) /* Store registers in jmp_buf. */
#endif
diff --git a/sysdeps/sparc/sparc32/__longjmp.S b/sysdeps/sparc/sparc32/__longjmp.S
index 1c81c92692..3b2c80b7c3 100644
--- a/sysdeps/sparc/sparc32/__longjmp.S
+++ b/sysdeps/sparc/sparc32/__longjmp.S
@@ -1,4 +1,5 @@
-/* Copyright (C) 1991, 93, 96, 97, 98, 99, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1993, 1996, 1997, 1998, 1999, 2000, 2006
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -30,6 +31,9 @@ ENTRY(__longjmp)
use them while unwinding frames and their register windows. */
ld ENV(o0,JB_FP), %g3 /* Cache target FP in register %g3. */
+#ifdef PTR_DEMANGLE
+ PTR_DEMANGLE (%g3, %g3, %g4)
+#endif
mov %o0, %g1 /* ENV in %g1 */
orcc %o1, %g0, %g2 /* VAL in %g2 */
be,a 0f /* Branch if zero; else skip delay slot. */
@@ -62,8 +66,15 @@ LOC(thread):
* windows.
*/
ta ST_FLUSH_WINDOWS
+#ifdef PTR_DEMANGLE
+ ld ENV(g1,JB_PC), %g5 /* Set return PC. */
+ ld ENV(g1,JB_SP), %g1 /* Set saved SP on restore below. */
+ PTR_DEMANGLE2 (%o7, %g5, %g4)
+ PTR_DEMANGLE2 (%fp, %g1, %g4)
+#else
ld ENV(g1,JB_PC), %o7 /* Set return PC. */
ld ENV(g1,JB_SP), %fp /* Set saved SP on restore below. */
+#endif
sub %fp, 64, %sp /* Allocate a register frame. */
st %g3, RW_FP /* Set saved FP on restore below. */
retl
@@ -71,10 +82,17 @@ LOC(thread):
LOC(found):
/* We have unwound register windows so %fp matches the target. */
+#ifdef PTR_DEMANGLE
+ PTR_DEMANGLE2 (%sp, %o0, %g4)
+#else
mov %o0, %sp /* OK, install new SP. */
+#endif
LOC(sp_ok):
ld ENV(g1,JB_PC), %o0 /* Extract target return PC. */
+#ifdef PTR_DEMANGLE
+ PTR_DEMANGLE2 (%o0, %o0, %g4)
+#endif
jmp %o0 + 8 /* Return there. */
mov %g2, %o0 /* Delay slot: set return value. */
diff --git a/sysdeps/sparc/sparc32/setjmp.S b/sysdeps/sparc/sparc32/setjmp.S
index 883ea06297..4ef8724e02 100644
--- a/sysdeps/sparc/sparc32/setjmp.S
+++ b/sysdeps/sparc/sparc32/setjmp.S
@@ -1,4 +1,5 @@
-/* Copyright (C) 1991, 93, 94, 96, 97, 98, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1993, 1994, 1996, 1997, 1998, 2002, 2006
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -39,9 +40,18 @@ ENTRY (__sigsetjmp)
a tail-call for simplicity; it always returns zero. */
ta ST_FLUSH_WINDOWS
+#ifdef PTR_MANGLE
+ PTR_MANGLE (%g1, %o7, %g4)
+ PTR_MANGLE2 (%g2, %sp, %g4)
+ PTR_MANGLE2 (%g3, %fp, %g4)
+ st %g1, [%o0 + (JB_PC * 4)]
+ st %g2, [%o0 + (JB_SP * 4)]
+ st %g3, [%o0 + (JB_FP * 4)]
+#else
st %o7, [%o0 + (JB_PC * 4)]
st %sp, [%o0 + (JB_SP * 4)]
st %fp, [%o0 + (JB_FP * 4)]
+#endif
mov %o7, %g1
call __sigjmp_save
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
index 355108a493..50c3f42469 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
@@ -275,6 +275,8 @@
# define PTR_MANGLE(reg, tmpreg) \
ear tmpreg,%a0; \
x reg,STACK_GUARD(tmpreg)
+# define PTR_MANGLE2(reg, tmpreg) \
+ x reg,STACK_GUARD(tmpreg)
# define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
# else
# define PTR_MANGLE(var) \
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
index 562fc7df76..aadbf74c2b 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
@@ -277,6 +277,8 @@
sllg tmpreg,tmpreg,32; \
ear tmpreg,%a1; \
xg reg,STACK_GUARD(tmpreg)
+# define PTR_MANGLE2(reg, tmpreg) \
+ xg reg,STACK_GUARD(tmpreg)
# define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
# else
# define PTR_MANGLE(var) \
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/setjmp.h b/sysdeps/unix/sysv/linux/sparc/bits/setjmp.h
index 45aa2655ee..7dc822929f 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/setjmp.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/setjmp.h
@@ -1,4 +1,5 @@
-/* Copyright (C) 1997,1999,2000,2003, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1999, 2000, 2003, 2005, 2006
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -60,7 +61,7 @@ typedef struct __sparc64_jmp_buf
/* 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) < demangle ((jmpbuf)->uc_mcontext.mc_fp))
+ ((unsigned long int) (address) < (jmpbuf)->uc_mcontext.mc_fp)
#else
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
index 29c5158b9f..45f5c44d5d 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 2002, 2003, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, January 1997.
@@ -214,4 +214,24 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler) \
#endif /* __ASSEMBLER__ */
+/* Pointer mangling support. */
+#if defined NOT_IN_libc && defined IS_IN_rtld
+/* We cannot use the thread descriptor because in ld.so we use setjmp
+ earlier than the descriptor is initialized. */
+#else
+# ifdef __ASSEMBLER__
+# define PTR_MANGLE(dreg, reg, tmpreg) \
+ ld [%g7 + POINTER_GUARD], tmpreg; \
+ xor reg, tmpreg, dreg
+# define PTR_DEMANGLE(dreg, reg, tmpreg) PTR_MANGLE (dreg, reg, tmpreg)
+# define PTR_MANGLE2(dreg, reg, tmpreg) \
+ xor reg, tmpreg, dreg
+# define PTR_DEMANGLE2(dreg, reg, tmpreg) PTR_MANGLE2 (dreg, reg, tmpreg)
+# else
+# define PTR_MANGLE(var) \
+ (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
+# define PTR_DEMANGLE(var) PTR_MANGLE (var)
+# endif
+#endif
+
#endif /* linux/sparc/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
index 071aa3a310..b30cffc5e9 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
@@ -240,4 +240,24 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler) \
register windows. So if you poke stack memory directly you add this. */
#define STACK_BIAS 2047
+/* Pointer mangling support. */
+#if defined NOT_IN_libc && defined IS_IN_rtld
+/* We cannot use the thread descriptor because in ld.so we use setjmp
+ earlier than the descriptor is initialized. */
+#else
+# ifdef __ASSEMBLER__
+# define PTR_MANGLE(dreg, reg, tmpreg) \
+ ldx [%g7 + POINTER_GUARD], tmpreg; \
+ xor reg, tmpreg, dreg
+# define PTR_DEMANGLE(dreg, reg, tmpreg) PTR_MANGLE (dreg, reg, tmpreg)
+# define PTR_MANGLE2(dreg, reg, tmpreg) \
+ xor reg, tmpreg, dreg
+# define PTR_DEMANGLE2(dreg, reg, tmpreg) PTR_MANGLE2 (dreg, reg, tmpreg)
+# else
+# define PTR_MANGLE(var) \
+ (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
+# define PTR_DEMANGLE(var) PTR_MANGLE (var)
+# endif
+#endif
+
#endif /* linux/sparc64/sysdep.h */