diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-32/makecontext.c | 20 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-64/makecontext.c | 19 |
3 files changed, 32 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog index 71359229ad..fb775e8564 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2006-09-20 Martin Schwidefsky <schwidefsky@de.ibm.com> + + * sysdeps/unix/sysv/linux/s390/s390-32/makecontext.c (__makecontext): + Cast sp to unsigned long to avoid compiler warning. + Use __makecontext_ret function instead of a trampoline on the stack. + (__makecontext_ret): New function. + * sysdeps/unix/sysv/linux/s390/s390-64/makecontext.c: Likewise. + 2006-09-19 Jakub Jelinek <jakub@redhat.com> * elf/dl-cache.c (HWCAP_CHECK): If _DL_PLATFORMS_COUNT, but diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/makecontext.c b/sysdeps/unix/sysv/linux/s390/s390-32/makecontext.c index 29c8640e92..94760e0c2b 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/makecontext.c +++ b/sysdeps/unix/sysv/linux/s390/s390-32/makecontext.c @@ -37,8 +37,6 @@ +-----------------------+ n | overflow parameters | 96 +-----------------------+ - 8 | trampoline | 96+n - +-----------------------+ The registers are set up like this: %r2-%r6: parameters 1 to 5 %r7 : (*func) pointer @@ -55,18 +53,16 @@ void __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...) { + extern void __makecontext_ret (void); unsigned long *sp; va_list ap; int i; - sp = (long *) (((long) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size) & -8L); - - /* Setup the trampoline. */ - *--sp = 0x07f90000; - *--sp = 0x0de71828; + sp = (unsigned long *) (((unsigned long) ucp->uc_stack.ss_sp + + ucp->uc_stack.ss_size) & -8L); /* Set the return address to trampoline. */ - ucp->uc_mcontext.gregs[14] = (long) sp; + ucp->uc_mcontext.gregs[14] = (long) __makecontext_ret; /* Set register parameters. */ va_start (ap, argc); @@ -98,4 +94,12 @@ __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...) ucp->uc_mcontext.gregs[15] = (long) sp; } +asm(".text\n" + ".type __makecontext_ret,@function\n" + "__makecontext_ret:\n" + " basr %r14,%r7\n" + " lr %r2,%r8\n" + " br %r9\n" + ".size __makecontext_ret, .-__makecontext_ret"); + weak_alias (__makecontext, makecontext) diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/makecontext.c b/sysdeps/unix/sysv/linux/s390/s390-64/makecontext.c index cdff9a4f21..b08f1b4047 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/makecontext.c +++ b/sysdeps/unix/sysv/linux/s390/s390-64/makecontext.c @@ -37,8 +37,6 @@ +-----------------------+ n | overflow parameters | 160 +-----------------------+ - 8 | trampoline | 160+n - +-----------------------+ The registers are set up like this: %r2-%r6: parameters 1 to 5 %r7 : (*func) pointer @@ -55,17 +53,16 @@ void __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...) { + extern void __makecontext_ret (void); unsigned long *sp; va_list ap; int i; - sp = (long *) (((long) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size) & -8L); - - /* Setup the trampoline. */ - *--sp = 0x0de7b904002807f9; + sp = (unsigned long *) (((unsigned long) ucp->uc_stack.ss_sp + + ucp->uc_stack.ss_size) & -8L); /* Set the return address to trampoline. */ - ucp->uc_mcontext.gregs[14] = (long) sp; + ucp->uc_mcontext.gregs[14] = (long) __makecontext_ret; /* Set register parameters. */ va_start (ap, argc); @@ -97,4 +94,12 @@ __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...) ucp->uc_mcontext.gregs[15] = (long) sp; } +asm(".text\n" + ".type __makecontext_ret,@function\n" + "__makecontext_ret:\n" + " basr %r14,%r7\n" + " lgr %r2,%r8\n" + " br %r9\n" + ".size __makecontext_ret, .-__makecontext_ret"); + weak_alias (__makecontext, makecontext) |