Blame


1 bea4b9f7 2005-07-19 devnull #include "threadimpl.h"
2 bea4b9f7 2005-07-19 devnull
3 bea4b9f7 2005-07-19 devnull void
4 bea4b9f7 2005-07-19 devnull makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...)
5 bea4b9f7 2005-07-19 devnull {
6 bea4b9f7 2005-07-19 devnull int *sp;
7 bea4b9f7 2005-07-19 devnull
8 bea4b9f7 2005-07-19 devnull sp = (int*)ucp->uc_stack.ss_sp+ucp->uc_stack.ss_size/4;
9 bea4b9f7 2005-07-19 devnull sp -= argc;
10 bea4b9f7 2005-07-19 devnull memmove(sp, &argc+1, argc*sizeof(int));
11 bea4b9f7 2005-07-19 devnull *--sp = 0; /* return address */
12 bea4b9f7 2005-07-19 devnull ucp->uc_mcontext.mc_eip = (long)func;
13 bea4b9f7 2005-07-19 devnull ucp->uc_mcontext.mc_esp = (int)sp;
14 bea4b9f7 2005-07-19 devnull }
15 bea4b9f7 2005-07-19 devnull
16 bea4b9f7 2005-07-19 devnull extern int getmcontext(mcontext_t*);
17 bea4b9f7 2005-07-19 devnull extern int setmcontext(mcontext_t*);
18 bea4b9f7 2005-07-19 devnull
19 bea4b9f7 2005-07-19 devnull int
20 bea4b9f7 2005-07-19 devnull getcontext(ucontext_t *uc)
21 bea4b9f7 2005-07-19 devnull {
22 bea4b9f7 2005-07-19 devnull return getmcontext(&uc->uc_mcontext);
23 bea4b9f7 2005-07-19 devnull }
24 bea4b9f7 2005-07-19 devnull
25 bea4b9f7 2005-07-19 devnull void
26 bea4b9f7 2005-07-19 devnull setcontext(ucontext_t *uc)
27 bea4b9f7 2005-07-19 devnull {
28 bea4b9f7 2005-07-19 devnull setmcontext(&uc->uc_mcontext);
29 bea4b9f7 2005-07-19 devnull }
30 bea4b9f7 2005-07-19 devnull
31 bea4b9f7 2005-07-19 devnull int
32 bea4b9f7 2005-07-19 devnull swapcontext(ucontext_t *oucp, ucontext_t *ucp)
33 bea4b9f7 2005-07-19 devnull {
34 bea4b9f7 2005-07-19 devnull if(getcontext(oucp) == 0)
35 bea4b9f7 2005-07-19 devnull setcontext(ucp);
36 bea4b9f7 2005-07-19 devnull return 0;
37 bea4b9f7 2005-07-19 devnull }
38 bea4b9f7 2005-07-19 devnull