From 1781d5cfa64c83abc4e38f8268c51c465a8205e4 Mon Sep 17 00:00:00 2001 From: Artyom Tarasenko Date: Fri, 23 Feb 2018 14:06:30 -0500 Subject: [PATCH] target-sparc: fix register corruption in ldstub if there is no write permission Backports commit 9566ceeef41ccb5241d340b34776a33450e8f9e5 from qemu --- qemu/target-sparc/translate.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/qemu/target-sparc/translate.c b/qemu/target-sparc/translate.c index e9999cfe..32057c0c 100644 --- a/qemu/target-sparc/translate.c +++ b/qemu/target-sparc/translate.c @@ -4805,12 +4805,15 @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn, bool hook_ins case 0xd: /* ldstub -- XXX: should be atomically */ { TCGv r_const; + TCGv tmp = tcg_temp_new(tcg_ctx); gen_address_mask(dc, cpu_addr); - tcg_gen_qemu_ld8u(dc->uc, cpu_val, cpu_addr, dc->mem_idx); + tcg_gen_qemu_ld8u(dc->uc, tmp, cpu_addr, dc->mem_idx); r_const = tcg_const_tl(tcg_ctx, 0xff); tcg_gen_qemu_st8(dc->uc, r_const, cpu_addr, dc->mem_idx); + tcg_gen_mov_tl(tcg_ctx, cpu_val, tmp); tcg_temp_free(tcg_ctx, r_const); + tcg_temp_free(tcg_ctx, tmp); } break; case 0x0f: