aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2016-07-16 16:16:45 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2016-07-16 16:16:45 -0700
commit748eee73a12b9263bf80a9ca9e8a40ce57a8da6d (patch)
tree638aedcd2c294a429940958bb0dde670bd5ef12c
parent023ae43e8d7b1cdd54ebdc98beeb6dae9dd6f05a (diff)
downloadriscv-pk-748eee73a12b9263bf80a9ca9e8a40ce57a8da6d.zip
riscv-pk-748eee73a12b9263bf80a9ca9e8a40ce57a8da6d.tar.gz
riscv-pk-748eee73a12b9263bf80a9ca9e8a40ce57a8da6d.tar.bz2
Improve trap redirection code
-rw-r--r--machine/mtrap.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/machine/mtrap.c b/machine/mtrap.c
index a27908c..bf02fab 100644
--- a/machine/mtrap.c
+++ b/machine/mtrap.c
@@ -265,13 +265,12 @@ void redirect_trap(uintptr_t epc, uintptr_t mstatus)
write_csr(scause, read_csr(mcause));
write_csr(mepc, read_csr(stvec));
- uintptr_t prev_priv = EXTRACT_FIELD(mstatus, MSTATUS_MPP);
- uintptr_t prev_ie = EXTRACT_FIELD(mstatus, MSTATUS_MPIE);
- mstatus = INSERT_FIELD(mstatus, MSTATUS_SPP, prev_priv);
- mstatus = INSERT_FIELD(mstatus, MSTATUS_SPIE, prev_ie);
- mstatus = INSERT_FIELD(mstatus, MSTATUS_MPP, PRV_S);
- mstatus = INSERT_FIELD(mstatus, MSTATUS_MPIE, 0);
- write_csr(mstatus, mstatus);
+ uintptr_t new_mstatus = mstatus & ~(MSTATUS_SPP | MSTATUS_SPIE | MSTATUS_MPIE);
+ uintptr_t mpp_s = MSTATUS_MPP & (MSTATUS_MPP >> 1);
+ new_mstatus |= (mstatus / (MSTATUS_MPIE / MSTATUS_SPIE)) & MSTATUS_SPIE;
+ new_mstatus |= (mstatus / (mpp_s / MSTATUS_SPP)) & MSTATUS_SPP;
+ new_mstatus |= mpp_s;
+ write_csr(mstatus, new_mstatus);
extern void __redirect_trap();
return __redirect_trap();