public inbox for libc-hacker@sourceware.org
 help / color / mirror / Atom feed
* [patch] s390: makecontext trampoline.
@ 2006-09-20 14:22 Martin Schwidefsky
  2006-09-20 14:30 ` Ulrich Drepper
  0 siblings, 1 reply; 2+ messages in thread
From: Martin Schwidefsky @ 2006-09-20 14:22 UTC (permalink / raw)
  To: libc-hacker

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)

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [patch] s390: makecontext trampoline.
  2006-09-20 14:22 [patch] s390: makecontext trampoline Martin Schwidefsky
@ 2006-09-20 14:30 ` Ulrich Drepper
  0 siblings, 0 replies; 2+ messages in thread
From: Ulrich Drepper @ 2006-09-20 14:30 UTC (permalink / raw)
  To: Martin Schwidefsky; +Cc: libc-hacker

[-- Attachment #1: Type: text/plain, Size: 101 bytes --]

Applied.

-- 
➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 251 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-09-20 14:30 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-09-20 14:22 [patch] s390: makecontext trampoline Martin Schwidefsky
2006-09-20 14:30 ` Ulrich Drepper

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).