From 60e8270d6ca19ddb351fb78e979ae908076e2d4b Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Wed, 7 Nov 2012 21:00:09 -0800 Subject: 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. --- sysdeps/unix/sysv/linux/sparc/sparc64/makecontext.c | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) (limited to 'sysdeps/unix/sysv/linux/sparc/sparc64/makecontext.c') 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 #include +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) -- cgit v1.2.3-70-g09d2