diff options
author | Ulrich Drepper <drepper@redhat.com> | 2001-04-10 21:46:48 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2001-04-10 21:46:48 +0000 |
commit | 58f46c794a3dc049ae8c53dab76d83ea23408479 (patch) | |
tree | 5695211b81ee73dc571857728e377b59a6938d92 /sysdeps | |
parent | bf9d1166a06c7181e50d7d5c9a2cde665007ee1d (diff) | |
download | glibc-58f46c794a3dc049ae8c53dab76d83ea23408479.zip glibc-58f46c794a3dc049ae8c53dab76d83ea23408479.tar.gz glibc-58f46c794a3dc049ae8c53dab76d83ea23408479.tar.bz2 |
Update.
2001-04-10 Martin Schwidefsky <schwidefsky@de.ibm.com>
* sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S: Fix return
value of getcontext.
* sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S: Fix return
value of setcontext.
* sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S: Likewise.
* sysdeps/unix/sysv/linux/s390/swapcontext.c: Skip setcontext
call by changing the saved context.
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S | 10 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S | 10 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/swapcontext.c | 10 |
5 files changed, 20 insertions, 16 deletions
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S b/sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S index e64cc85..b3cae1c 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S +++ b/sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S @@ -25,9 +25,7 @@ /* __getcontext (const ucontext_t *ucp) Saves the machine context in UCP such that when it is activated, - it appears as if __getcontext() returned again. The only difference - is that on a first return, %r2 contains 1 and on a subsequent - return, it contains 0. + it appears as if __getcontext() returned again. This implementation is intended to be used for *synchronous* context switches only. Therefore, it does not have to save anything @@ -61,11 +59,13 @@ ENTRY(__getcontext) std %f14,SC_FPRS+112(%r5) std %f15,SC_FPRS+120(%r5) + /* Set __getcontext return value to 0. */ + slr %r2,%r2 + /* Store general purpose registers. */ stm %r0,%r15,SC_GPRS(%r5) - /* Return 0. */ - slr %r2,%r2 + /* Return. */ br %r14 END(__getcontext) diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S b/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S index 40adc85..2bed318 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S +++ b/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S @@ -62,8 +62,7 @@ ENTRY(__setcontext) /* Load general purpose registers. */ lm %r0,%r15,SC_GPRS(%r5) - /* Return 1. */ - la %r2,1 + /* Return. */ br %r14 END(__setcontext) diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S b/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S index 2fc21e2..9eba838 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S +++ b/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S @@ -25,9 +25,7 @@ /* __getcontext (const ucontext_t *ucp) Saves the machine context in UCP such that when it is activated, - it appears as if __getcontext() returned again. The only difference - is that on a first return, %r2 contains 1 and on a subsequent - return, it contains 0. + it appears as if __getcontext() returned again. This implementation is intended to be used for *synchronous* context switches only. Therefore, it does not have to save anything @@ -61,11 +59,13 @@ ENTRY(__getcontext) std %f14,SC_FPRS+112(%r5) std %f15,SC_FPRS+120(%r5) + /* Set __getcontext return value to 0. */ + slr %r2,%r2 + /* Store general purpose registers. */ stmg %r0,%r15,SC_GPRS(%r5) - /* Return 0. */ - slgr %r2,%r2 + /* Return. */ br %r14 END(__getcontext) diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S b/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S index b3a9fea..a652ad3 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S +++ b/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S @@ -62,8 +62,7 @@ ENTRY(__setcontext) /* Load general purpose registers. */ lmg %r0,%r15,SC_GPRS(%r5) - /* Return 1. */ - la %r2,1 + /* Return. */ br %r14 END(__setcontext) diff --git a/sysdeps/unix/sysv/linux/s390/swapcontext.c b/sysdeps/unix/sysv/linux/s390/swapcontext.c index 9f1be05..2b34b63 100644 --- a/sysdeps/unix/sysv/linux/s390/swapcontext.c +++ b/sysdeps/unix/sysv/linux/s390/swapcontext.c @@ -25,8 +25,14 @@ extern int __setcontext (__const ucontext_t *__ucp) __THROW; int __swapcontext (ucontext_t *oucp, const ucontext_t *ucp) { - if (__getcontext (oucp) == 0) - __setcontext (ucp); + /* Save the current machine context to oucp. */ + __getcontext (oucp); + /* Modify oucp to skip the __setcontext call on reactivation. */ + oucp->uc_mcontext.gregs[14] = &&fake_return; + /* Restore the machine context in ucp. */ + __setcontext (ucp); + +fake_return: return 0; } |