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]>

Reply via email to