#Contains the following patches from upstream: # #commit c3e94a953347ecf361ab400111dbb1a62505c7fe #Author: Andreas Krebbel #Date: Tue Mar 5 08:15:33 2013 +0100 # # S/390: Fix rt_sigprocmask syscall invocation in get/set/swapcontext. # #****commit e21d7aa71c0700b6611bd55881b862ac73c5cd5b #Author: Andreas Krebbel #Date: Thu Feb 21 09:47:55 2013 +0100 # # S/390: Fix _dl_runtime_profile for 32 bit. # #****commit f78b5caa6ece23ce86f6cabac8edf3ecd6850473 #Author: Andreas Krebbel #Date: Mon Feb 18 10:29:40 2013 +0100 # # S/390: Fix _dl_runtime_profile # # #****commit bc101e2652728d8a6e8ece7c637e095618546a95 #Author: Andreas Krebbel #Date: Wed Jan 23 10:00:24 2013 +0100 # # S/390: Fix setjmp/longjmp FPR save/restore # #****commit 5c95f7b66be2e59cf26f3c29cfab7657880bd76d #Author: Heiko Carstens #Date: Tue Apr 23 08:53:44 2013 +0200 # # S/390: Change struct statfs[64] member types to unsigned values diff -Nrup a/sysdeps/s390/bits/setjmp.h b/sysdeps/s390/bits/setjmp.h --- a/sysdeps/s390/bits/setjmp.h 2012-12-24 22:02:13.000000000 -0500 +++ b/sysdeps/s390/bits/setjmp.h 2013-08-23 12:33:20.597299428 -0400 @@ -34,7 +34,7 @@ typedef struct __s390_jmp_buf long int __gregs[10]; # if __WORDSIZE == 64 - /* We save fpu registers 1, 3, 5 and 7. */ + /* We save fpu registers f8 - f15. */ long __fpregs[8]; # else /* We save fpu registers 4 and 6. */ diff -Nrup a/sysdeps/s390/s390-32/dl-trampoline.S b/sysdeps/s390/s390-32/dl-trampoline.S --- a/sysdeps/s390/s390-32/dl-trampoline.S 2012-12-24 22:02:13.000000000 -0500 +++ b/sysdeps/s390/s390-32/dl-trampoline.S 2013-08-23 12:33:20.593298453 -0400 @@ -95,16 +95,16 @@ _dl_runtime_profile: lr %r1,%r2 # function addr returned in r2 icm %r0,15,20(%r12) # load & test framesize jnm 2f + lm %r2,%r6,32(%r12) ld %f0,56(%r12) ld %f2,64(%r12) - basr %r14,%r1 # call resolved function -1: lr %r15,%r12 # remove stack frame + lr %r15,%r12 # remove stack frame cfi_def_cfa_register (15) l %r14,16(%r15) # restore registers l %r12,12(%r15) - l %r6,8(%r15) - br %r14 + br %r1 # tail-call to the resolved function + cfi_def_cfa_register (12) 2: jz 4f # framesize == 0 ? ahi %r0,7 # align framesize to 8 @@ -131,7 +131,13 @@ _dl_runtime_profile: la %r4,32(%r12) # pointer to struct La_s390_32_regs la %r5,72(%r12) # pointer to struct La_s390_32_retval basr %r14,%r1 # call _dl_call_pltexit - j 1b + + lr %r15,%r12 # remove stack frame + cfi_def_cfa_register (15) + l %r14,16(%r15) # restore registers + l %r12,12(%r15) + br %r14 + 6: .long _dl_profile_fixup - 0b 7: .long _dl_call_pltexit - 5b cfi_endproc diff -Nrup a/sysdeps/s390/s390-64/dl-trampoline.S b/sysdeps/s390/s390-64/dl-trampoline.S --- a/sysdeps/s390/s390-64/dl-trampoline.S 2012-12-24 22:02:13.000000000 -0500 +++ b/sysdeps/s390/s390-64/dl-trampoline.S 2013-08-23 12:46:11.478239405 -0400 @@ -1,4 +1,4 @@ -/* PLT trampolines. s390 version. +/* PLT trampolines. s390x version. Copyright (C) 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -20,8 +20,8 @@ * with the following linkage: * r2 - r6 : parameter registers * f0, f2, f4, f6 : floating point parameter registers - * 24(r15), 28(r15) : PLT arguments PLT1, PLT2 - * 96(r15) : additional stack parameters + * 48(r15), 56(r15) : PLT arguments PLT1, PLT2 + * 160(r15) : additional stack parameters * The normal clobber rules for function calls apply: * r0 - r5 : call clobbered * r6 - r13 : call saved @@ -39,21 +39,21 @@ cfi_startproc .align 16 _dl_runtime_resolve: - stmg 2,5,64(15) # save registers - stg 14,96(15) + stmg %r2,%r5,64(15) # save call-clobbered argument registers + stg %r14,96(15) cfi_offset (r14, -64) - lgr 0,15 # create stack frame - aghi 15,-160 + lgr %r0,%r15 + aghi %r15,-160 # create stack frame cfi_adjust_cfa_offset (160) - stg 0,0(15) - lmg 2,3,208(15) # load args saved by PLT - brasl 14,_dl_fixup # call fixup - lgr 1,2 # function addr returned in r2 - aghi 15,160 # remove stack frame + stg %r0,0(%r15) # write backchain + lmg %r2,%r3,208(%r15)# load args saved by PLT + brasl %r14,_dl_fixup # call fixup + lgr %r1,%r2 # function addr returned in r2 + aghi %r15,160 # remove stack frame cfi_adjust_cfa_offset (-160) - lg 14,96(15) # restore registers - lmg 2,5,64(15) - br 1 + lg %r14,96(15) # restore registers + lmg %r2,%r5,64(15) + br %r1 cfi_endproc .size _dl_runtime_resolve, .-_dl_runtime_resolve @@ -64,13 +64,12 @@ _dl_runtime_resolve: cfi_startproc .align 16 _dl_runtime_profile: - stmg %r2,%r6,64(%r15) # save registers - std %f0,104(%r15) - std %f2,112(%r15) + stmg %r2,%r6,64(%r15) # save call-clobbered arg regs + std %f0,104(%r15) # + r6 needed as arg for + std %f2,112(%r15) # _dl_profile_fixup std %f4,120(%r15) std %f6,128(%r15) - stg %r6,16(%r15) - stg %r12,24(%r15) + stg %r12,24(%r15) # r12 is used as backup of r15 stg %r14,32(%r15) cfi_offset (r6, -96) cfi_offset (f0, -56) @@ -79,10 +78,10 @@ _dl_runtime_profile: cfi_offset (f6, -32) cfi_offset (r12, -136) cfi_offset (r14, -128) - lgr %r12,%r15 # create stack frame + lgr %r12,%r15 # backup stack pointer cfi_def_cfa_register (12) - aghi %r15,-160 - stg %r12,0(%r15) + aghi %r15,-160 # create stack frame + stg %r12,0(%r15) # save backchain lmg %r2,%r3,48(%r12) # load arguments saved by PLT lgr %r4,%r14 # return address as third parameter la %r5,64(%r12) # pointer to struct La_s390_32_regs @@ -92,18 +91,19 @@ _dl_runtime_profile: lg %r0,40(%r12) # load framesize ltgr %r0,%r0 jnm 1f - lmg %r2,%r6,64(%r12) - ld %f0,104(%r12) - ld %f2,112(%r12) + + lmg %r2,%r6,64(%r12) # framesize < 0 means no pltexit call + ld %f0,104(%r12) # so we can do a tail call without + ld %f2,112(%r12) # copying the arg overflow area ld %f4,120(%r12) ld %f6,128(%r12) - basr %r14,%r1 # call resolved function -0: lgr %r15,%r12 # remove stack frame + + lgr %r15,%r12 # remove stack frame cfi_def_cfa_register (15) lg %r14,32(%r15) # restore registers lg %r12,24(%r15) - lg %r6,16(%r15) - br %r14 + br %r1 # tail-call to resolved function + cfi_def_cfa_register (12) 1: jz 4f # framesize == 0 ? aghi %r0,7 # align framesize to 8 @@ -118,7 +118,7 @@ _dl_runtime_profile: la %r3,8(%r3) brctg %r0,3b 4: lmg %r2,%r6,64(%r12) # load register parameters - ld %f0,104(%r12) + ld %f0,104(%r12) # restore call-clobbered arg regs ld %f2,112(%r12) ld %f4,120(%r12) ld %f6,128(%r12) @@ -129,7 +129,13 @@ _dl_runtime_profile: la %r4,32(%r12) # pointer to struct La_s390_32_regs la %r5,72(%r12) # pointer to struct La_s390_32_retval brasl %r14,_dl_call_pltexit - j 0b + + lgr %r15,%r12 # remove stack frame + cfi_def_cfa_register (15) + lg %r14,32(%r15) # restore registers + lg %r12,24(%r15) + br %r14 + cfi_endproc .size _dl_runtime_profile, .-_dl_runtime_profile #endif diff -Nrup a/sysdeps/s390/s390-64/__longjmp.c b/sysdeps/s390/s390-64/__longjmp.c --- a/sysdeps/s390/s390-64/__longjmp.c 2012-12-24 22:02:13.000000000 -0500 +++ b/sysdeps/s390/s390-64/__longjmp.c 2013-08-23 12:33:20.597299428 -0400 @@ -42,10 +42,14 @@ __longjmp (__jmp_buf env, int val) register void *r1 __asm ("%r1") = (void *) env; #endif /* Restore registers and jump back. */ - 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" + asm volatile ("ld %%f8,80(%1)\n\t" + "ld %%f9,88(%1)\n\t" + "ld %%f10,96(%1)\n\t" + "ld %%f11,104(%1)\n\t" + "ld %%f12,112(%1)\n\t" + "ld %%f13,120(%1)\n\t" + "ld %%f14,128(%1)\n\t" + "ld %%f15,136(%1)\n\t" #ifdef PTR_DEMANGLE "lmg %%r6,%%r13,0(%1)\n\t" "lmg %%r4,%%r5,64(%1)\n\t" diff -Nrup a/sysdeps/s390/s390-64/setjmp.S b/sysdeps/s390/s390-64/setjmp.S --- a/sysdeps/s390/s390-64/setjmp.S 2012-12-24 22:02:13.000000000 -0500 +++ b/sysdeps/s390/s390-64/setjmp.S 2013-08-23 12:33:20.598300448 -0400 @@ -55,10 +55,14 @@ ENTRY(__sigsetjmp) #else stmg %r6,%r15,0(%r2) /* Store registers in jmp_buf. */ #endif - std %f1,80(%r2) - std %f3,88(%r2) - std %f5,96(%r2) - std %f7,104(%r2) + std %f8,80(%r2) + std %f9,88(%r2) + std %f10,96(%r2) + std %f11,104(%r2) + std %f12,112(%r2) + std %f13,120(%r2) + std %f14,128(%r2) + std %f15,136(%r2) #if defined NOT_IN_libc && defined IS_IN_rtld /* In ld.so we never save the signal mask. */ lghi %r2,0 diff -Nrup a/sysdeps/unix/sysv/linux/s390/bits/statfs.h b/sysdeps/unix/sysv/linux/s390/bits/statfs.h --- a/sysdeps/unix/sysv/linux/s390/bits/statfs.h 2012-12-24 22:02:13.000000000 -0500 +++ b/sysdeps/unix/sysv/linux/s390/bits/statfs.h 2013-08-23 12:33:20.601180842 -0400 @@ -23,8 +23,8 @@ struct statfs { - int f_type; - int f_bsize; + unsigned int f_type; + unsigned int f_bsize; #ifndef __USE_FILE_OFFSET64 __fsblkcnt_t f_blocks; __fsblkcnt_t f_bfree; @@ -39,27 +39,27 @@ struct statfs __fsfilcnt64_t f_ffree; #endif __fsid_t f_fsid; - int f_namelen; - int f_frsize; - int f_flags; - int f_spare[4]; + unsigned int f_namelen; + unsigned int f_frsize; + unsigned int f_flags; + unsigned int f_spare[4]; }; #ifdef __USE_LARGEFILE64 struct statfs64 { - int f_type; - int f_bsize; + unsigned int f_type; + unsigned int f_bsize; __fsblkcnt64_t f_blocks; __fsblkcnt64_t f_bfree; __fsblkcnt64_t f_bavail; __fsfilcnt64_t f_files; __fsfilcnt64_t f_ffree; __fsid_t f_fsid; - int f_namelen; - int f_frsize; - int f_flags; - int f_spare[4]; + unsigned int f_namelen; + unsigned int f_frsize; + unsigned int f_flags; + unsigned int f_spare[4]; }; #endif diff -Nrup a/sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S b/sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S --- a/sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S 2012-12-24 22:02:13.000000000 -0500 +++ b/sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S 2013-08-23 12:33:20.588297827 -0400 @@ -31,41 +31,42 @@ other than the PRESERVED state. */ ENTRY(__getcontext) - lr %r5,%r2 + lr %r1,%r2 /* sigprocmask (SIG_BLOCK, NULL, &sc->sc_mask). */ la %r2,SIG_BLOCK slr %r3,%r3 - la %r4,SC_MASK(%r5) + la %r4,SC_MASK(%r1) + lhi %r5,_NSIG8 svc SYS_ify(rt_sigprocmask) /* Store fpu context. */ - stfpc SC_FPC(%r5) - std %f0,SC_FPRS(%r5) - std %f1,SC_FPRS+8(%r5) - std %f2,SC_FPRS+16(%r5) - std %f3,SC_FPRS+24(%r5) - std %f4,SC_FPRS+32(%r5) - std %f5,SC_FPRS+40(%r5) - std %f6,SC_FPRS+48(%r5) - std %f7,SC_FPRS+56(%r5) - std %f8,SC_FPRS+64(%r5) - std %f9,SC_FPRS+72(%r5) - std %f10,SC_FPRS+80(%r5) - std %f11,SC_FPRS+88(%r5) - std %f12,SC_FPRS+96(%r5) - std %f13,SC_FPRS+104(%r5) - std %f14,SC_FPRS+112(%r5) - std %f15,SC_FPRS+120(%r5) + stfpc SC_FPC(%r1) + std %f0,SC_FPRS(%r1) + std %f1,SC_FPRS+8(%r1) + std %f2,SC_FPRS+16(%r1) + std %f3,SC_FPRS+24(%r1) + std %f4,SC_FPRS+32(%r1) + std %f5,SC_FPRS+40(%r1) + std %f6,SC_FPRS+48(%r1) + std %f7,SC_FPRS+56(%r1) + std %f8,SC_FPRS+64(%r1) + std %f9,SC_FPRS+72(%r1) + std %f10,SC_FPRS+80(%r1) + std %f11,SC_FPRS+88(%r1) + std %f12,SC_FPRS+96(%r1) + std %f13,SC_FPRS+104(%r1) + std %f14,SC_FPRS+112(%r1) + std %f15,SC_FPRS+120(%r1) /* Set __getcontext return value to 0. */ slr %r2,%r2 /* Store access registers. */ - stam %a0,%a15,SC_ACRS(%r5) + stam %a0,%a15,SC_ACRS(%r1) /* Store general purpose registers. */ - stm %r0,%r15,SC_GPRS(%r5) + stm %r0,%r15,SC_GPRS(%r1) /* Return. */ br %r14 diff -Nrup a/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S b/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S --- a/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S 2012-12-24 22:02:13.000000000 -0500 +++ b/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S 2013-08-23 12:33:20.588297827 -0400 @@ -31,38 +31,39 @@ other than the PRESERVED state. */ ENTRY(__setcontext) - lr %r5,%r2 + lr %r1,%r2 /* sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL). */ la %r2,SIG_BLOCK - la %r3,SC_MASK(%r5) + la %r3,SC_MASK(%r1) slr %r4,%r4 + lhi %r5,_NSIG8 svc SYS_ify(rt_sigprocmask) /* Load fpu context. */ - lfpc SC_FPC(%r5) - ld %f0,SC_FPRS(%r5) - ld %f1,SC_FPRS+8(%r5) - ld %f2,SC_FPRS+16(%r5) - ld %f3,SC_FPRS+24(%r5) - ld %f4,SC_FPRS+32(%r5) - ld %f5,SC_FPRS+40(%r5) - ld %f6,SC_FPRS+48(%r5) - ld %f7,SC_FPRS+56(%r5) - ld %f8,SC_FPRS+64(%r5) - ld %f9,SC_FPRS+72(%r5) - ld %f10,SC_FPRS+80(%r5) - ld %f11,SC_FPRS+88(%r5) - ld %f12,SC_FPRS+96(%r5) - ld %f13,SC_FPRS+104(%r5) - ld %f14,SC_FPRS+112(%r5) - ld %f15,SC_FPRS+120(%r5) + lfpc SC_FPC(%r1) + ld %f0,SC_FPRS(%r1) + ld %f1,SC_FPRS+8(%r1) + ld %f2,SC_FPRS+16(%r1) + ld %f3,SC_FPRS+24(%r1) + ld %f4,SC_FPRS+32(%r1) + ld %f5,SC_FPRS+40(%r1) + ld %f6,SC_FPRS+48(%r1) + ld %f7,SC_FPRS+56(%r1) + ld %f8,SC_FPRS+64(%r1) + ld %f9,SC_FPRS+72(%r1) + ld %f10,SC_FPRS+80(%r1) + ld %f11,SC_FPRS+88(%r1) + ld %f12,SC_FPRS+96(%r1) + ld %f13,SC_FPRS+104(%r1) + ld %f14,SC_FPRS+112(%r1) + ld %f15,SC_FPRS+120(%r1) /* Don't touch %a0, used for thread purposes. */ - lam %a1,%a15,SC_ACRS+4(%r5) + lam %a1,%a15,SC_ACRS+4(%r1) /* Load general purpose registers. */ - lm %r0,%r15,SC_GPRS(%r5) + lm %r0,%r15,SC_GPRS(%r1) /* Return. */ br %r14 diff -Nrup a/sysdeps/unix/sysv/linux/s390/s390-32/swapcontext.S b/sysdeps/unix/sysv/linux/s390/s390-32/swapcontext.S --- a/sysdeps/unix/sysv/linux/s390/s390-32/swapcontext.S 2012-12-24 22:02:13.000000000 -0500 +++ b/sysdeps/unix/sysv/linux/s390/s390-32/swapcontext.S 2013-08-23 12:33:20.589298155 -0400 @@ -34,12 +34,13 @@ ENTRY(__swapcontext) lr %r1,%r2 - lr %r5,%r3 + lr %r0,%r3 /* sigprocmask (SIG_BLOCK, NULL, &sc->sc_mask). */ la %r2,SIG_BLOCK slr %r3,%r3 la %r4,SC_MASK(%r1) + lhi %r5,_NSIG8 svc SYS_ify(rt_sigprocmask) /* Store fpu context. */ @@ -72,11 +73,14 @@ ENTRY(__swapcontext) /* sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL). */ la %r2,SIG_BLOCK + lr %r5,%r0 la %r3,SC_MASK(%r5) slr %r4,%r4 + lhi %r5,_NSIG8 svc SYS_ify(rt_sigprocmask) /* Load fpu context. */ + lr %r5,%r0 lfpc SC_FPC(%r5) ld %f0,SC_FPRS(%r5) ld %f1,SC_FPRS+8(%r5) diff -Nrup a/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S b/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S --- a/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S 2012-12-24 22:02:13.000000000 -0500 +++ b/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S 2013-08-23 12:33:20.590298812 -0400 @@ -31,41 +31,42 @@ other than the PRESERVED state. */ ENTRY(__getcontext) - lgr %r5,%r2 + lgr %r1,%r2 /* sigprocmask (SIG_BLOCK, NULL, &sc->sc_mask). */ la %r2,SIG_BLOCK slgr %r3,%r3 - la %r4,SC_MASK(%r5) + la %r4,SC_MASK(%r1) + lghi %r5,_NSIG8 svc SYS_ify(rt_sigprocmask) /* Store fpu context. */ - stfpc SC_FPC(%r5) - std %f0,SC_FPRS(%r5) - std %f1,SC_FPRS+8(%r5) - std %f2,SC_FPRS+16(%r5) - std %f3,SC_FPRS+24(%r5) - std %f4,SC_FPRS+32(%r5) - std %f5,SC_FPRS+40(%r5) - std %f6,SC_FPRS+48(%r5) - std %f7,SC_FPRS+56(%r5) - std %f8,SC_FPRS+64(%r5) - std %f9,SC_FPRS+72(%r5) - std %f10,SC_FPRS+80(%r5) - std %f11,SC_FPRS+88(%r5) - std %f12,SC_FPRS+96(%r5) - std %f13,SC_FPRS+104(%r5) - std %f14,SC_FPRS+112(%r5) - std %f15,SC_FPRS+120(%r5) + stfpc SC_FPC(%r1) + std %f0,SC_FPRS(%r1) + std %f1,SC_FPRS+8(%r1) + std %f2,SC_FPRS+16(%r1) + std %f3,SC_FPRS+24(%r1) + std %f4,SC_FPRS+32(%r1) + std %f5,SC_FPRS+40(%r1) + std %f6,SC_FPRS+48(%r1) + std %f7,SC_FPRS+56(%r1) + std %f8,SC_FPRS+64(%r1) + std %f9,SC_FPRS+72(%r1) + std %f10,SC_FPRS+80(%r1) + std %f11,SC_FPRS+88(%r1) + std %f12,SC_FPRS+96(%r1) + std %f13,SC_FPRS+104(%r1) + std %f14,SC_FPRS+112(%r1) + std %f15,SC_FPRS+120(%r1) /* Set __getcontext return value to 0. */ slgr %r2,%r2 /* Store access registers. */ - stam %a0,%a15,SC_ACRS(%r5) + stam %a0,%a15,SC_ACRS(%r1) /* Store general purpose registers. */ - stmg %r0,%r15,SC_GPRS(%r5) + stmg %r0,%r15,SC_GPRS(%r1) /* Return. */ br %r14 diff -Nrup a/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S b/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S --- a/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S 2012-12-24 22:02:13.000000000 -0500 +++ b/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S 2013-08-23 12:33:20.591298098 -0400 @@ -31,38 +31,39 @@ other than the PRESERVED state. */ ENTRY(__setcontext) - lgr %r5,%r2 + lgr %r1,%r2 /* sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL). */ la %r2,SIG_BLOCK - la %r3,SC_MASK(%r5) + la %r3,SC_MASK(%r1) slgr %r4,%r4 + lghi %r5,_NSIG8 svc SYS_ify(rt_sigprocmask) /* Load fpu context. */ - lfpc SC_FPC(%r5) - ld %f0,SC_FPRS(%r5) - ld %f1,SC_FPRS+8(%r5) - ld %f2,SC_FPRS+16(%r5) - ld %f3,SC_FPRS+24(%r5) - ld %f4,SC_FPRS+32(%r5) - ld %f5,SC_FPRS+40(%r5) - ld %f6,SC_FPRS+48(%r5) - ld %f7,SC_FPRS+56(%r5) - ld %f8,SC_FPRS+64(%r5) - ld %f9,SC_FPRS+72(%r5) - ld %f10,SC_FPRS+80(%r5) - ld %f11,SC_FPRS+88(%r5) - ld %f12,SC_FPRS+96(%r5) - ld %f13,SC_FPRS+104(%r5) - ld %f14,SC_FPRS+112(%r5) - ld %f15,SC_FPRS+120(%r5) + lfpc SC_FPC(%r1) + ld %f0,SC_FPRS(%r1) + ld %f1,SC_FPRS+8(%r1) + ld %f2,SC_FPRS+16(%r1) + ld %f3,SC_FPRS+24(%r1) + ld %f4,SC_FPRS+32(%r1) + ld %f5,SC_FPRS+40(%r1) + ld %f6,SC_FPRS+48(%r1) + ld %f7,SC_FPRS+56(%r1) + ld %f8,SC_FPRS+64(%r1) + ld %f9,SC_FPRS+72(%r1) + ld %f10,SC_FPRS+80(%r1) + ld %f11,SC_FPRS+88(%r1) + ld %f12,SC_FPRS+96(%r1) + ld %f13,SC_FPRS+104(%r1) + ld %f14,SC_FPRS+112(%r1) + ld %f15,SC_FPRS+120(%r1) /* Don't touch %a0 and %a1, used for thread purposes. */ - lam %a2,%a15,SC_ACRS+8(%r5) + lam %a2,%a15,SC_ACRS+8(%r1) /* Load general purpose registers. */ - lmg %r0,%r15,SC_GPRS(%r5) + lmg %r0,%r15,SC_GPRS(%r1) /* Return. */ br %r14 diff -Nrup a/sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S b/sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S --- a/sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S 2012-12-24 22:02:13.000000000 -0500 +++ b/sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S 2013-08-23 12:33:20.591298098 -0400 @@ -34,12 +34,13 @@ ENTRY(__swapcontext) lgr %r1,%r2 - lgr %r5,%r3 + lgr %r0,%r3 /* sigprocmask (SIG_BLOCK, NULL, &sc->sc_mask). */ la %r2,SIG_BLOCK slgr %r3,%r3 la %r4,SC_MASK(%r1) + lghi %r5,_NSIG8 svc SYS_ify(rt_sigprocmask) /* Store fpu context. */ @@ -72,11 +73,14 @@ ENTRY(__swapcontext) /* sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL). */ la %r2,SIG_BLOCK + lgr %r5,%r0 la %r3,SC_MASK(%r5) + lghi %r5,_NSIG8 slgr %r4,%r4 svc SYS_ify(rt_sigprocmask) /* Load fpu context. */ + lgr %r5,%r0 lfpc SC_FPC(%r5) ld %f0,SC_FPRS(%r5) ld %f1,SC_FPRS+8(%r5) diff -Nrup a/sysdeps/unix/sysv/linux/s390/ucontext_i.sym b/sysdeps/unix/sysv/linux/s390/ucontext_i.sym --- a/sysdeps/unix/sysv/linux/s390/ucontext_i.sym 2012-12-24 22:02:13.000000000 -0500 +++ b/sysdeps/unix/sysv/linux/s390/ucontext_i.sym 2013-08-23 12:33:20.591298098 -0400 @@ -8,6 +8,8 @@ SIG_BLOCK SIG_UNBLOCK SIG_SETMASK +_NSIG8 (_NSIG / 8) + #define ucontext(member) offsetof (ucontext_t, member) #define mcontext(member) ucontext (uc_mcontext.member)