[PowerPC] Fix *context on ELFv2

Due to ELFv1 specific code in _ctx_start.S and makecontext.c, userspace
context switching was completely broken on ELFv2.

With this change, we now pass the libthr test suite.

Approved by: jhibbits (mentor)
Differential Revision: https://reviews.freebsd.org/D22421
This commit is contained in:
Brandon Bergren 2019-11-16 20:33:46 +00:00
parent a3851eec6e
commit 7316504cd5
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=354780
2 changed files with 11 additions and 0 deletions

View File

@ -32,8 +32,14 @@
.globl CNAME(abort)
ENTRY(_ctx_start)
#if !defined(_CALL_ELF) || _CALL_ELF == 1
/* Load values from function descriptor */
ld %r2,8(%r14)
ld %r14,0(%r14)
#else
/* Load global entry point */
mr %r12,%r14
#endif
mtlr %r14
blrl /* branch to start function */
mr %r3,%r15 /* pass pointer to ucontext as argument */

View File

@ -113,7 +113,12 @@ __makecontext(ucontext_t *ucp, void (*start)(void), int argc, ...)
* Use caller-saved regs 14/15 to hold params that _ctx_start
* will use to invoke the user-supplied func
*/
#if !defined(_CALL_ELF) || _CALL_ELF == 1
/* Cast to ensure this is treated as a function descriptor. */
mc->mc_srr0 = *(uintptr_t *)_ctx_start;
#else
mc->mc_srr0 = (uintptr_t) _ctx_start;
#endif
mc->mc_gpr[1] = (uintptr_t) sp; /* new stack pointer */
mc->mc_gpr[14] = (uintptr_t) start; /* r14 <- start */
mc->mc_gpr[15] = (uintptr_t) ucp; /* r15 <- ucp */