diff --git a/sys/src/libthread/arm64.c b/sys/src/libthread/arm64.c new file mode 100644 index 000000000..0170e6caf --- /dev/null +++ b/sys/src/libthread/arm64.c @@ -0,0 +1,28 @@ +#include +#include +#include +#include "threadimpl.h" + +/* first argument goes in a register; simplest just to ignore it */ +static void +launcherarm64(int, void (*f)(void *arg), void *arg) +{ + (*f)(arg); + threadexits(nil); +} + +void +_threadinitstack(Thread *t, void (*f)(void*), void *arg) +{ + uintptr *tos; + + tos = (uintptr*)&t->stk[t->stksize&~15]; + *--tos = (uintptr)arg; + *--tos = (uintptr)f; + *--tos = 0; /* first arg to launcherarm64 */ + *--tos = 0; /* place to store return PC */ + + t->sched[JMPBUFPC] = (uintptr)launcherarm64+JMPBUFDPC; + t->sched[JMPBUFSP] = (uintptr)tos; +} +