From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10739 invoked by alias); 2 Jan 2006 15:47:10 -0000 Received: (qmail 10721 invoked by uid 22791); 2 Jan 2006 15:47:09 -0000 X-Spam-Check-By: sourceware.org Received: from sunsite.ms.mff.cuni.cz (HELO sunsite.mff.cuni.cz) (195.113.15.26) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 02 Jan 2006 15:47:07 +0000 Received: from sunsite.mff.cuni.cz (sunsite.mff.cuni.cz [127.0.0.1]) by sunsite.mff.cuni.cz (8.13.1/8.13.1) with ESMTP id k02FkuvT024098; Mon, 2 Jan 2006 16:46:56 +0100 Received: (from jakub@localhost) by sunsite.mff.cuni.cz (8.13.1/8.13.1/Submit) id k02Fkusv024097; Mon, 2 Jan 2006 16:46:56 +0100 Date: Mon, 02 Jan 2006 15:47:00 -0000 From: Jakub Jelinek To: Ulrich Drepper Cc: Glibc hackers Subject: [PATCH] s390{,x} setjmp/longjmp mangling Message-ID: <20060102154656.GK4625@sunsite.mff.cuni.cz> Reply-To: Jakub Jelinek Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i Mailing-List: contact libc-hacker-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sourceware.org X-SW-Source: 2006-01/txt/msg00002.txt.bz2 Hi! This patch moves s390{,x} glibc back into a working shape. 2006-01-02 Jakub Jelinek * 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