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