diff options
| -rw-r--r-- | sys/src/9/bcm64/l.s | 13 | ||||
| -rw-r--r-- | sys/src/9/bcm64/mkfile | 1 | ||||
| -rw-r--r-- | sys/src/9/bcm64/pi3 | 4 | ||||
| -rw-r--r-- | sys/src/9/bcm64/trap.c | 22 | ||||
| -rw-r--r-- | sys/src/9/port/devdtracy.c | 8 |
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) |
