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 *ucp, void (*func)(void), int argc, ...)
5 41b3e8b9 2020-01-20 rsc {
6 41b3e8b9 2020-01-20 rsc int *sp;
7 41b3e8b9 2020-01-20 rsc
8 41b3e8b9 2020-01-20 rsc sp = USPALIGN(ucp, 4);
9 41b3e8b9 2020-01-20 rsc sp -= argc;
10 41b3e8b9 2020-01-20 rsc memmove(sp, &argc+1, argc*sizeof(int));
11 41b3e8b9 2020-01-20 rsc *--sp = 0; /* return address */
12 41b3e8b9 2020-01-20 rsc ucp->uc_mcontext.mc_eip = (long)func;
13 41b3e8b9 2020-01-20 rsc ucp->uc_mcontext.mc_esp = (int)sp;
14 41b3e8b9 2020-01-20 rsc }
15 41b3e8b9 2020-01-20 rsc
16 41b3e8b9 2020-01-20 rsc int
17 41b3e8b9 2020-01-20 rsc swapcontext(ucontext_t *oucp, ucontext_t *ucp)
18 41b3e8b9 2020-01-20 rsc {
19 41b3e8b9 2020-01-20 rsc if(getcontext(oucp) == 0)
20 41b3e8b9 2020-01-20 rsc setcontext(ucp);
21 41b3e8b9 2020-01-20 rsc return 0;
22 41b3e8b9 2020-01-20 rsc }