[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] target-arm: fix LDMIA bug on page boundary
From: |
Aurelien Jarno |
Subject: |
Re: [Qemu-devel] [PATCH] target-arm: fix LDMIA bug on page boundary |
Date: |
Wed, 27 Apr 2011 20:18:19 +0200 |
User-agent: |
Mutt/1.5.20 (2009-06-14) |
On Mon, Apr 25, 2011 at 01:23:58AM +0000, YuYeon Oh wrote:
> target-arm: fix LDMIA bug on page boundary
>
> When consecutive memory locations are on page boundary, a base register may be
> loaded before page fault occurs. After page fault handling, it losts the
> memory
> location information. To solve this problem, loading a base register has to
> put back.
>
> Signed-off-by: Yuyeon Oh <address@hidden>
> ---
> target-arm/translate.c | 10 +++++++++-
> 1 files changed, 9 insertions(+), 1 deletions(-)
Thanks, applied.
> diff --git a/target-arm/translate.c b/target-arm/translate.c
> index e1bda57..410e7c4 100644
> --- a/target-arm/translate.c
> +++ b/target-arm/translate.c
> @@ -7967,7 +7967,8 @@ static int disas_thumb2_insn(CPUState *env,
> DisasContext *s, uint16_t insn_hw1)
> }
> }
> } else {
> - int i;
> + int i, loaded_base = 0;
> + TCGv loaded_var;
> /* Load/store multiple. */
> addr = load_reg(s, rn);
> offset = 0;
> @@ -7979,6 +7980,7 @@ static int disas_thumb2_insn(CPUState *env,
> DisasContext *s, uint16_t insn_hw1)
> tcg_gen_addi_i32(addr, addr, -offset);
> }
>
> + TCGV_UNUSED(loaded_var);
> for (i = 0; i < 16; i++) {
> if ((insn & (1 << i)) == 0)
> continue;
> @@ -7987,6 +7989,9 @@ static int disas_thumb2_insn(CPUState *env,
> DisasContext *s, uint16_t insn_hw1)
> tmp = gen_ld32(addr, IS_USER(s));
> if (i == 15) {
> gen_bx(s, tmp);
> + } else if (i == rn) {
> + loaded_var = tmp;
> + loaded_base = 1;
> } else {
> store_reg(s, i, tmp);
> }
> @@ -7997,6 +8002,9 @@ static int disas_thumb2_insn(CPUState *env,
> DisasContext *s, uint16_t insn_hw1)
> }
> tcg_gen_addi_i32(addr, addr, 4);
> }
> + if (loaded_base) {
> + store_reg(s, rn, loaded_var);
> + }
> if (insn & (1 << 21)) {
> /* Base register writeback. */
> if (insn & (1 << 24)) {
> --
> 1.7.4.msysgit.0
--
Aurelien Jarno GPG: 1024D/F1BCDB73
address@hidden http://www.aurel32.net