|
@@ -927,13 +927,20 @@ restart:
|
|
|
|
|
|
if (riscv_cpu_sxl(env) == MXL_RV32) {
|
|
|
ppn = pte >> PTE_PPN_SHIFT;
|
|
|
- } else if (pbmte || riscv_cpu_cfg(env)->ext_svnapot) {
|
|
|
- ppn = (pte & (target_ulong)PTE_PPN_MASK) >> PTE_PPN_SHIFT;
|
|
|
} else {
|
|
|
- ppn = pte >> PTE_PPN_SHIFT;
|
|
|
- if ((pte & ~(target_ulong)PTE_PPN_MASK) >> PTE_PPN_SHIFT) {
|
|
|
+ if (pte & PTE_RESERVED) {
|
|
|
+ return TRANSLATE_FAIL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!pbmte && (pte & PTE_PBMT)) {
|
|
|
return TRANSLATE_FAIL;
|
|
|
}
|
|
|
+
|
|
|
+ if (!riscv_cpu_cfg(env)->ext_svnapot && (pte & PTE_N)) {
|
|
|
+ return TRANSLATE_FAIL;
|
|
|
+ }
|
|
|
+
|
|
|
+ ppn = (pte & (target_ulong)PTE_PPN_MASK) >> PTE_PPN_SHIFT;
|
|
|
}
|
|
|
|
|
|
if (!(pte & PTE_V)) {
|