#include "threadimpl.h" void makecontext(ucontext_t *uc, void (*fn)(void), int argc, ...) { uintptr *sp; va_list arg; //fprint(2, "makecontext %d\n", argc); if(argc != 2) sysfatal("libthread: makecontext misused"); va_start(arg, argc); uc->mc.di = va_arg(arg, uint); uc->mc.si = va_arg(arg, uint); //fprint(2, "%ux %ux\n", uc->mc.di, uc->mc.si); va_end(arg); sp = (uintptr*)((char*)uc->uc_stack.ss_sp+uc->uc_stack.ss_size); *--sp = 0; // fn's return address *--sp = (uintptr)fn; // return address of setcontext uc->mc.sp = (uintptr)sp; } int swapcontext(ucontext_t *oucp, ucontext_t *ucp) { if(getcontext(oucp) == 0) setcontext(ucp); return 0; }