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:
Palmer Dabbelt 2019-10-08 13:51:50 -07:00
parent e6e03dcffd
commit aacb578fad
No known key found for this signature in database
GPG Key ID: EF4CA1502CCBAB41

View File

@ -169,7 +169,8 @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,
/* NOTE: the env->pc value visible here will not be /* NOTE: the env->pc value visible here will not be
* correct, but the value visible to the exception handler * correct, but the value visible to the exception handler
* (riscv_cpu_do_interrupt) is correct */ * (riscv_cpu_do_interrupt) is correct */
MemTxResult res;
MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
int mode = mmu_idx; int mode = mmu_idx;
if (mode == PRV_M && access_type != MMU_INST_FETCH) { if (mode == PRV_M && access_type != MMU_INST_FETCH) {
@ -256,11 +257,16 @@ restart:
1 << MMU_DATA_LOAD, PRV_S)) { 1 << MMU_DATA_LOAD, PRV_S)) {
return TRANSLATE_PMP_FAIL; return TRANSLATE_PMP_FAIL;
} }
#if defined(TARGET_RISCV32) #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) #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 #endif
if (res != MEMTX_OK) {
return TRANSLATE_FAIL;
}
hwaddr ppn = pte >> PTE_PPN_SHIFT; hwaddr ppn = pte >> PTE_PPN_SHIFT;
if (!(pte & PTE_V)) { if (!(pte & PTE_V)) {