Blame


1 41b3e8b9 2020-01-20 rsc #include "threadimpl.h"
2 41b3e8b9 2020-01-20 rsc
3 41b3e8b9 2020-01-20 rsc void
4 41b3e8b9 2020-01-20 rsc makecontext(ucontext_t *uc, void (*fn)(void), int argc, ...)
5 41b3e8b9 2020-01-20 rsc {
6 41b3e8b9 2020-01-20 rsc uintptr *sp;
7 41b3e8b9 2020-01-20 rsc va_list arg;
8 41b3e8b9 2020-01-20 rsc
9 41b3e8b9 2020-01-20 rsc if(argc != 2)
10 41b3e8b9 2020-01-20 rsc sysfatal("libthread: makecontext misused");
11 41b3e8b9 2020-01-20 rsc va_start(arg, argc);
12 41b3e8b9 2020-01-20 rsc uc->mc.di = va_arg(arg, uint);
13 41b3e8b9 2020-01-20 rsc uc->mc.si = va_arg(arg, uint);
14 41b3e8b9 2020-01-20 rsc va_end(arg);
15 41b3e8b9 2020-01-20 rsc
16 41b3e8b9 2020-01-20 rsc sp = USPALIGN(uc, 16);
17 41b3e8b9 2020-01-20 rsc *--sp = 0; // fn's return address
18 41b3e8b9 2020-01-20 rsc *--sp = (uintptr)fn; // return address of setcontext
19 41b3e8b9 2020-01-20 rsc uc->mc.sp = (uintptr)sp;
20 41b3e8b9 2020-01-20 rsc }
21 41b3e8b9 2020-01-20 rsc
22 41b3e8b9 2020-01-20 rsc int
23 41b3e8b9 2020-01-20 rsc swapcontext(ucontext_t *oucp, ucontext_t *ucp)
24 41b3e8b9 2020-01-20 rsc {
25 41b3e8b9 2020-01-20 rsc if(getcontext(oucp) == 0)
26 41b3e8b9 2020-01-20 rsc setcontext(ucp);
27 41b3e8b9 2020-01-20 rsc return 0;
28 41b3e8b9 2020-01-20 rsc }