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