aboutsummaryrefslogtreecommitdiff
path: root/hw/ppc
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2023-08-08 14:19:50 +1000
committerCédric Le Goater <clg@kaod.org>2023-09-06 11:19:33 +0200
commitc8fbc6b9f2f3c732ee3307093c1c5c367eaa64ae (patch)
tree83930108d35a9792dc83141008e1cc4dd95d1dd8 /hw/ppc
parent8e0a5ac87800ccc6dd5013f89f27652f4480ab33 (diff)
downloadqemu-c8fbc6b9f2f3c732ee3307093c1c5c367eaa64ae.zip
qemu-c8fbc6b9f2f3c732ee3307093c1c5c367eaa64ae.tar.gz
qemu-c8fbc6b9f2f3c732ee3307093c1c5c367eaa64ae.tar.bz2
target/ppc: Sign-extend large decrementer to 64-bits
When storing a large decrementer value with the most significant implemented bit set, it is to be treated as a negative and sign extended. This isn't hit for book3s DEC because of another bug, fixing it in the next patch exposes this one and can cause additional problems, so fix this first. It can be hit with HDECR and other edge triggered types. Fixes: a8dafa52518 ("target/ppc: Implement large decrementer support for TCG") Signed-off-by: Nicholas Piggin <npiggin@gmail.com> [ clg: removed extra cpu and pcc variables shadowing local variables ] Signed-off-by: Cédric Le Goater <clg@kaod.org>
Diffstat (limited to 'hw/ppc')
-rw-r--r--hw/ppc/ppc.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c
index a397820..51f2bec 100644
--- a/hw/ppc/ppc.c
+++ b/hw/ppc/ppc.c
@@ -743,7 +743,9 @@ target_ulong cpu_ppc_load_decr(CPUPPCState *env)
* to 64 bits, otherwise it is a 32 bit value.
*/
if (env->spr[SPR_LPCR] & LPCR_LD) {
- return decr;
+ PowerPCCPU *cpu = env_archcpu(env);
+ PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
+ return sextract64(decr, 0, pcc->lrg_decr_bits);
}
return (uint32_t) decr;
}
@@ -762,7 +764,7 @@ target_ulong cpu_ppc_load_hdecr(CPUPPCState *env)
* extended to 64 bits, otherwise it is 32 bits.
*/
if (pcc->lrg_decr_bits > 32) {
- return hdecr;
+ return sextract64(hdecr, 0, pcc->lrg_decr_bits);
}
return (uint32_t) hdecr;
}