diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2016-07-16 16:16:45 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2016-07-16 16:16:45 -0700 |
commit | 748eee73a12b9263bf80a9ca9e8a40ce57a8da6d (patch) | |
tree | 638aedcd2c294a429940958bb0dde670bd5ef12c /machine | |
parent | 023ae43e8d7b1cdd54ebdc98beeb6dae9dd6f05a (diff) | |
download | riscv-pk-748eee73a12b9263bf80a9ca9e8a40ce57a8da6d.zip riscv-pk-748eee73a12b9263bf80a9ca9e8a40ce57a8da6d.tar.gz riscv-pk-748eee73a12b9263bf80a9ca9e8a40ce57a8da6d.tar.bz2 |
Improve trap redirection code
Diffstat (limited to 'machine')
-rw-r--r-- | machine/mtrap.c | 13 |
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(); |