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 | |
parent | dfd915892a662216fa1f422ea56b89c8b34e3175 (diff) |
ape: initial support for arm64
Diffstat (limited to 'sys/src/ape/lib/ap')
-rw-r--r-- | sys/src/ape/lib/ap/arm64/_seek.c | 11 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/arm64/getfcr.s | 21 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/arm64/lock.c | 43 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/arm64/main9.s | 39 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/arm64/mkfile | 16 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/arm64/notetramp.c | 72 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/arm64/setjmp.s | 26 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/arm64/tas.s | 11 |
8 files changed, 239 insertions, 0 deletions
diff --git a/sys/src/ape/lib/ap/arm64/_seek.c b/sys/src/ape/lib/ap/arm64/_seek.c new file mode 100644 index 000000000..a9d92c7cb --- /dev/null +++ b/sys/src/ape/lib/ap/arm64/_seek.c @@ -0,0 +1,11 @@ +extern long __SEEK(long long*, int, long long, int); + +long long +_SEEK(int fd, long long o, int p) +{ + long long l; + + if(__SEEK(&l, fd, o, p) < 0) + l = -1; + return l; +} diff --git a/sys/src/ape/lib/ap/arm64/getfcr.s b/sys/src/ape/lib/ap/arm64/getfcr.s new file mode 100644 index 000000000..c5c90de90 --- /dev/null +++ b/sys/src/ape/lib/ap/arm64/getfcr.s @@ -0,0 +1,21 @@ +#define SYSARG5(op0,op1,Cn,Cm,op2) ((op0)<<19|(op1)<<16|(Cn)<<12|(Cm)<<8|(op2)<<5) + +#define FPCR SPR(SYSARG5(3,3,4,4,0)) +#define FPSR SPR(SYSARG5(3,3,4,4,1)) + +TEXT setfcr(SB), 1, $-4 + MSR R0, FPCR + RETURN + +TEXT getfcr(SB), 1, $-4 + MRS FPCR, R0 + RETURN + +TEXT getfsr(SB), 1, $-4 + MRS FPSR, R0 + RETURN + +TEXT setfsr(SB), 1, $-4 + MSR R0, FPSR + RETURN + diff --git a/sys/src/ape/lib/ap/arm64/lock.c b/sys/src/ape/lib/ap/arm64/lock.c new file mode 100644 index 000000000..0f777d44b --- /dev/null +++ b/sys/src/ape/lib/ap/arm64/lock.c @@ -0,0 +1,43 @@ +#define _LOCK_EXTENSION +#include "../plan9/sys9.h" +#include <lock.h> + +extern int tas(int*); +extern unsigned long long _barrier(unsigned long long); + +void +lock(Lock *lk) +{ + int i; + + /* once fast */ + if(!tas(&lk->val)) + return; + /* a thousand times pretty fast */ + for(i=0; i<1000; i++){ + if(!tas(&lk->val)) + return; + _SLEEP(0); + } + /* now nice and slow */ + for(i=0; i<1000; i++){ + if(!tas(&lk->val)) + return; + _SLEEP(100); + } + /* take your time */ + while(tas(&lk->val)) + _SLEEP(1000); +} + +int +canlock(Lock *lk) +{ + return tas(&lk->val) == 0; +} + +void +unlock(Lock *lk) +{ + lk->val = _barrier(0); +} diff --git a/sys/src/ape/lib/ap/arm64/main9.s b/sys/src/ape/lib/ap/arm64/main9.s new file mode 100644 index 000000000..d701b163a --- /dev/null +++ b/sys/src/ape/lib/ap/arm64/main9.s @@ -0,0 +1,39 @@ +#define NPRIVATES 16 + +GLOBL _tos(SB), $8 +GLOBL _errnoloc(SB), $8 +GLOBL _plan9err(SB), $128 +GLOBL _privates(SB), $8 +GLOBL _nprivates(SB), $4 + +TEXT _main(SB), 1, $(32 + 8+128 + NPRIVATES*8) + MOV $setSB(SB), R28 + MOV R0, _tos(SB) + + ADD $32, RSP, R1 + + MOV R1, _errnoloc(SB) + ADD $8, R1 + + MOV R1, _plan9err(SB) + ADD $128, R1 + + MOV R1, _privates(SB) + MOVW $NPRIVATES, R2 + MOVW R2, _nprivates(SB) + + BL _envsetup(SB) + + MOV environ(SB), R2 + MOV R2, 24(RSP) + + MOV $inargv+0(FP), R1 + MOV R1, 16(RSP) + + MOVW inargc-8(FP), R0 + MOV R0, 8(RSP) + + BL main(SB) +loop: + BL exit(SB) + B loop diff --git a/sys/src/ape/lib/ap/arm64/mkfile b/sys/src/ape/lib/ap/arm64/mkfile new file mode 100644 index 000000000..4e8f2a2c0 --- /dev/null +++ b/sys/src/ape/lib/ap/arm64/mkfile @@ -0,0 +1,16 @@ +APE=/sys/src/ape +<$APE/config +LIB=/$objtype/lib/ape/libap.a +OFILES=\ + _seek.$O\ + getfcr.$O\ + lock.$O\ + main9.$O\ + notetramp.$O\ + setjmp.$O\ + tas.$O\ + +</sys/src/cmd/mksyslib + +CFLAGS=-c -D_POSIX_SOURCE -D_PLAN9_SOURCE + 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 */ +} diff --git a/sys/src/ape/lib/ap/arm64/setjmp.s b/sys/src/ape/lib/ap/arm64/setjmp.s new file mode 100644 index 000000000..f4a725ad3 --- /dev/null +++ b/sys/src/ape/lib/ap/arm64/setjmp.s @@ -0,0 +1,26 @@ +TEXT sigsetjmp(SB), 1, $-4 + MOVW savemask+8(FP), R1 + MOVW _psigblocked(SB), R2 + MOVW R1, 0(R0) + MOVW R2, 4(R0) + ADD $8, R0 + /* wet floor */ + +TEXT setjmp(SB), 1, $-4 + MOV LR, 8(R0) + MOV SP, R1 + MOV R1, 0(R0) + MOV $0, R0 + RETURN + + +TEXT longjmp(SB), 1, $-4 + MOV 8(R0), LR + MOV 0(R0), R1 + MOVW arg+8(FP), R0 + MOV R1, SP + CBZ R0, _one + RETURN +_one: + MOV $1, R0 + RETURN diff --git a/sys/src/ape/lib/ap/arm64/tas.s b/sys/src/ape/lib/ap/arm64/tas.s new file mode 100644 index 000000000..feab984d9 --- /dev/null +++ b/sys/src/ape/lib/ap/arm64/tas.s @@ -0,0 +1,11 @@ +TEXT tas(SB), 1, $-4 + MOVW $1, R2 +_tas1: + LDXRW (R0), R1 + STXRW R2, (R0), R3 + CBNZ R3, _tas1 + MOVW R1, R0 + +TEXT _barrier(SB), 1, $-4 + DMB $0xB // ISH + RETURN |