target/riscv: Use cpu_ld*_code_mmu for HLVX
Use the new functions to properly check execute permission for the read rather than read permission. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn> Tested-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Message-Id: <20230325105429.1142530-10-richard.henderson@linaro.org> Message-Id: <20230412114333.118895-10-richard.henderson@linaro.org> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
c8f8a9957e
commit
a7f112c5fd
@ -427,18 +427,27 @@ void helper_hyp_gvma_tlb_flush(CPURISCVState *env)
|
||||
helper_hyp_tlb_flush(env);
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO: These implementations are not quite correct. They perform the
|
||||
* access using execute permission just fine, but the final PMP check
|
||||
* is supposed to have read permission as well. Without replicating
|
||||
* a fair fraction of cputlb.c, fixing this requires adding new mmu_idx
|
||||
* which would imply that exact check in tlb_fill.
|
||||
*/
|
||||
target_ulong helper_hyp_hlvx_hu(CPURISCVState *env, target_ulong address)
|
||||
{
|
||||
int mmu_idx = cpu_mmu_index(env, true) | MMU_HYP_ACCESS_BIT;
|
||||
MemOpIdx oi = make_memop_idx(MO_TEUW, mmu_idx);
|
||||
|
||||
return cpu_lduw_mmuidx_ra(env, address, mmu_idx, GETPC());
|
||||
return cpu_ldw_code_mmu(env, address, oi, GETPC());
|
||||
}
|
||||
|
||||
target_ulong helper_hyp_hlvx_wu(CPURISCVState *env, target_ulong address)
|
||||
{
|
||||
int mmu_idx = cpu_mmu_index(env, true) | MMU_HYP_ACCESS_BIT;
|
||||
MemOpIdx oi = make_memop_idx(MO_TEUL, mmu_idx);
|
||||
|
||||
return cpu_ldl_mmuidx_ra(env, address, mmu_idx, GETPC());
|
||||
return cpu_ldl_code_mmu(env, address, oi, GETPC());
|
||||
}
|
||||
|
||||
#endif /* !CONFIG_USER_ONLY */
|
||||
|
Loading…
Reference in New Issue
Block a user