diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2016-04-15 10:49:04 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2016-04-15 10:49:04 +0100 |
commit | 538a467329818ea831f602491ac62d7d7999102a (patch) | |
tree | f1e2252843cadd5a8a854ce702d9a8b3ab64e19c | |
parent | bc8995cafa0c36b9e4be682e9a60d59484b33500 (diff) | |
parent | de5f1077446ca455342db149737bdc395a7b9882 (diff) |
Merge remote-tracking branch 'remotes/mcayland/tags/qemu-sparc-signed' into staging
qemu-sparc update
# gpg: Signature made Fri 15 Apr 2016 09:30:58 BST using RSA key ID AE0F321F
# gpg: Good signature from "Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>"
* remotes/mcayland/tags/qemu-sparc-signed:
target-sparc: fix Trap Based Address Register behavior for sparc64
target-sparc: fix Nucleus quad LDD 128 bit access for windowed registers
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r-- | target-sparc/int64_helper.c | 5 | ||||
-rw-r--r-- | target-sparc/ldst_helper.c | 12 |
2 files changed, 8 insertions, 9 deletions
diff --git a/target-sparc/int64_helper.c b/target-sparc/int64_helper.c index aa876cd8ba..29360fa5fe 100644 --- a/target-sparc/int64_helper.c +++ b/target-sparc/int64_helper.c @@ -158,9 +158,8 @@ void sparc_cpu_do_interrupt(CPUState *cs) } else if ((intno & 0x1c0) == TT_FILL) { cpu_set_cwp(env, cpu_cwp_inc(env, env->cwp + 1)); } - env->tbr &= ~0x7fffULL; - env->tbr |= ((env->tl > 1) ? 1 << 14 : 0) | (intno << 5); - env->pc = env->tbr; + env->pc = env->tbr & ~0x7fffULL; + env->pc |= ((env->tl > 1) ? 1 << 14 : 0) | (intno << 5); env->npc = env->pc + 4; cs->exception_index = -1; } diff --git a/target-sparc/ldst_helper.c b/target-sparc/ldst_helper.c index b0600fd24d..658e7d8585 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; } |