diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S')
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S b/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S index 3008f8e4af..fbe8b77caf 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S +++ b/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S @@ -33,7 +33,7 @@ ENTRY(__setcontext) lr %r1,%r2 - /* sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL). */ + /* rt_sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL, sigsetsize). */ la %r2,SIG_BLOCK la %r3,SC_MASK(%r1) slr %r4,%r4 @@ -62,8 +62,16 @@ ENTRY(__setcontext) /* Don't touch %a0, used for thread purposes. */ lam %a1,%a15,SC_ACRS+4(%r1) + /* Restore the upper halfs if available. */ + l %r2,SC_FLGS(%r1) + tml %r2,1 /* UCONTEXT_UC_FLAGS_HIGH_GPRS */ + jz 0f + .machine "z900" + .machinemode "zarch_nohighgprs" + lmh %r0,%r15,SC_HIGHGPRS(%r1) + /* Load general purpose registers. */ - lm %r0,%r15,SC_GPRS(%r1) +0: lm %r0,%r15,SC_GPRS(%r1) /* Return. */ br %r14 |