Re: [PATCH] linux-user/sh4: Initialize the FPSCR register on signal

[email protected] Wed, 05 Aug 2026 21:32:43 +0900
Newsgroups gmane.comp.emulators.qemu
Message-ID <[email protected]>
On Tue, 04 Aug 2026 17:59:18 +0900,
Mikulas Patocka wrote:
> 
> On the SH4 architecture, the instructions that perform single precision
> and double precision floating point operations are encoded in the same
> way. The bit PR in the FPSCR register determines if the CPU performs
> single or double operation.
> 
> According to the ABI, the PR bit must be set at function entry and
> function exit.
> 
> GCC generates code that flips this bit as needed during function
> execution. If we get a signal, we must set the PR bit, so that the signal
> handler finds the bit in the expected state. Qemu lacked this logic, so
> that if the signal interrupts single-precision floating point
> calculation, the PR bit would be incorrectly clear at signal handler
> entry. If the signal handler performed some floating-point calculation,
> it would get incorrect result.
> 
> This patch fixes the bug, by initializing the FPSCR register at signal
> entry. Note that we initialize the whole register, because the Linux
> kernel initializes the whole register too.
> 
> Cc: [email protected]
> Signed-off-by: Mikulas Patocka <[email protected]>
> 
> ---
>  linux-user/sh4/signal.c |    4 ++++
>  1 file changed, 4 insertions(+)
> 
> Index: qemu/linux-user/sh4/signal.c
> ===================================================================
> --- qemu.orig/linux-user/sh4/signal.c	2026-08-02 18:03:09.000000000 +0200
> +++ qemu/linux-user/sh4/signal.c	2026-08-04 09:40:21.000000000 +0200
> @@ -206,6 +206,8 @@ void setup_frame(int sig, struct target_
>          __put_user(set->sig[i + 1], &frame->extramask[i]);
>      }
>  
> +    regs->fpscr = FPSCR_PR;
> +
>      /* Set up to return from userspace.  If provided, use a stub
>         already in userspace.  */
>      if (ka->sa_flags & TARGET_SA_RESTORER) {
> @@ -258,6 +260,8 @@ void setup_rt_frame(int sig, struct targ
>          __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]);
>      }
>  
> +    regs->fpscr = FPSCR_PR;
> +
>      /* Set up to return from userspace.  If provided, use a stub
>         already in userspace.  */
>      if (ka->sa_flags & TARGET_SA_RESTORER) {
> 

Reviewed-by: Yoshinori Sato <[email protected]>

-- 
Yosinori Sato