On Thu, Oct 14, 2021 at 10:14 PM Richard Henderson <
[email protected]> wrote:

> Use the new cpu_loop_exit_sigbus for atomic_mmu_lookup, which
> has access to complete alignment info from the TCGMemOpIdx arg.
>
> Reviewed-by: Alex BennĂ©e <[email protected]>
> Signed-off-by: Richard Henderson <[email protected]>
> ---
>  accel/tcg/user-exec.c | 13 ++++++++++++-
>  1 file changed, 12 insertions(+), 1 deletion(-)
>

Reviewed-by: Warner Losh <[email protected]>



> diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c
> index 5646f8e527..92cbffd7c6 100644
> --- a/accel/tcg/user-exec.c
> +++ b/accel/tcg/user-exec.c
> @@ -476,11 +476,22 @@ static void *atomic_mmu_lookup(CPUArchState *env,
> target_ulong addr,
>                                 MemOpIdx oi, int size, int prot,
>                                 uintptr_t retaddr)
>  {
> +    MemOp mop = get_memop(oi);
> +    int a_bits = get_alignment_bits(mop);
> +    void *ret;
> +
> +    /* Enforce guest required alignment.  */
> +    if (unlikely(addr & ((1 << a_bits) - 1))) {
> +        MMUAccessType t = prot == PAGE_READ ? MMU_DATA_LOAD :
> MMU_DATA_STORE;
> +        cpu_loop_exit_sigbus(env_cpu(env), addr, t, retaddr);
> +    }
> +
>      /* Enforce qemu required alignment.  */
>      if (unlikely(addr & (size - 1))) {
>          cpu_loop_exit_atomic(env_cpu(env), retaddr);
>      }
> -    void *ret = g2h(env_cpu(env), addr);
> +
> +    ret = g2h(env_cpu(env), addr);
>      set_helper_retaddr(retaddr);
>      return ret;
>  }
> --
> 2.25.1
>
>

Reply via email to