From f074954d3d248302fc6cfa2ea64ed62d7b0f6c9e Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Wed, 10 Apr 2019 12:38:42 +0200 Subject: [PATCH] hw: use `eret` in `hyp` mode to switch mode Instead of using `cps` instruction, use an exception return instruction to switch from `hyp` mode to `svc` mode. Otherwise it causes unpredicted behaviour on ARM. Fix #3284 --- .../core/spec/arm_v7/virtualization/exception_vector.s | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/repos/base-hw/src/core/spec/arm_v7/virtualization/exception_vector.s b/repos/base-hw/src/core/spec/arm_v7/virtualization/exception_vector.s index fe7b8fede0..30bccc7306 100644 --- a/repos/base-hw/src/core/spec/arm_v7/virtualization/exception_vector.s +++ b/repos/base-hw/src/core/spec/arm_v7/virtualization/exception_vector.s @@ -157,7 +157,14 @@ _vm_to_host: mcr p15, 0, r9, c2, c0, 2 /* write TTBRC */ mcr p15, 0, r10, c10, c2, 0 /* write MAIR0 */ mcr p15, 0, r11, c3, c0, 0 /* write DACR */ - cps #SVC_MODE + mov r10, #7 + lsl r10, #6 + add r10, r10, #SVC_MODE + msr spsr_cxsf, r10 + adr r10, _svc_mode_ret + msr ELR_hyp, r10 + eret +_svc_mode_ret: stmia r0, {r13-r14}^ /* save user regs sp,lr */ add r0, r0, #2*4 stmia r0!, {r1-r2} /* save ip, cpsr */