|  | #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; | 
|  | } | 
|  |  |