On Mon, May 25, 2026 at 11:26 AM Matt Turner <[email protected]> wrote: > > The SH4 FPSCR rounding-mode (RM) and denormal (DN) bits are not held > only in env->fpscr: they are also reflected into the derived > env->fp_status via set_float_rounding_mode()/set_flush_to_zero(). The > guest keeps the two in sync by routing every write to FPSCR through > helper_ld_fpscr(). > > restore_sigcontext() wrote the saved value straight into env->fpscr and > never touched env->fp_status, so on sigreturn the interrupted code > resumed with whatever FP rounding mode and flush-to-zero setting the > signal handler last installed. (regs->flags = 0 forces the FR/SZ/PR TB > flags to be recomputed, but fp_status is runtime float state, not a TB > flag, so it was left stale.) This is the FP analogue of the T/M/Q bit > problem just fixed for the integer status register. > > Factor the FPSCR -> fp_status synchronisation out of helper_ld_fpscr() > into cpu_load_fpscr() and use it from restore_sigcontext() so the > rounding mode round-trips correctly across signal delivery. > > Fixes: c3b5bc8ab3 ("SH4: Signal handling for the user space emulator, by > Magnus Damm.") > Cc: [email protected] > ---
Signed-off-by: Matt Turner <[email protected]>
