diff options
author | David S. Miller <davem@davemloft.net> | 2012-11-07 21:00:09 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-11-07 21:01:06 -0800 |
commit | 60e8270d6ca19ddb351fb78e979ae908076e2d4b (patch) | |
tree | e334c98b32274bb297aea1334171c14186ca553b /sysdeps/unix/sysv/linux/sparc/sparc64/makecontext.c | |
parent | 0fbb0fbc2e6cb8f76364a88f512aa880d40a8f40 (diff) | |
download | glibc-60e8270d6ca19ddb351fb78e979ae908076e2d4b.tar glibc-60e8270d6ca19ddb351fb78e979ae908076e2d4b.tar.gz glibc-60e8270d6ca19ddb351fb78e979ae908076e2d4b.tar.bz2 glibc-60e8270d6ca19ddb351fb78e979ae908076e2d4b.zip |
Fix NULL ucontext->uc_link handling on sparc64.
* sysdeps/unix/sysv/linux/sparc/sparc64/__start_context.S: New file.
* sysdeps/unix/sysv/linux/sparc/sparc64/makecontext.c
(__start_context): Declare.
(__makecontext_ret): Delete.
(__makecontext): Hook up __start_context instead of
__makecontext_ret.
* sysdeps/unix/sysv/linux/sparc/sparc64/Makefile
(sysdep_routines): Add __start_context when in stdlib.
Diffstat (limited to 'sysdeps/unix/sysv/linux/sparc/sparc64/makecontext.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc64/makecontext.c | 15 |
1 files changed, 3 insertions, 12 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/makecontext.c b/sysdeps/unix/sysv/linux/sparc/sparc64/makecontext.c index e925040d14..11e617e03b 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/makecontext.c +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/makecontext.c @@ -21,6 +21,8 @@ #include <stdlib.h> #include <ucontext.h> +extern void __start_context (struct ucontext *ucp); + void __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...) { @@ -37,7 +39,7 @@ __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...) ucp->uc_mcontext.mc_gregs[MC_PC] = (long) func; ucp->uc_mcontext.mc_gregs[MC_NPC] = ((long) func) + 4; ucp->uc_mcontext.mc_gregs[MC_O6] = ((long) sp) - 0x7ff; - ucp->uc_mcontext.mc_gregs[MC_O7] = ((long) __makecontext_ret) - 8; + ucp->uc_mcontext.mc_gregs[MC_O7] = ((long) __start_context) - 8; ucp->uc_mcontext.mc_fp = ((long) topsp) - 0x7ff; ucp->uc_mcontext.mc_i7 = 0; topsp[14] = 0; @@ -52,15 +54,4 @@ __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...) va_end (ap); } -asm (" \n\ - .text \n\ - .type __makecontext_ret, #function \n\ -__makecontext_ret: \n\ - mov 1, %o1 \n\ - call __setcontext \n\ - mov %i0, %o0 \n\ - unimp 0 \n\ - .size __makecontext_ret, .-__makecontext_ret \n\ - "); - weak_alias (__makecontext, makecontext) |