Blame


1 ba940ae6 2009-11-18 rsc #include "threadimpl.h"
2 ba940ae6 2009-11-18 rsc
3 ba940ae6 2009-11-18 rsc void
4 ba940ae6 2009-11-18 rsc makecontext(ucontext_t *uc, void (*fn)(void), int argc, ...)
5 ba940ae6 2009-11-18 rsc {
6 ba940ae6 2009-11-18 rsc int i, *sp;
7 ba940ae6 2009-11-18 rsc va_list arg;
8 ba940ae6 2009-11-18 rsc
9 ba940ae6 2009-11-18 rsc sp = (int*)uc->uc_stack.ss_sp+uc->uc_stack.ss_size/4;
10 ba940ae6 2009-11-18 rsc va_start(arg, argc);
11 ba940ae6 2009-11-18 rsc for(i=0; i<4 && i<argc; i++)
12 ba940ae6 2009-11-18 rsc uc->uc_mcontext.gregs[i] = va_arg(arg, uint);
13 ba940ae6 2009-11-18 rsc va_end(arg);
14 ba940ae6 2009-11-18 rsc uc->uc_mcontext.gregs[13] = (uint)sp;
15 ba940ae6 2009-11-18 rsc uc->uc_mcontext.gregs[14] = (uint)fn;
16 ba940ae6 2009-11-18 rsc }
17 ba940ae6 2009-11-18 rsc
18 ba940ae6 2009-11-18 rsc int
19 ba940ae6 2009-11-18 rsc swapcontext(ucontext_t *oucp, const ucontext_t *ucp)
20 ba940ae6 2009-11-18 rsc {
21 ba940ae6 2009-11-18 rsc if(getcontext(oucp) == 0)
22 ba940ae6 2009-11-18 rsc setcontext(ucp);
23 ba940ae6 2009-11-18 rsc return 0;
24 ba940ae6 2009-11-18 rsc }
25 ba940ae6 2009-11-18 rsc
26 ba940ae6 2009-11-18 rsc