Blame


1 110c707d 2006-04-21 devnull #include "threadimpl.h"
2 110c707d 2006-04-21 devnull
3 110c707d 2006-04-21 devnull void
4 110c707d 2006-04-21 devnull makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...)
5 110c707d 2006-04-21 devnull {
6 fa07e3d7 2006-04-22 devnull int n;
7 110c707d 2006-04-21 devnull int *sp;
8 110c707d 2006-04-21 devnull
9 110c707d 2006-04-21 devnull sp = (int*)ucp->uc_stack.ss_sp+ucp->uc_stack.ss_size/4;
10 110c707d 2006-04-21 devnull sp -= argc;
11 fa07e3d7 2006-04-22 devnull /*
12 fa07e3d7 2006-04-22 devnull * Stack pointer at call instruction (before return address
13 fa07e3d7 2006-04-22 devnull * gets pushed) must be 16-byte aligned.
14 fa07e3d7 2006-04-22 devnull */
15 fa07e3d7 2006-04-22 devnull if((uintptr)sp%4)
16 fa07e3d7 2006-04-22 devnull abort();
17 fa07e3d7 2006-04-22 devnull while((uintptr)sp%16)
18 fa07e3d7 2006-04-22 devnull sp--;
19 110c707d 2006-04-21 devnull memmove(sp, &argc+1, argc*sizeof(int));
20 110c707d 2006-04-21 devnull *--sp = 0; /* return address */
21 110c707d 2006-04-21 devnull ucp->uc_mcontext.mc_eip = (long)func;
22 110c707d 2006-04-21 devnull ucp->uc_mcontext.mc_esp = (int)sp;
23 110c707d 2006-04-21 devnull }
24 110c707d 2006-04-21 devnull
25 110c707d 2006-04-21 devnull int
26 110c707d 2006-04-21 devnull swapcontext(ucontext_t *oucp, ucontext_t *ucp)
27 110c707d 2006-04-21 devnull {
28 110c707d 2006-04-21 devnull if(getcontext(oucp) == 0)
29 110c707d 2006-04-21 devnull setcontext(ucp);
30 110c707d 2006-04-21 devnull return 0;
31 110c707d 2006-04-21 devnull }
32 110c707d 2006-04-21 devnull