qemu-devel
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]