summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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
-rw-r--r--sys/src/9/port/devdtracy.c8
5 files changed, 38 insertions, 10 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;
}
diff --git a/sys/src/9/port/devdtracy.c b/sys/src/9/port/devdtracy.c
index 19a321cc5..96aeaf649 100644
--- a/sys/src/9/port/devdtracy.c
+++ b/sys/src/9/port/devdtracy.c
@@ -7,7 +7,7 @@
#include <dtracy.h>
-Lock *machlocks;
+static Lock *machlocks;
typedef struct DTKChan DTKChan;
typedef struct DTKAux DTKAux;
@@ -76,8 +76,8 @@ static Cmdtab dtracyctlmsg[] = {
CMgo, "go", 1,
};
-DTKChan **dtktab;
-int ndtktab;
+static DTKChan **dtktab;
+static int ndtktab;
static DTKChan *
dtklook(vlong n)
@@ -555,7 +555,7 @@ dtgetvar(int v)
}
}
-int peek(char *, char *, int);
+extern int peek(char *, char *, int);
int
dtpeek(uvlong addr, void *buf, int len)