Skip to content

Commit bc8ff5f

Browse files
committed
add satp mode guard
1 parent fbd69b4 commit bc8ff5f

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

model/riscv_extensions.sail

+6-1
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,11 @@ enum clause extension = Ext_Svinval
113113
enum clause extension = Ext_Svnapot
114114
// Page-Based Memory Types
115115
enum clause extension = Ext_Svpbmt
116-
116+
// Supervisor-Level Address Translation Modes
117+
enum clause extension = Ext_Svbare
118+
enum clause extension = Ext_Sv32
119+
enum clause extension = Ext_Sv39
120+
enum clause extension = Ext_Sv48
121+
enum clause extension = Ext_Sv57
117122
// Cycle and Instret Privilege Mode Filtering
118123
enum clause extension = Ext_Smcntrpmf

model/riscv_sys_regs.sail

+23-3
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,13 @@ function sys_enable_supervisor() -> bool = true
160160
function clause extensionEnabled(Ext_U) = misa[U] == 0b1
161161
function clause extensionEnabled(Ext_S) = misa[S] == 0b1
162162

163+
// TODO: Make configurable
164+
function clause extensionEnabled(Ext_Svbare) = extensionEnabled(Ext_S)
165+
function clause extensionEnabled(Ext_Sv32) = extensionEnabled(Ext_S) & (xlen == 32)
166+
function clause extensionEnabled(Ext_Sv39) = extensionEnabled(Ext_S) & (xlen == 64)
167+
function clause extensionEnabled(Ext_Sv48) = extensionEnabled(Ext_S) & (xlen == 64)
168+
function clause extensionEnabled(Ext_Sv57) = extensionEnabled(Ext_S) & (xlen == 64)
169+
163170
/*
164171
* Illegal values legalized to least privileged mode supported.
165172
* Note: the only valid combinations of supported modes are M, M+U, M+S+U.
@@ -898,13 +905,26 @@ function legalize_satp(
898905
written_value : xlenbits,
899906
) -> xlenbits = {
900907
if xlen == 32 then {
901-
/* all 32-bit satp modes are valid */
902-
written_value
908+
let s = Mk_Satp32(written_value);
909+
match satpMode_of_bits(arch, 0b000 @ s[Mode]) {
910+
None() => prev_value,
911+
Some(Sv_mode) => match Sv_mode {
912+
Bare => if extensionEnabled(Ext_Svbare) then s.bits else prev_value,
913+
Sv32 => if extensionEnabled(Ext_Sv32) then s.bits else prev_value,
914+
_ => prev_value,
915+
}
916+
}
903917
} else if xlen == 64 then {
904918
let s = Mk_Satp64(written_value);
905919
match satpMode_of_bits(arch, s[Mode]) {
906920
None() => prev_value,
907-
Some(_) => s.bits
921+
Some(Sv_mode) => match Sv_mode {
922+
Bare => if extensionEnabled(Ext_Svbare) then s.bits else prev_value,
923+
Sv39 => if extensionEnabled(Ext_Sv39) then s.bits else prev_value,
924+
Sv48 => if extensionEnabled(Ext_Sv48) then s.bits else prev_value,
925+
Sv57 => if extensionEnabled(Ext_Sv57) then s.bits else prev_value,
926+
_ => prev_value,
927+
}
908928
}
909929
} else {
910930
internal_error(__FILE__, __LINE__, "Unsupported xlen" ^ dec_str(xlen))

0 commit comments

Comments
 (0)