1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00

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.
This commit is contained in:
David S. Miller
2012-11-07 21:00:09 -08:00
parent 0fbb0fbc2e
commit 60e8270d6c
4 changed files with 54 additions and 12 deletions

View File

@ -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)