[POWERPC] Fix ppc64 makecontext() parameter overflow handling.
On ELFv2, the overflow parameters in the stack frame are at a different offset from sp than ELFv1. Adjust code to use the correct offset in all cases. This had resulted in argv[8] and up being copied to the incorrect address in the new context's initial stack frame. This is not necessarily the only bug in this function, I need to do a full review still and ensure the rest of the math is sane for ELFv2 stack frames. Reported by: pherde (Probably. My notes are a bit unclear.) Reviewed by: jhibbits (in irc) Sponsored by: Tag1 Consulting, Inc.
This commit is contained in:
parent
9f9cc3f989
commit
e039e3d1d2
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=363972
@ -102,7 +102,11 @@ __makecontext(ucontext_t *ucp, void (*start)(void), int argc, ...)
|
|||||||
uint64_t *argp;
|
uint64_t *argp;
|
||||||
|
|
||||||
/* Skip past frame pointer and saved LR */
|
/* Skip past frame pointer and saved LR */
|
||||||
|
#if !defined(_CALL_ELF) || _CALL_ELF == 1
|
||||||
argp = (uint64_t *)sp + 6;
|
argp = (uint64_t *)sp + 6;
|
||||||
|
#else
|
||||||
|
argp = (uint64_t *)sp + 4;
|
||||||
|
#endif
|
||||||
|
|
||||||
for (i = 0; i < stackargs; i++)
|
for (i = 0; i < stackargs; i++)
|
||||||
*argp++ = va_arg(ap, uint64_t);
|
*argp++ = va_arg(ap, uint64_t);
|
||||||
|
Loading…
Reference in New Issue
Block a user