From: Chris Lalancette <clalance@redhat.com> Date: Fri, 20 Mar 2009 10:21:53 +0100 Subject: [x86] fdiv bug detection fix Message-id: 49C36031.8070609@redhat.com O-Subject: [RHEL5.4 PATCH 2/14]: x86 fdiv bug detection fix Bugzilla: 463573 RH-Acked-by: Rik van Riel <riel@redhat.com> RH-Acked-by: Pete Zaitcev <zaitcev@redhat.com> RH-Acked-by: Justin M. Forbes <jforbes@redhat.com> The fdiv detection code writes s32 integer into the boot_cpu_data.fdiv_bug. However, the boot_cpu_data.fdiv_bug is only char (s8) field so the detection overwrites already set fields for other bugs, e.g. the f00f bug field. Use local s32 variable to receive result. upstream commit e0d22d03c06c4e2c194d7010bc1e4a972199f156 Fixes BZ 463573 diff --git a/include/asm-i386/bugs.h b/include/asm-i386/bugs.h index 2a9e4ee..f80899f 100644 --- a/include/asm-i386/bugs.h +++ b/include/asm-i386/bugs.h @@ -63,6 +63,8 @@ static double __initdata y = 3145727.0; */ static void __init check_fpu(void) { + s32 fdiv_bug; + if (!boot_cpu_data.hard_math) { #ifndef CONFIG_MATH_EMULATION printk(KERN_EMERG "No coprocessor found and no math emulation present.\n"); @@ -83,8 +85,10 @@ static void __init check_fpu(void) "fistpl %0\n\t" "fwait\n\t" "fninit" - : "=m" (*&boot_cpu_data.fdiv_bug) + : "=m" (*&fdiv_bug) : "m" (*&x), "m" (*&y)); + + boot_cpu_data.fdiv_bug = fdiv_bug; if (boot_cpu_data.fdiv_bug) printk("Hmm, FPU with FDIV bug.\n"); }