[PATCH] invalid instructions in kernel mode
Kumar Gala
kumar.gala at freescale.com
Fri Apr 1 20:04:40 EST 2005
What is the crash01 test doing that causes this code to get invoked?
is the kernel you are using using build with math emulation on or off?
- kumar
On Mar 31, 2005, at 11:47 AM, Fillod Stephane wrote:
> Hi,
>
> When CPU has no (classic) FPU, and math emulation is disabled,
> fp instructions are not allowed in kernel mode.
> This bug has been found with crashme (crash01) of LTP, on a e500
> system.
>
> The patch was made against linux 2.6.11.6.
> A trivial typo fix has been appended.
>
> Rem: a CONFIG_PPCFPU define could make life easier.
>
>
>
> Signed-off-by: Stephane Fillod <fillods at gmail.com>
>
> --- linux/arch/ppc/kernel/align.c 6 Dec 2004 16:18:11 -0000
> 1.1.1.1
> +++ linux/arch/ppc/kernel/align.c 31 Mar 2005 16:33:25 -0000
> @@ -333,10 +333,14 @@
> }
>
> if (flags & F) {
> +#if !(defined(CONFIG_4xx) || defined(CONFIG_8xx) ||
> defined(CONFIG_E500)) || defined(CONFIG_MATH_EMULATION)
> preempt_disable();
> if (regs->msr & MSR_FP)
> giveup_fpu(current);
> preempt_enable();
> +#else
> + return 0;
> +#endif
> }
>
> /* If we read the operand, copy it in, else get register
> values
> */
> @@ -366,6 +370,8 @@
> }
> break;
>
> +#if !(defined(CONFIG_4xx) || defined(CONFIG_8xx) ||
> defined(CONFIG_E500)) || defined(CONFIG_MATH_EMULATION)
> +
> /* Single-precision FP load and store require conversions...
> */
> case LD+F+S:
> preempt_disable();
> @@ -379,6 +385,7 @@
> cvt_df(&data.d, &data.f, ¤t->thread.fpscr);
> preempt_enable();
> break;
> +#endif
> }
>
> if (flags & ST) {
> --- linux/arch/ppc/kernel/misc.S 26 Mar 2005 03:28:36 -0000
> 1.1.1.2
> +++ linux/arch/ppc/kernel/misc.S 31 Mar 2005 16:33:25 -0000
> @@ -1096,7 +1096,8 @@
> * and exceptions as if the cpu had performed the load or store.
> */
>
> -#if defined(CONFIG_4xx) || defined(CONFIG_E500)
> +#if !(defined(CONFIG_4xx) || defined(CONFIG_E500) ||
> defined(CONFIG_8xx)) || defined(CONFIG_MATH_EMULATION)
> +#if defined(CONFIG_4xx) || defined(CONFIG_E500)
> _GLOBAL(cvt_fd)
> lfs 0,0(r3)
> stfd 0,0(r4)
> @@ -1125,6 +1126,7 @@
> stfd 0,-4(r5)
> blr
> #endif
> +#endif
>
> /*
> * Create a kernel thread
> --- linux/arch/ppc/kernel/process.c 26 Mar 2005 03:28:20 -0000
> 1.1.1.2
> +++ linux/arch/ppc/kernel/process.c 31 Mar 2005 16:33:25 -0000
> @@ -342,7 +342,7 @@
> printk("\n");
> #ifdef CONFIG_KALLSYMS
> /*
> - * Lookup NIP late so we have the best change of getting the
> + * Lookup NIP late so we have the best chance of getting the
> * above info out without failing
> */
> printk("NIP [%08lx] ", regs->nip);
>
>
>
> Best Regards,
>
> --
> Stephane
More information about the Linuxppc-dev
mailing list