qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 1/2 for-2.6] target-sparc: fix Nucleus quad LDD


From: Mark Cave-Ayland
Subject: Re: [Qemu-devel] [PATCH 1/2 for-2.6] target-sparc: fix Nucleus quad LDD 128 bit access for windowed registers
Date: Thu, 14 Apr 2016 14:42:18 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Icedove/38.7.0

On 14/04/16 10:29, Artyom Tarasenko wrote:

> Fix register offset calculation when regwptr is used.
> 
> Signed-off-by: Artyom Tarasenko <address@hidden>
> ---
>  target-sparc/ldst_helper.c | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/target-sparc/ldst_helper.c b/target-sparc/ldst_helper.c
> index 2b0221c..a383074 100644
> --- a/target-sparc/ldst_helper.c
> +++ b/target-sparc/ldst_helper.c
> @@ -2059,11 +2059,11 @@ void helper_ldda_asi(CPUSPARCState *env, target_ulong 
> addr, int asi, int rd)
>                  bswap64s(&env->gregs[rd + 1]);
>              }
>          } else {
> -            env->regwptr[rd] = cpu_ldq_nucleus(env, addr);
> -            env->regwptr[rd + 1] = cpu_ldq_nucleus(env, addr + 8);
> +            env->regwptr[rd - 8] = cpu_ldq_nucleus(env, addr);
> +            env->regwptr[rd + 1 - 8] = cpu_ldq_nucleus(env, addr + 8);
>              if (asi == 0x2c) {
> -                bswap64s(&env->regwptr[rd]);
> -                bswap64s(&env->regwptr[rd + 1]);
> +                bswap64s(&env->regwptr[rd - 8]);
> +                bswap64s(&env->regwptr[rd + 1 - 8]);
>              }
>          }
>          break;
> @@ -2076,8 +2076,8 @@ void helper_ldda_asi(CPUSPARCState *env, target_ulong 
> addr, int asi, int rd)
>              env->gregs[rd] = helper_ld_asi(env, addr, asi, 4, 0);
>              env->gregs[rd + 1] = helper_ld_asi(env, addr + 4, asi, 4, 0);
>          } else {
> -            env->regwptr[rd] = helper_ld_asi(env, addr, asi, 4, 0);
> -            env->regwptr[rd + 1] = helper_ld_asi(env, addr + 4, asi, 4, 0);
> +            env->regwptr[rd - 8] = helper_ld_asi(env, addr, asi, 4, 0);
> +            env->regwptr[rd + 1 - 8] = helper_ld_asi(env, addr + 4, asi, 4, 
> 0);
>          }
>          break;
>      }
> 

So it seems that without this patch any ldda on a non-global register is
placing the result into the wrong register which is fairly nasty.

The patch does apply, but only with fuzz, and checkpatch.pl reports
several warnings with spacing/line endings. If you can rebase to master
and resend then you can add my Reviewed-by and I'm okay with this for
2.6 - register corruption is not good.


ATB,

Mark.




reply via email to

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