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 > >
