mirror of https://github.com/xemu-project/xemu.git
target/arm: Enforce word alignment for LDRD/STRD
Buglink: https://bugs.launchpad.net/qemu/+bug/1905356 Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20210419202257.161730-16-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
abe66294e1
commit
4d753eb5fb
|
@ -6520,13 +6520,13 @@ static bool trans_LDRD_rr(DisasContext *s, arg_ldst_rr *a)
|
|||
addr = op_addr_rr_pre(s, a);
|
||||
|
||||
tmp = tcg_temp_new_i32();
|
||||
gen_aa32_ld_i32(s, tmp, addr, mem_idx, MO_UL);
|
||||
gen_aa32_ld_i32(s, tmp, addr, mem_idx, MO_UL | MO_ALIGN);
|
||||
store_reg(s, a->rt, tmp);
|
||||
|
||||
tcg_gen_addi_i32(addr, addr, 4);
|
||||
|
||||
tmp = tcg_temp_new_i32();
|
||||
gen_aa32_ld_i32(s, tmp, addr, mem_idx, MO_UL);
|
||||
gen_aa32_ld_i32(s, tmp, addr, mem_idx, MO_UL | MO_ALIGN);
|
||||
store_reg(s, a->rt + 1, tmp);
|
||||
|
||||
/* LDRD w/ base writeback is undefined if the registers overlap. */
|
||||
|
@ -6549,13 +6549,13 @@ static bool trans_STRD_rr(DisasContext *s, arg_ldst_rr *a)
|
|||
addr = op_addr_rr_pre(s, a);
|
||||
|
||||
tmp = load_reg(s, a->rt);
|
||||
gen_aa32_st_i32(s, tmp, addr, mem_idx, MO_UL);
|
||||
gen_aa32_st_i32(s, tmp, addr, mem_idx, MO_UL | MO_ALIGN);
|
||||
tcg_temp_free_i32(tmp);
|
||||
|
||||
tcg_gen_addi_i32(addr, addr, 4);
|
||||
|
||||
tmp = load_reg(s, a->rt + 1);
|
||||
gen_aa32_st_i32(s, tmp, addr, mem_idx, MO_UL);
|
||||
gen_aa32_st_i32(s, tmp, addr, mem_idx, MO_UL | MO_ALIGN);
|
||||
tcg_temp_free_i32(tmp);
|
||||
|
||||
op_addr_rr_post(s, a, addr, -4);
|
||||
|
@ -6665,13 +6665,13 @@ static bool op_ldrd_ri(DisasContext *s, arg_ldst_ri *a, int rt2)
|
|||
addr = op_addr_ri_pre(s, a);
|
||||
|
||||
tmp = tcg_temp_new_i32();
|
||||
gen_aa32_ld_i32(s, tmp, addr, mem_idx, MO_UL);
|
||||
gen_aa32_ld_i32(s, tmp, addr, mem_idx, MO_UL | MO_ALIGN);
|
||||
store_reg(s, a->rt, tmp);
|
||||
|
||||
tcg_gen_addi_i32(addr, addr, 4);
|
||||
|
||||
tmp = tcg_temp_new_i32();
|
||||
gen_aa32_ld_i32(s, tmp, addr, mem_idx, MO_UL);
|
||||
gen_aa32_ld_i32(s, tmp, addr, mem_idx, MO_UL | MO_ALIGN);
|
||||
store_reg(s, rt2, tmp);
|
||||
|
||||
/* LDRD w/ base writeback is undefined if the registers overlap. */
|
||||
|
@ -6704,13 +6704,13 @@ static bool op_strd_ri(DisasContext *s, arg_ldst_ri *a, int rt2)
|
|||
addr = op_addr_ri_pre(s, a);
|
||||
|
||||
tmp = load_reg(s, a->rt);
|
||||
gen_aa32_st_i32(s, tmp, addr, mem_idx, MO_UL);
|
||||
gen_aa32_st_i32(s, tmp, addr, mem_idx, MO_UL | MO_ALIGN);
|
||||
tcg_temp_free_i32(tmp);
|
||||
|
||||
tcg_gen_addi_i32(addr, addr, 4);
|
||||
|
||||
tmp = load_reg(s, rt2);
|
||||
gen_aa32_st_i32(s, tmp, addr, mem_idx, MO_UL);
|
||||
gen_aa32_st_i32(s, tmp, addr, mem_idx, MO_UL | MO_ALIGN);
|
||||
tcg_temp_free_i32(tmp);
|
||||
|
||||
op_addr_ri_post(s, a, addr, -4);
|
||||
|
|
Loading…
Reference in New Issue