On Mon, May 5, 2025 at 6:59 AM Richard Henderson
<richard.hender...@linaro.org> wrote:
>
> Check 32 vs 64-bit and pointer masking state.
>
> Cc: qemu-ri...@nongnu.org
> Signed-off-by: Richard Henderson <richard.hender...@linaro.org>

Acked-by: Alistair Francis <alistair.fran...@wdc.com>

Alistair

> ---
>  target/riscv/tcg/tcg-cpu.c | 26 ++++++++++++++++++++++++++
>  1 file changed, 26 insertions(+)
>
> diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
> index 55e00972b7..267186e5e3 100644
> --- a/target/riscv/tcg/tcg-cpu.c
> +++ b/target/riscv/tcg/tcg-cpu.c
> @@ -237,6 +237,31 @@ static void riscv_restore_state_to_opc(CPUState *cs,
>      env->excp_uw2 = data[2];
>  }
>
> +#ifndef CONFIG_USER_ONLY
> +static vaddr riscv_pointer_wrap(CPUState *cs, int mmu_idx,
> +                                vaddr result, vaddr base)
> +{
> +    CPURISCVState *env = cpu_env(cs);
> +    uint32_t pm_len;
> +    bool pm_signext;
> +
> +    if (cpu_address_xl(env) == MXL_RV32) {
> +        return (uint32_t)result;
> +    }
> +
> +    pm_len = riscv_pm_get_pmlen(riscv_pm_get_pmm(env));
> +    if (pm_len == 0) {
> +        return result;
> +    }
> +
> +    pm_signext = riscv_cpu_virt_mem_enabled(env);
> +    if (pm_signext) {
> +        return sextract64(result, 0, 64 - pm_len);
> +    }
> +    return extract64(result, 0, 64 - pm_len);
> +}
> +#endif
> +
>  const TCGCPUOps riscv_tcg_ops = {
>      .mttcg_supported = true,
>      .guest_default_memory_order = 0,
> @@ -250,6 +275,7 @@ const TCGCPUOps riscv_tcg_ops = {
>
>  #ifndef CONFIG_USER_ONLY
>      .tlb_fill = riscv_cpu_tlb_fill,
> +    .pointer_wrap = riscv_pointer_wrap,
>      .cpu_exec_interrupt = riscv_cpu_exec_interrupt,
>      .cpu_exec_halt = riscv_cpu_has_work,
>      .cpu_exec_reset = cpu_reset,
> --
> 2.43.0
>
>

Reply via email to