| #include "threadimpl.h" |
| |
| void |
| makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...) |
| { |
| int *sp; |
| |
| sp = (int*)ucp->uc_stack.ss_sp+ucp->uc_stack.ss_size/4; |
| 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)); |
| *--sp = 0; /* return address */ |
| ucp->uc_mcontext.mc_eip = (long)func; |
| ucp->uc_mcontext.mc_esp = (int)sp; |
| } |
| |
| int |
| swapcontext(ucontext_t *oucp, ucontext_t *ucp) |
| { |
| if(getcontext(oucp) == 0) |
| setcontext(ucp); |
| return 0; |
| } |
| |