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