Re: Float crash. Fix in exit_thread()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



It's been a while since I worked on the code,
but I'm not sure why last_task_used_math
needs to be cleared if there is no FPU.
The way the FPU emulator was integrated,
the FPU register storage *is* the thread
context, so if there is no FPU, there was no 
FPU context switching, lazy or otherwise.  
Sounds like someone broke this.

Beyond that, the CFC1 instruction is presumably
there because in the R4000 (at least) it is specified
as the means to force the FP pipeline to drain
before the context switch.  I would suppose this
would be done in Linux to avoid mis-attribution
of FP exceptions. (See chapter 6 of the R4000 
User's manual, page 160 in the Second Edition).

            Kevin K.

----- Original Message ----- 
From: "Kjeld Borch Egevang" <kjelde@mips.com>
To: "linux-mips mailing list" <linux-mips@oss.sgi.com>
Sent: Thursday, June 06, 2002 5:06 PM
Subject: Float crash. Fix in exit_thread()


> I'm running on a system with no FPU. Now, I've got a program do_float 
> which seems to work fine. But if I enter:
> 
> /bin/echo hello; ./do_float
> 
> it terminates with a bus error or FP error. The bug is in exit_thread(). 
> Can anyone explain to me, what good the "cfc1 $0,$31" does?
> 
> 
> Here is the patch:
> 
> RCS file: /cvs/linux/arch/mips/kernel/process.c,v
> retrieving revision 1.36
> diff -u -r1.36 process.c
> --- process.c   2002/05/29 18:36:28     1.36
> +++ process.c   2002/06/06 14:51:32
> @@ -54,9 +54,11 @@
>  void exit_thread(void)
>  {
>         /* Forget lazy fpu state */
> -       if (last_task_used_math == current && mips_cpu.options & MIPS_CPU_FPU) {
> -               __enable_fpu();
> -               __asm__ __volatile__("cfc1\t$0,$31");
> +       if (last_task_used_math == current) {
> +               if (mips_cpu.options & MIPS_CPU_FPU) {
> +                       __enable_fpu();
> +                       __asm__ __volatile__("cfc1\t$0,$31");
> +               }
>                 last_task_used_math = NULL;
>         }
>  }
> @@ -64,9 +66,11 @@
>  void flush_thread(void)
>  {
>         /* Forget lazy fpu state */
> -       if (last_task_used_math == current && mips_cpu.options & MIPS_CPU_FPU) {
> -               __enable_fpu();
> -               __asm__ __volatile__("cfc1\t$0,$31");
> +       if (last_task_used_math == current) {
> +               if (mips_cpu.options & MIPS_CPU_FPU) {
> +                       __enable_fpu();
> +                       __asm__ __volatile__("cfc1\t$0,$31");
> +               }
>                 last_task_used_math = NULL;
>         }
>  }
> 
> 
> 
> /Kjeld
> 
> 
> -- 
> _    _ ____  ___                       Mailto:kjelde@mips.com
> |\  /|||___)(___    MIPS Denmark       Direct: +45 44 86 55 85
> | \/ |||    ____)   Lautrupvang 4 B    Switch: +45 44 86 55 55
>   TECHNOLOGIES      DK-2750 Ballerup   Fax...: +45 44 86 55 56
>                     Denmark            http://www.mips.com/
> 
> 


[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux