16-byte align
This commit is contained in:
parent
d9ed72433f
commit
fa07e3d777
1 changed files with 9 additions and 0 deletions
|
|
@ -3,10 +3,19 @@
|
||||||
void
|
void
|
||||||
makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...)
|
makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...)
|
||||||
{
|
{
|
||||||
|
int n;
|
||||||
int *sp;
|
int *sp;
|
||||||
|
|
||||||
sp = (int*)ucp->uc_stack.ss_sp+ucp->uc_stack.ss_size/4;
|
sp = (int*)ucp->uc_stack.ss_sp+ucp->uc_stack.ss_size/4;
|
||||||
sp -= argc;
|
sp -= argc;
|
||||||
|
/*
|
||||||
|
* Stack pointer at call instruction (before return address
|
||||||
|
* gets pushed) must be 16-byte aligned.
|
||||||
|
*/
|
||||||
|
if((uintptr)sp%4)
|
||||||
|
abort();
|
||||||
|
while((uintptr)sp%16)
|
||||||
|
sp--;
|
||||||
memmove(sp, &argc+1, argc*sizeof(int));
|
memmove(sp, &argc+1, argc*sizeof(int));
|
||||||
*--sp = 0; /* return address */
|
*--sp = 0; /* return address */
|
||||||
ucp->uc_mcontext.mc_eip = (long)func;
|
ucp->uc_mcontext.mc_eip = (long)func;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue