diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2016-04-19 17:31:54 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2016-04-19 17:31:54 -0700 |
commit | 27e29e69cc586a7d97e2ccae2447faa79b66f7b8 (patch) | |
tree | 00bd9b404c72df0e22fd4a246a796b07e918d65a /riscv/insns/sret.h | |
parent | 7a2a57b8bcfe49386cf98dc435d3179e881abc62 (diff) | |
download | spike-27e29e69cc586a7d97e2ccae2447faa79b66f7b8.zip spike-27e29e69cc586a7d97e2ccae2447faa79b66f7b8.tar.gz spike-27e29e69cc586a7d97e2ccae2447faa79b66f7b8.tar.bz2 |
Split ERET into URET, SRET, HRET, MRET
Diffstat (limited to 'riscv/insns/sret.h')
-rw-r--r-- | riscv/insns/sret.h | 19 |
1 files changed, 6 insertions, 13 deletions
diff --git a/riscv/insns/sret.h b/riscv/insns/sret.h index f317d14..f5e89e4 100644 --- a/riscv/insns/sret.h +++ b/riscv/insns/sret.h @@ -1,16 +1,9 @@ require_privilege(PRV_S); -switch (STATE.prv) -{ - case PRV_S: set_pc_and_serialize(p->get_state()->sepc); break; - case PRV_M: set_pc_and_serialize(p->get_state()->mepc); break; - default: abort(); -} - +set_pc_and_serialize(p->get_state()->sepc); reg_t s = STATE.mstatus; -reg_t pie = get_field(s, MSTATUS_UPIE << STATE.prv); -reg_t prev_prv = get_field(s, STATE.prv == PRV_S ? MSTATUS_SPP : MSTATUS_MPP); -s = set_field(s, MSTATUS_UIE << prev_prv, pie); // [[prv]PP]IE = [prv]PIE -s = set_field(s, MSTATUS_UPIE << STATE.prv, 0); // [prv]PIE <- 0 -s = set_field(s, STATE.prv == PRV_S ? MSTATUS_SPP : MSTATUS_MPP, PRV_U); // [prv]PP = U -p->set_privilege(prev_prv); // prv <- [prv]PP +reg_t prev_prv = get_field(s, MSTATUS_SPP); +s = set_field(s, MSTATUS_UIE << prev_prv, get_field(s, MSTATUS_SPIE)); +s = set_field(s, MSTATUS_SPIE, 0); +s = set_field(s, MSTATUS_SPP, PRV_U); +p->set_privilege(prev_prv); p->set_csr(CSR_MSTATUS, s); |