Message ID | 20230325105429.1142530-10-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | target/riscv: MSTATUS_SUM + cleanups | expand |
On Sat, Mar 25, 2023 at 9:53 PM Richard Henderson <richard.henderson@linaro.org> wrote: > > 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> Alistair > --- > target/riscv/op_helper.c | 13 +++++++++++-- > 1 file changed, 11 insertions(+), 2 deletions(-) > > diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c > index 962a061228..b2169a99ff 100644 > --- a/target/riscv/op_helper.c > +++ b/target/riscv/op_helper.c > @@ -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 */ > -- > 2.34.1 > >
diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c index 962a061228..b2169a99ff 100644 --- a/target/riscv/op_helper.c +++ b/target/riscv/op_helper.c @@ -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 */
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> --- target/riscv/op_helper.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)