From f42e53655e9a2a1b516326f6522fba88db59a81c Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Fri, 14 Jun 2019 10:28:30 +0200 Subject: [PATCH] bcm64: implement dtracy support --- sys/src/9/bcm64/l.s | 13 +++++++++++++ sys/src/9/bcm64/mkfile | 1 + sys/src/9/bcm64/pi3 | 4 ++++ sys/src/9/bcm64/trap.c | 22 ++++++++++++++++------ 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; }