@@ -160,6 +160,12 @@ 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
+ // now remain for true
164
+ function clause extensionEnabled(Ext_Sv32) = extensionEnabled(Ext_S) & (xlen == 32)
165
+ function clause extensionEnabled(Ext_Sv39) = extensionEnabled(Ext_S) & (xlen == 64)
166
+ function clause extensionEnabled(Ext_Sv48) = extensionEnabled(Ext_S) & (xlen == 64)
167
+ function clause extensionEnabled(Ext_Sv57) = extensionEnabled(Ext_S) & (xlen == 64)
168
+
163
169
/*
164
170
* Illegal values legalized to least privileged mode supported.
165
171
* Note: the only valid combinations of supported modes are M, M+U, M+S+U.
@@ -898,13 +904,21 @@ function legalize_satp(
898
904
written_value : xlenbits,
899
905
) -> xlenbits = {
900
906
if xlen == 32 then {
901
- /* all 32-bit satp modes are valid */
902
- written_value
907
+ let s = Mk_Satp32(written_value);
908
+ match satpMode_of_bits(arch, 0b000 @ s[Mode]) {
909
+ None() => prev_value,
910
+ Some(_) => if extensionEnabled(Ext_Sv32) then s.bits else prev_value
911
+ }
903
912
} else if xlen == 64 then {
904
913
let s = Mk_Satp64(written_value);
905
914
match satpMode_of_bits(arch, s[Mode]) {
906
915
None() => prev_value,
907
- Some(_) => s.bits
916
+ Some(Sv_mode) => match Sv_mode {
917
+ Sv39 => if extensionEnabled(Ext_Sv39) then s.bits else prev_value,
918
+ Sv48 => if extensionEnabled(Ext_Sv48) then s.bits else prev_value,
919
+ Sv57 => if extensionEnabled(Ext_Sv57) then s.bits else prev_value,
920
+ _ => prev_value
921
+ }
908
922
}
909
923
} else {
910
924
internal_error(__FILE__, __LINE__, "Unsupported xlen" ^ dec_str(xlen))
0 commit comments