[patch] s390: makecontext trampoline.
Martin Schwidefsky
schwidefsky@de.ibm.com
Wed Sep 20 14:22:00 GMT 2006
Hi,
the makecontext function should not use the stack for a trampoline
for no good reason. If we ever want to implement non-executable-stack
this will bite us.
--
blue skies,
Martin.
Martin Schwidefsky
Linux for zSeries Development & Services
IBM Deutschland Entwicklung GmbH
"Reality continues to ruin my life." - Calvin.
---
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.
(__makecontext): 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.
diff -urpN libc/sysdeps/unix/sysv/linux/s390/s390-32/makecontext.c libc-s390/sysdeps/unix/sysv/linux/s390/s390-32/makecontext.c
--- libc/sysdeps/unix/sysv/linux/s390/s390-32/makecontext.c 2001-07-06 06:56:19.000000000 +0200
+++ libc-s390/sysdeps/unix/sysv/linux/s390/s390-32/makecontext.c 2006-08-25 14:38:22.000000000 +0200
@@ -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 (*f
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 -urpN libc/sysdeps/unix/sysv/linux/s390/s390-64/makecontext.c libc-s390/sysdeps/unix/sysv/linux/s390/s390-64/makecontext.c
--- libc/sysdeps/unix/sysv/linux/s390/s390-64/makecontext.c 2001-07-06 06:56:20.000000000 +0200
+++ libc-s390/sysdeps/unix/sysv/linux/s390/s390-64/makecontext.c 2006-08-25 14:38:27.000000000 +0200
@@ -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 (*f
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)
More information about the Libc-hacker
mailing list