On Mon, May 25, 2026 at 11:22 AM Matt Turner <[email protected]> wrote: > > QEMU keeps the s390x floating-point control register (FPC) in env->fpc. > The rounding mode bits [2:0] of FPC are reflected into the derived > env->fpu_status via set_float_rounding_mode(); every architectural > write to FPC goes through HELPER(sfpc) which keeps the two in sync. > > restore_sigregs() restored FPC with a direct assignment: > > __get_user(env->fpc, &sc->fpregs.fpc); > > This wrote env->fpc correctly but never updated env->fpu_status, so on > sigreturn the interrupted code resumed with whatever rounding mode the > signal handler last installed in fpu_status. > > Factor the two-step "write fpc + sync fpu_status" logic out of > HELPER(sfpc) into cpu_s390x_load_fpc(), declare it in cpu.h, and call > it from restore_sigregs() in place of the direct assignment. > cpu_s390x_load_fpc() omits the specification-exception check that > HELPER(sfpc) performs; raw signal frame restoration does not validate > the saved state. > > Fixes: 2941e0fa05 ("linux-user/s390x: Save/restore fpc when handling a > signal") > Cc: [email protected] > ---
Signed-off-by: Matt Turner <[email protected]>
