* [PATCH] s390{,x} setjmp/longjmp mangling
@ 2006-01-02 15:47 Jakub Jelinek
2006-01-02 20:56 ` Ulrich Drepper
0 siblings, 1 reply; 2+ messages in thread
From: Jakub Jelinek @ 2006-01-02 15:47 UTC (permalink / raw)
To: Ulrich Drepper; +Cc: Glibc hackers
Hi!
This patch moves s390{,x} glibc back into a working shape.
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.
--- libc/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h.jj 2005-12-30 09:04:17.000000000 +0100
+++ libc/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h 2005-12-30 12:28:59.000000000 +0100
@@ -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) \
--- libc/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h.jj 2005-12-30 09:04:17.000000000 +0100
+++ libc/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h 2005-12-30 12:43:26.000000000 +0100
@@ -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) \
--- libc/sysdeps/s390/s390-32/__longjmp.c.jj 2005-12-30 09:04:16.000000000 +0100
+++ libc/sysdeps/s390/s390-32/__longjmp.c 2005-12-30 12:27:24.000000000 +0100
@@ -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 (;;);
--- libc/sysdeps/s390/s390-32/setjmp.S.jj 2005-12-30 09:04:16.000000000 +0100
+++ libc/sysdeps/s390/s390-32/setjmp.S 2005-12-30 12:31:49.000000000 +0100
@@ -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
--- libc/sysdeps/s390/s390-32/elf/setjmp.S.jj 2005-12-30 09:04:16.000000000 +0100
+++ libc/sysdeps/s390/s390-32/elf/setjmp.S 2005-12-30 12:31:49.000000000 +0100
@@ -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
--- libc/sysdeps/s390/s390-64/__longjmp.c.jj 2005-12-30 09:04:16.000000000 +0100
+++ libc/sysdeps/s390/s390-64/__longjmp.c 2005-12-30 12:38:10.000000000 +0100
@@ -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 (;;);
--- libc/sysdeps/s390/s390-64/setjmp.S.jj 2005-12-30 09:04:16.000000000 +0100
+++ libc/sysdeps/s390/s390-64/setjmp.S 2005-12-30 12:42:25.000000000 +0100
@@ -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
--- libc/sysdeps/s390/s390-64/elf/setjmp.S.jj 2005-12-30 09:04:16.000000000 +0100
+++ libc/sysdeps/s390/s390-64/elf/setjmp.S 2005-12-30 12:42:25.000000000 +0100
@@ -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
--- libc/sysdeps/s390/bits/setjmp.h.jj 2005-12-28 00:41:35.000000000 -0500
+++ libc/sysdeps/s390/bits/setjmp.h 2005-12-28 00:41:35.000000000 -0500
@@ -40,7 +40,7 @@
#ifndef _ASM
-typedef struct {
+typedef struct __s390_jmp_buf {
/* We save registers 6-15. */
long int __gregs[10];
Jakub
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] s390{,x} setjmp/longjmp mangling
2006-01-02 15:47 [PATCH] s390{,x} setjmp/longjmp mangling Jakub Jelinek
@ 2006-01-02 20:56 ` Ulrich Drepper
0 siblings, 0 replies; 2+ messages in thread
From: Ulrich Drepper @ 2006-01-02 20:56 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Glibc hackers
[-- Attachment #1: Type: text/plain, Size: 101 bytes --]
Applied.
--
➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 251 bytes --]
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2006-01-02 20:56 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-01-02 15:47 [PATCH] s390{,x} setjmp/longjmp mangling Jakub Jelinek
2006-01-02 20:56 ` Ulrich Drepper
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).