@@ -160,6 +160,13 @@ function sys_enable_supervisor() -> bool = true
160
160
function clause extensionEnabled(Ext_U) = misa[U] == 0b1
161
161
function clause extensionEnabled(Ext_S) = misa[S] == 0b1
162
162
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
+
163
170
/*
164
171
* Illegal values legalized to least privileged mode supported.
165
172
* Note: the only valid combinations of supported modes are M, M+U, M+S+U.
@@ -898,13 +905,26 @@ function legalize_satp(
898
905
written_value : xlenbits,
899
906
) -> xlenbits = {
900
907
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
+ }
903
917
} else if xlen == 64 then {
904
918
let s = Mk_Satp64(written_value);
905
919
match satpMode_of_bits(arch, s[Mode]) {
906
920
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
+ }
908
928
}
909
929
} else {
910
930
internal_error(__FILE__, __LINE__, "Unsupported xlen" ^ dec_str(xlen))
0 commit comments