]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
x86, xsave: Check cpuid level for XSTATE_CPUID (0x0d)
authorRobert Richter <robert.richter@amd.com>
Wed, 21 Jul 2010 17:03:54 +0000 (19:03 +0200)
committerH. Peter Anvin <hpa@linux.intel.com>
Wed, 21 Jul 2010 21:06:04 +0000 (14:06 -0700)
The patch introduces the XSTATE_CPUID macro and adds a check that
tests if XSTATE_CPUID exists.

Signed-off-by: Robert Richter <robert.richter@amd.com>
LKML-Reference: <1279731838-1522-4-git-send-email-robert.richter@amd.com>
Acked-by: Suresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
arch/x86/include/asm/xsave.h
arch/x86/kernel/xsave.c

index 4d3b5d1fc028ad95a123dc7f085be5ec8e44c301..d1b5f3a2fa20b4f70aa6a1d0742b533d6081497c 100644 (file)
@@ -4,6 +4,8 @@
 #include <linux/types.h>
 #include <asm/processor.h>
 
+#define XSTATE_CPUID           0x0000000d
+
 #define XSTATE_FP      0x1
 #define XSTATE_SSE     0x2
 #define XSTATE_YMM     0x4
index 2322f586c0514d0ad117e3d21394c117dbfbb43a..5adb7fb408f0f047922c40a06217b488d0ecd37e 100644 (file)
@@ -379,7 +379,7 @@ static void setup_xstate_features(void)
        xstate_sizes = alloc_bootmem(xstate_features * sizeof(int));
 
        do {
-               cpuid_count(0xd, leaf, &eax, &ebx, &ecx, &edx);
+               cpuid_count(XSTATE_CPUID, leaf, &eax, &ebx, &ecx, &edx);
 
                if (eax == 0)
                        break;
@@ -425,7 +425,12 @@ static void __cpuinit xstate_enable_boot_cpu(void)
 {
        unsigned int eax, ebx, ecx, edx;
 
-       cpuid_count(0xd, 0, &eax, &ebx, &ecx, &edx);
+       if (boot_cpu_data.cpuid_level < XSTATE_CPUID) {
+               WARN(1, KERN_ERR "XSTATE_CPUID missing\n");
+               return;
+       }
+
+       cpuid_count(XSTATE_CPUID, 0, &eax, &ebx, &ecx, &edx);
        pcntxt_mask = eax + ((u64)edx << 32);
 
        if ((pcntxt_mask & XSTATE_FPSSE) != XSTATE_FPSSE) {
@@ -444,7 +449,7 @@ static void __cpuinit xstate_enable_boot_cpu(void)
        /*
         * Recompute the context size for enabled features
         */
-       cpuid_count(0xd, 0, &eax, &ebx, &ecx, &edx);
+       cpuid_count(XSTATE_CPUID, 0, &eax, &ebx, &ecx, &edx);
        xstate_size = ebx;
 
        update_regset_xstate_info(xstate_size, pcntxt_mask);