1*12b1df16SDavid du Colombier #include <u.h> 2*12b1df16SDavid du Colombier #include <libc.h> 3*12b1df16SDavid du Colombier #include <thread.h> 4*12b1df16SDavid du Colombier #include "threadimpl.h" 5*12b1df16SDavid du Colombier 6*12b1df16SDavid du Colombier /* first argument goes in a register; simplest just to ignore it */ 7*12b1df16SDavid du Colombier static void launcherspim(int,void (* f)(void * arg),void * arg)8*12b1df16SDavid du Colombierlauncherspim(int, void (*f)(void *arg), void *arg) 9*12b1df16SDavid du Colombier { 10*12b1df16SDavid du Colombier (*f)(arg); 11*12b1df16SDavid du Colombier threadexits(nil); 12*12b1df16SDavid du Colombier } 13*12b1df16SDavid du Colombier 14*12b1df16SDavid du Colombier void _threadinitstack(Thread * t,void (* f)(void *),void * arg)15*12b1df16SDavid du Colombier_threadinitstack(Thread *t, void (*f)(void*), void *arg) 16*12b1df16SDavid du Colombier { 17*12b1df16SDavid du Colombier ulong *tos; 18*12b1df16SDavid du Colombier 19*12b1df16SDavid du Colombier tos = (ulong*)&t->stk[t->stksize&~7]; 20*12b1df16SDavid du Colombier *--tos = (ulong)arg; 21*12b1df16SDavid du Colombier *--tos = (ulong)f; 22*12b1df16SDavid du Colombier *--tos = 0; /* first arg to launcherspim */ 23*12b1df16SDavid du Colombier *--tos = 0; /* place to store return PC */ 24*12b1df16SDavid du Colombier t->sched[JMPBUFPC] = (ulong)launcherspim+JMPBUFDPC; 25*12b1df16SDavid du Colombier t->sched[JMPBUFSP] = (ulong)tos; 26*12b1df16SDavid du Colombier } 27