diff options
author | Helge Deller <deller@gmx.de> | 2025-05-17 13:12:07 +0200 |
---|---|---|
committer | Helge Deller <deller@gmx.de> | 2025-05-17 13:12:07 +0200 |
commit | 923976dfe367b0bfed45ff660c369f3fe65604a7 (patch) | |
tree | 765ed949e42a6c19d3e7315eb62b3de69b5e2d78 | |
parent | 7c949c53e936aa3a658d84ab53bae5cadaa5d59c (diff) | |
download | qemu-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.c | 4 |
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; |