On Wed, 18 Aug 2021 at 21:15, Richard Henderson <[email protected]> wrote: > > Signed-off-by: Richard Henderson <[email protected]> > --- > tcg/tci.c | 18 +++++++++++++----- > 1 file changed, 13 insertions(+), 5 deletions(-) > > diff --git a/tcg/tci.c b/tcg/tci.c > index e76087ccac..985c8a91cb 100644 > --- a/tcg/tci.c > +++ b/tcg/tci.c > @@ -296,7 +296,7 @@ static uint64_t tci_qemu_ld(CPUArchState *env, > target_ulong taddr, > uintptr_t ra = (uintptr_t)tb_ptr; > > #ifdef CONFIG_SOFTMMU > - switch (mop) { > + switch (mop & (MO_BSWAP | MO_SSIZE)) { > case MO_UB: > return helper_ret_ldub_mmu(env, taddr, oi, ra); > case MO_SB: > @@ -326,10 +326,14 @@ static uint64_t tci_qemu_ld(CPUArchState *env, > target_ulong taddr, > } > #else > void *haddr = g2h(env_cpu(env), taddr); > + unsigned a_mask = (1u << get_alignment_bits(mop)) - 1; > uint64_t ret; > > set_helper_retaddr(ra); > - switch (mop) { > + if (taddr & a_mask) { > + helper_unaligned_ld(env, taddr); > + } > + switch (mop & (MO_BSWAP | MO_SSIZE)) { > case MO_UB: > ret = ldub_p(haddr); > break; > @@ -377,11 +381,11 @@ static uint64_t tci_qemu_ld(CPUArchState *env, > target_ulong taddr, > static void tci_qemu_st(CPUArchState *env, target_ulong taddr, uint64_t val, > MemOpIdx oi, const void *tb_ptr) > { > - MemOp mop = get_memop(oi) & (MO_BSWAP | MO_SSIZE); > + MemOp mop = get_memop(oi); > uintptr_t ra = (uintptr_t)tb_ptr;
Don't you need this bit in tci_qemu_st() as well ? -- PMM
