diff options
Diffstat (limited to 'riscv/riscv_sys.sail')
| -rw-r--r-- | riscv/riscv_sys.sail | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/riscv/riscv_sys.sail b/riscv/riscv_sys.sail index f334003b..42240e6b 100644 --- a/riscv/riscv_sys.sail +++ b/riscv/riscv_sys.sail @@ -161,7 +161,7 @@ bitfield Mtvec : bits(64) = { } register mtvec : Mtvec /* Trap Vector */ -function legalize_mtvec(o : Mtvec, v : xlenbits) -> Mtvec = { +function legalize_tvec(o : Mtvec, v : xlenbits) -> Mtvec = { let v = Mk_Mtvec(v); match (trapVectorMode_of_bits(v.Mode())) { TV_Direct => v, @@ -225,6 +225,40 @@ bitfield Sstatus : bits(64) = { UIE : 0 } /* This is a view, so there is no register defined. */ +function lower_mstatus(m : Mstatus) -> Sstatus = { + let s = Mk_Sstatus(EXTZ(0b0)); + let s = update_SD(s, m.SD()); + let s = update_UXL(s, m.UXL()); + let s = update_MXR(s, m.MXR()); + let s = update_SUM(s, m.SUM()); + let s = update_XS(s, m.XS()); + let s = update_FS(s, m.FS()); + let s = update_SPP(s, m.SPP()); + let s = update_SPIE(s, m.SPIE()); + let s = update_UPIE(s, m.UPIE()); + let s = update_SIE(s, m.SIE()); + let s = update_UIE(s, m.UIE()); + s +} + +function lift_sstatus(m : Mstatus, s : Sstatus) -> Mstatus = { + let m = update_SD(m, s.SD()); + let m = update_UXL(m, s.UXL()); + let m = update_MXR(m, s.MXR()); + let m = update_SUM(m, s.SUM()); + let m = update_XS(m, s.XS()); + let m = update_FS(m, s.FS()); + let m = update_SPP(m, s.SPP()); + let m = update_SPIE(m, s.SPIE()); + let m = update_UPIE(m, s.UPIE()); + let m = update_SIE(m, s.SIE()); + let m = update_UIE(m, s.UIE()); + m +} + +function legalize_sstatus(m : Mstatus, v : xlenbits) -> Mstatus = { + lift_sstatus(m, Mk_Sstatus(v)) +} bitfield Sedeleg : bits(64) = { UEnvCall : 8, @@ -239,6 +273,10 @@ bitfield Sedeleg : bits(64) = { } register sedeleg : Sedeleg +function legalize_sedeleg(s : Sedeleg, v : xlenbits) -> Sedeleg = { + Mk_Sedeleg(EXTZ(v[8..0])) +} + /* TODO: handle views for interrupt delegation */ register sideleg : Minterrupts register sip : Minterrupts |
