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