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