On Sat, Jan 27, 2024 at 05:05:57AM +0800, Xi Ruoyao wrote: > If we still own the FPU after initializing fcr31, when we are preempted > the dirty value in the FPU will be read out and stored into fcr31, > clobbering our setting. This can cause an improper floating-point > environment after execve(). For example: > > zsh% cat measure.c > #include <fenv.h> > int main() { return fetestexcept(FE_INEXACT); } > zsh% cc measure.c -o measure -lm > zsh% echo $((1.0/3)) # raising FE_INEXACT > 0.33333333333333331 > zsh% while ./measure; do ; done > (stopped in seconds) > > Call lose_fpu(0) before setting fcr31 to prevent this. > > Closes: https://lore.kernel.org/linux-mips/7a6aa1bbdbbe2e63ae96ff163fab0349f58f1b9e.camel@xxxxxxxxxxx/ > Fixes: 9b26616c8d9d ("MIPS: Respect the ISA level in FCSR handling") > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Xi Ruoyao <xry111@xxxxxxxxxxx> > --- > > v1 -> v2: Fix stable list address in Cc line. > > arch/mips/kernel/elf.c | 6 ++++++ > 1 file changed, 6 insertions(+) applied to mips-fixes. Thomas. -- Crap can work. Given enough thrust pigs will fly, but it's not necessarily a good idea. [ RFC1925, 2.3 ]