target/xtensa: fix s32c1i TCGMemOp flags
authorMax Filippov <jcmvbkbc@gmail.com>
Tue, 11 Sep 2018 01:23:35 +0000 (18:23 -0700)
committerMax Filippov <jcmvbkbc@gmail.com>
Mon, 17 Sep 2018 18:09:04 +0000 (11:09 -0700)
s32c1i must load and store value with target endianness, not host.
This results in an infinite loop in atomic cmpxchg sequences when target
endianness doesn't match host endianness.

Fixes: 9fb40342d4b3 ("target/xtensa: support MTTCG")
Cc: qemu-stable@nongnu.org
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
target/xtensa/translate.c

index 25399058a0db115176614cd15a2a08268edec50d..c626583cd952aebaecdd8da6e11172266e463578 100644 (file)
@@ -2288,7 +2288,7 @@ static void translate_s32c1i(DisasContext *dc, const uint32_t arg[],
         gen_load_store_alignment(dc, 2, addr, true);
         gen_check_atomctl(dc, addr);
         tcg_gen_atomic_cmpxchg_i32(cpu_R[arg[0]], addr, cpu_SR[SCOMPARE1],
-                                   tmp, dc->cring, MO_32);
+                                   tmp, dc->cring, MO_TEUL);
         tcg_temp_free(addr);
         tcg_temp_free(tmp);
     }