From d9b4071ea4a9a2fe84a51443250184f51e931ac2 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Thu, 9 Nov 2017 19:25:22 -0800 Subject: [PATCH] Make rv64mi-p-ecall work when U-mode is not present --- isa/rv64si/scall.S | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/isa/rv64si/scall.S b/isa/rv64si/scall.S index cb97635..1f5e6b7 100644 --- a/isa/rv64si/scall.S +++ b/isa/rv64si/scall.S @@ -26,6 +26,23 @@ RVTEST_CODE_BEGIN li TESTNUM, 2 + # This is the expected trap code. + li t1, CAUSE_USER_ECALL + +#ifdef __MACHINE_MODE + # If running in M mode, use mstatus.MPP to check existence of U mode. + # Otherwise, if in S mode, then U mode must exist and we don't need to check. + li t0, MSTATUS_MPP + csrc mstatus, t0 + csrr t1, mstatus + and t0, t0, t1 + beqz t0, 1f + + # If U mode doesn't exist, mcause should indicate ECALL from M mode. + li t1, CAUSE_MACHINE_ECALL +#endif + +1: li t0, SSTATUS_SPP csrc sstatus, t0 la t0, 1f @@ -42,7 +59,6 @@ RVTEST_CODE_BEGIN .align 2 .global stvec_handler stvec_handler: - li t1, CAUSE_USER_ECALL csrr t0, scause bne t0, t1, fail j pass -- 2.30.2