Blame


1 04e0a9bb 2011-10-14 rsc #include "threadimpl.h"
2 04e0a9bb 2011-10-14 rsc
3 04e0a9bb 2011-10-14 rsc void
4 04e0a9bb 2011-10-14 rsc makecontext(ucontext_t *uc, void (*fn)(void), int argc, ...)
5 04e0a9bb 2011-10-14 rsc {
6 04e0a9bb 2011-10-14 rsc uintptr *sp;
7 04e0a9bb 2011-10-14 rsc va_list arg;
8 04e0a9bb 2011-10-14 rsc
9 04e0a9bb 2011-10-14 rsc //fprint(2, "makecontext %d\n", argc);
10 04e0a9bb 2011-10-14 rsc if(argc != 2)
11 04e0a9bb 2011-10-14 rsc sysfatal("libthread: makecontext misused");
12 04e0a9bb 2011-10-14 rsc va_start(arg, argc);
13 04e0a9bb 2011-10-14 rsc uc->mc.di = va_arg(arg, uint);
14 04e0a9bb 2011-10-14 rsc uc->mc.si = va_arg(arg, uint);
15 04e0a9bb 2011-10-14 rsc //fprint(2, "%ux %ux\n", uc->mc.di, uc->mc.si);
16 04e0a9bb 2011-10-14 rsc va_end(arg);
17 04e0a9bb 2011-10-14 rsc
18 04e0a9bb 2011-10-14 rsc sp = (uintptr*)((char*)uc->uc_stack.ss_sp+uc->uc_stack.ss_size);
19 04e0a9bb 2011-10-14 rsc *--sp = 0; // fn's return address
20 04e0a9bb 2011-10-14 rsc *--sp = (uintptr)fn; // return address of setcontext
21 04e0a9bb 2011-10-14 rsc uc->mc.sp = (uintptr)sp;
22 04e0a9bb 2011-10-14 rsc }
23 04e0a9bb 2011-10-14 rsc
24 04e0a9bb 2011-10-14 rsc int
25 04e0a9bb 2011-10-14 rsc swapcontext(ucontext_t *oucp, ucontext_t *ucp)
26 04e0a9bb 2011-10-14 rsc {
27 04e0a9bb 2011-10-14 rsc if(getcontext(oucp) == 0)
28 04e0a9bb 2011-10-14 rsc setcontext(ucp);
29 04e0a9bb 2011-10-14 rsc return 0;
30 04e0a9bb 2011-10-14 rsc }
31 04e0a9bb 2011-10-14 rsc
32 04e0a9bb 2011-10-14 rsc