Create a new function to encapsulate the privilege/hypervisor checks performed inside helper_tlb_flush(). The idea is to pass GETPC() as an argument directly to it inside the helper_tlb_flush() function.
Signed-off-by: Trevor Gamblin <[email protected]> --- target/riscv/tcg/op_helper.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/target/riscv/tcg/op_helper.c b/target/riscv/tcg/op_helper.c index 3e94005d2b..8039df2b48 100644 --- a/target/riscv/tcg/op_helper.c +++ b/target/riscv/tcg/op_helper.c @@ -588,18 +588,25 @@ void helper_wrs_nto(CPURISCVState *env) } } -void helper_tlb_flush(CPURISCVState *env) +static bool sfence_vma_allowed(CPURISCVState *env, uintptr_t ra) { - CPUState *cs = env_cpu(env); if (!env->virt_enabled && (env->priv == PRV_U || (env->priv == PRV_S && get_field(env->mstatus, MSTATUS_TVM)))) { - riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, GETPC()); + riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, ra); + return false; } else if (env->virt_enabled && (env->priv == PRV_U || get_field(env->hstatus, HSTATUS_VTVM))) { - riscv_raise_exception(env, RISCV_EXCP_VIRT_INSTRUCTION_FAULT, GETPC()); - } else { - tlb_flush(cs); + riscv_raise_exception(env, RISCV_EXCP_VIRT_INSTRUCTION_FAULT, ra); + return false; + } + return true; +} + +void helper_tlb_flush(CPURISCVState *env) +{ + if (sfence_vma_allowed(env, GETPC())) { + tlb_flush(env_cpu(env)); } } -- 2.55.0
