aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHelge Deller <deller@gmx.de>2025-05-17 13:12:07 +0200
committerHelge Deller <deller@gmx.de>2025-05-17 13:12:07 +0200
commit923976dfe367b0bfed45ff660c369f3fe65604a7 (patch)
tree765ed949e42a6c19d3e7315eb62b3de69b5e2d78
parent7c949c53e936aa3a658d84ab53bae5cadaa5d59c (diff)
downloadqemu-923976dfe367b0bfed45ff660c369f3fe65604a7.zip
qemu-923976dfe367b0bfed45ff660c369f3fe65604a7.tar.gz
qemu-923976dfe367b0bfed45ff660c369f3fe65604a7.tar.bz2
target/hppa: Copy instruction code into fr1 on FPU assist fault
The hardware stores the instruction code in the lower bits of the FP exception register #1 on FP assist traps. This fixes the FP exception handler on Linux, as the Linux kernel uses the value to decide on the correct signal which should be pushed into userspace (see decode_fpu() in Linux kernel). Signed-off-by: Helge Deller <deller@gmx.de>
-rw-r--r--target/hppa/int_helper.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/target/hppa/int_helper.c b/target/hppa/int_helper.c
index 7d48643..191ae19 100644
--- a/target/hppa/int_helper.c
+++ b/target/hppa/int_helper.c
@@ -177,6 +177,10 @@ void hppa_cpu_do_interrupt(CPUState *cs)
}
}
env->cr[CR_IIR] = ldl_phys(cs->as, paddr);
+ if (i == EXCP_ASSIST) {
+ /* stuff insn code into bits of FP exception register #1 */
+ env->fr[0] |= (env->cr[CR_IIR] & 0x03ffffff);
+ }
}
break;