diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-05-03 21:06:46 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-05-03 21:06:46 +0200 |
commit | 2994fccbe1b881c3fa2838926d22af8aeda89640 (patch) | |
tree | 5fb20d75de24c162c1116fa2f3b4ff98cbdbd3dd /sys/src/ape/lib/ap/arm64/notetramp.c | |
parent | dfd915892a662216fa1f422ea56b89c8b34e3175 (diff) |
ape: initial support for arm64
Diffstat (limited to 'sys/src/ape/lib/ap/arm64/notetramp.c')
-rw-r--r-- | sys/src/ape/lib/ap/arm64/notetramp.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/sys/src/ape/lib/ap/arm64/notetramp.c b/sys/src/ape/lib/ap/arm64/notetramp.c new file mode 100644 index 000000000..ba303bc7c --- /dev/null +++ b/sys/src/ape/lib/ap/arm64/notetramp.c @@ -0,0 +1,72 @@ +#include "../plan9/lib.h" +#include "../plan9/sys9.h" +#include <signal.h> +#include <setjmp.h> + +/* A stack to hold pcs when signals nest */ +#define MAXSIGSTACK 20 +typedef struct Pcstack Pcstack; +static struct Pcstack { + int sig; + void (*hdlr)(int, char*, Ureg*); + unsigned long long restorepc; + Ureg *u; +} pcstack[MAXSIGSTACK]; +static int nstack = 0; + +static void notecont(Ureg*, char*); + +void +_notetramp(int sig, void (*hdlr)(int, char*, Ureg*), Ureg *u) +{ + Pcstack *p; + + if(nstack >= MAXSIGSTACK) + _NOTED(1); /* nesting too deep; just do system default */ + p = &pcstack[nstack]; + p->restorepc = u->pc; + p->sig = sig; + p->hdlr = hdlr; + p->u = u; + nstack++; + u->pc = (unsigned long long) notecont; + _NOTED(2); /* NSAVE: clear note but hold state */ +} + +static void +notecont(Ureg *u, char *s) +{ + Pcstack *p; + void(*f)(int, char*, Ureg*); + + p = &pcstack[nstack-1]; + f = p->hdlr; + u->pc = p->restorepc; + nstack--; + (*f)(p->sig, s, u); + _NOTED(3); /* NRSTR */ +} + +#define JMPBUFPC 1 +#define JMPBUFSP 0 + +extern sigset_t _psigblocked; + +void +siglongjmp(sigjmp_buf j, int ret) +{ + struct Ureg *u; + + if(j[0]) + _psigblocked = j[1]; + if(nstack == 0 || pcstack[nstack-1].u->sp > j[2+JMPBUFSP]) + longjmp(j+2, ret); + u = pcstack[nstack-1].u; + nstack--; + u->r0 = ret; + if(ret == 0) + u->r0 = 1; + u->pc = j[2+JMPBUFPC]; + u->sp = j[2+JMPBUFSP]; + _NOTED(3); /* NRSTR */ +} |