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