RISC-V: Handle bus errors in the page table walker
We directly access physical memory while walking the page tables on RISC-V, but while doing so we were using cpu_ld*() which does not report bus errors. This patch converts the page table walker over to use address_space_ld*(), which allows bus errors to be detected. Signed-off-by: Palmer Dabbelt <palmer@sifive.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Signed-off-by: Palmer Dabbelt <palmer@sifive.com>
This commit is contained in:
parent
e6e03dcffd
commit
aacb578fad
@ -169,7 +169,8 @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,
|
||||
/* NOTE: the env->pc value visible here will not be
|
||||
* correct, but the value visible to the exception handler
|
||||
* (riscv_cpu_do_interrupt) is correct */
|
||||
|
||||
MemTxResult res;
|
||||
MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
|
||||
int mode = mmu_idx;
|
||||
|
||||
if (mode == PRV_M && access_type != MMU_INST_FETCH) {
|
||||
@ -256,11 +257,16 @@ restart:
|
||||
1 << MMU_DATA_LOAD, PRV_S)) {
|
||||
return TRANSLATE_PMP_FAIL;
|
||||
}
|
||||
|
||||
#if defined(TARGET_RISCV32)
|
||||
target_ulong pte = ldl_phys(cs->as, pte_addr);
|
||||
target_ulong pte = address_space_ldl(cs->as, pte_addr, attrs, &res);
|
||||
#elif defined(TARGET_RISCV64)
|
||||
target_ulong pte = ldq_phys(cs->as, pte_addr);
|
||||
target_ulong pte = address_space_ldq(cs->as, pte_addr, attrs, &res);
|
||||
#endif
|
||||
if (res != MEMTX_OK) {
|
||||
return TRANSLATE_FAIL;
|
||||
}
|
||||
|
||||
hwaddr ppn = pte >> PTE_PPN_SHIFT;
|
||||
|
||||
if (!(pte & PTE_V)) {
|
||||
|
Loading…
Reference in New Issue
Block a user