| From 45a94d7cd45ed991914011919e7d40eb6d2546d1 Mon Sep 17 00:00:00 2001 |
| From: Suresh Siddha <suresh.b.siddha@intel.com> |
| Date: Wed, 16 Dec 2009 16:25:42 -0800 |
| Subject: x86, cpuid: Add "volatile" to asm in native_cpuid() |
| |
| From: Suresh Siddha <suresh.b.siddha@intel.com> |
| |
| commit 45a94d7cd45ed991914011919e7d40eb6d2546d1 upstream. |
| |
| xsave_cntxt_init() does something like: |
| |
| cpuid(0xd, ..); // find out what features FP/SSE/.. etc are supported |
| |
| xsetbv(); // enable the features known to OS |
| |
| cpuid(0xd, ..); // find out the size of the context for features enabled |
| |
| Depending on what features get enabled in xsetbv(), value of the |
| cpuid.eax=0xd.ecx=0.ebx changes correspondingly (representing the |
| size of the context that is enabled). |
| |
| As we don't have volatile keyword for native_cpuid(), gcc 4.1.2 |
| optimizes away the second cpuid and the kernel continues to use |
| the cpuid information obtained before xsetbv(), ultimately leading to kernel |
| crash on processors supporting more state than the legacy FP/SSE. |
| |
| Add "volatile" for native_cpuid(). |
| |
| Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> |
| LKML-Reference: <1261009542.2745.55.camel@sbs-t61.sc.intel.com> |
| Signed-off-by: H. Peter Anvin <hpa@zytor.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/x86/include/asm/processor.h | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/arch/x86/include/asm/processor.h |
| +++ b/arch/x86/include/asm/processor.h |
| @@ -179,7 +179,7 @@ static inline void native_cpuid(unsigned |
| unsigned int *ecx, unsigned int *edx) |
| { |
| /* ecx is often an input as well as an output. */ |
| - asm("cpuid" |
| + asm volatile("cpuid" |
| : "=a" (*eax), |
| "=b" (*ebx), |
| "=c" (*ecx), |