summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2019-06-14 10:28:30 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2019-06-14 10:28:30 +0200
commitf42e53655e9a2a1b516326f6522fba88db59a81c (patch)
tree60e7572eff9e27118cac9eb72d1bc5f40019c6e7
parent78c7cd0c010c1c90dbc3358c2710bddaed379ce9 (diff)
bcm64: implement dtracy support
-rw-r--r--sys/src/9/bcm64/l.s13
-rw-r--r--sys/src/9/bcm64/mkfile1
-rw-r--r--sys/src/9/bcm64/pi34
-rw-r--r--sys/src/9/bcm64/trap.c22
4 files changed, 34 insertions, 6 deletions
diff --git a/sys/src/9/bcm64/l.s b/sys/src/9/bcm64/l.s
index 9690bffa6..9a776a4b9 100644
--- a/sys/src/9/bcm64/l.s
+++ b/sys/src/9/bcm64/l.s
@@ -658,3 +658,16 @@ TEXT vserr(SB), 1, $-4
ORR $(3<<32), R0 // type
_vserrpatch:
B _vserrpatch // branch to vtrapX() patched in
+
+/* fault-proof memcpy */
+TEXT peek(SB), 1, $-4
+ MOV R0, R1
+ MOV dst+8(FP), R2
+ MOVWU len+16(FP), R0
+TEXT _peekinst(SB), 1, $-4
+_peekloop:
+ MOVBU (R1)1!, R3
+ MOVBU R3, (R2)1!
+ SUBS $1, R0
+ BNE _peekloop
+ RETURN
diff --git a/sys/src/9/bcm64/mkfile b/sys/src/9/bcm64/mkfile
index 757024058..151c7e898 100644
--- a/sys/src/9/bcm64/mkfile
+++ b/sys/src/9/bcm64/mkfile
@@ -65,6 +65,7 @@ LIB=\
/$objtype/lib/libsec.a\
/$objtype/lib/libmp.a\
/$objtype/lib/libc.a\
+ /$objtype/lib/libdtracy.a\
9:V: $p$CONF s$p$CONF
diff --git a/sys/src/9/bcm64/pi3 b/sys/src/9/bcm64/pi3
index 059f88073..f37ab5e35 100644
--- a/sys/src/9/bcm64/pi3
+++ b/sys/src/9/bcm64/pi3
@@ -21,6 +21,7 @@ dev
# gpio gpio
sd
usb
+ dtracy
link
loopbackmedium
@@ -43,6 +44,9 @@ misc
dma
vcore
+ dtracysys
+ dtracytimer
+
port
int cpuserver = 0;
diff --git a/sys/src/9/bcm64/trap.c b/sys/src/9/bcm64/trap.c
index 936a3de11..61b53b155 100644
--- a/sys/src/9/bcm64/trap.c
+++ b/sys/src/9/bcm64/trap.c
@@ -442,13 +442,22 @@ faultarm64(Ureg *ureg)
insyscall = up->insyscall;
up->insyscall = 1;
- if(!userureg(ureg) && waserror()){
- if(up->nerrlab == 0){
- pprint("suicide: sys: %s\n", up->errstr);
- pexit(up->errstr, 1);
+ if(!userureg(ureg)){
+ extern void _peekinst(void);
+
+ if(ureg->pc == (uintptr)_peekinst){
+ ureg->pc = ureg->link;
+ goto out;
+ }
+
+ if(waserror()){
+ if(up->nerrlab == 0){
+ pprint("suicide: sys: %s\n", up->errstr);
+ pexit(up->errstr, 1);
+ }
+ up->insyscall = insyscall;
+ nexterror();
}
- up->insyscall = insyscall;
- nexterror();
}
addr = getfar();
@@ -486,6 +495,7 @@ faultarm64(Ureg *ureg)
if(!userureg(ureg))
poperror();
+out:
up->insyscall = insyscall;
}