On 6/27/19 2:18 PM, Hesham Almatary wrote: > @@ -392,19 +392,27 @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, > int size, > int prot; > bool pmp_violation = false; > int ret = TRANSLATE_FAIL; > + int mode = mmu_idx; > > qemu_log_mask(CPU_LOG_MMU, "%s ad %" VADDR_PRIx " rw %d mmu_idx %d\n", > __func__, address, access_type, mmu_idx); > > ret = get_physical_address(env, &pa, &prot, address, access_type, > mmu_idx); > > + if (mode == PRV_M && access_type != MMU_INST_FETCH) { > + if (get_field(env->mstatus, MSTATUS_MPRV)) { > + mode = get_field(env->mstatus, MSTATUS_MPP); > + } > + }
This hunk looks like it belongs in riscv_cpu_mmu_index instead. Passing the (corrected) mmu_idx on to pmp_hart_has_privs looks right. r~