x86/fpu, crypto: Fix AVX2 feature tests
authorIngo Molnar <mingo@kernel.org>
Fri, 22 May 2015 08:58:45 +0000 (10:58 +0200)
committerIngo Molnar <mingo@kernel.org>
Fri, 22 May 2015 08:58:45 +0000 (10:58 +0200)
For some CPU models I broke the AVX2 feature detection in:

  7bc371faa9cd ("x86/fpu, crypto x86/camellia_aesni_avx2: Simplify the camellia_aesni_init() xfeature checks")
  534ff06e3929 ("x86/fpu, crypto x86/serpent_avx2: Simplify the init() xfeature checks")

... because I did not realize that it's possible for a CPU to support
the xstate necessary for AVX2 execution (XSTATE_YMM), but not have
the AVX2 instructions themselves.

Restore the necessary CPUID checks as well.

Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/crypto/camellia_aesni_avx2_glue.c
arch/x86/crypto/serpent_avx2_glue.c

index 76ea7df217e650357022ae3f0e318a6ffcf31f54..4c65c70e628bb2776c17c106973b2f2b668890fb 100644 (file)
@@ -562,6 +562,11 @@ static int __init camellia_aesni_init(void)
 {
        const char *feature_name;
 
+       if (!cpu_has_avx2 || !cpu_has_avx || !cpu_has_aes || !cpu_has_osxsave) {
+               pr_info("AVX2 or AES-NI instructions are not detected.\n");
+               return -ENODEV;
+       }
+
        if (!cpu_has_xfeatures(XSTATE_SSE | XSTATE_YMM, &feature_name)) {
                pr_info("CPU feature '%s' is not supported.\n", feature_name);
                return -ENODEV;
index f226ad41fde15699cae9fb187bf49b0d4dc9ad81..7d838dc4d888f30010dfba7c21561a16bfe4e3d0 100644 (file)
@@ -538,6 +538,10 @@ static int __init init(void)
 {
        const char *feature_name;
 
+       if (!cpu_has_avx2 || !cpu_has_osxsave) {
+               pr_info("AVX2 instructions are not detected.\n");
+               return -ENODEV;
+       }
        if (!cpu_has_xfeatures(XSTATE_SSE | XSTATE_YMM, &feature_name)) {
                pr_info("CPU feature '%s' is not supported.\n", feature_name);
                return -ENODEV;