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 int i, *sp;
7 41b3e8b9 2020-01-20 rsc va_list arg;
8 41b3e8b9 2020-01-20 rsc
9 41b3e8b9 2020-01-20 rsc sp = USPALIGN(uc, 4);
10 41b3e8b9 2020-01-20 rsc va_start(arg, argc);
11 41b3e8b9 2020-01-20 rsc for(i=0; i<4 && i<argc; i++)
12 41b3e8b9 2020-01-20 rsc (&uc->uc_mcontext.arm_r0)[i] = va_arg(arg, uint);
13 41b3e8b9 2020-01-20 rsc va_end(arg);
14 41b3e8b9 2020-01-20 rsc uc->uc_mcontext.arm_sp = (uint)sp;
15 41b3e8b9 2020-01-20 rsc uc->uc_mcontext.arm_lr = (uint)fn;
16 41b3e8b9 2020-01-20 rsc }
17 41b3e8b9 2020-01-20 rsc
18 41b3e8b9 2020-01-20 rsc int
19 41b3e8b9 2020-01-20 rsc swapcontext(ucontext_t *oucp, const ucontext_t *ucp)
20 41b3e8b9 2020-01-20 rsc {
21 41b3e8b9 2020-01-20 rsc if(getcontext(oucp) == 0)
22 41b3e8b9 2020-01-20 rsc setcontext(ucp);
23 41b3e8b9 2020-01-20 rsc return 0;
24 41b3e8b9 2020-01-20 rsc }