[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.