Skip to content

Commit

Permalink
* sysdeps/unix/sysv/linux/s390/s390-32/makecontext.c (__makecontext):
Browse files Browse the repository at this point in the history
	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.
  • Loading branch information
Ulrich Drepper committed Sep 20, 2006
1 parent 33315ce commit 60cb50c
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 15 deletions.
8 changes: 8 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
20 changes: 12 additions & 8 deletions sysdeps/unix/sysv/linux/s390/s390-32/makecontext.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);
Expand Down Expand Up @@ -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)
19 changes: 12 additions & 7 deletions sysdeps/unix/sysv/linux/s390/s390-64/makecontext.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);
Expand Down Expand Up @@ -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)

0 comments on commit 60cb50c

Please sign in to comment.