diff options
Diffstat (limited to 'lib/raid6/x86.h')
| -rw-r--r-- | lib/raid6/x86.h | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/lib/raid6/x86.h b/lib/raid6/x86.h index cb2a8c91c886..d55d63232c55 100644 --- a/lib/raid6/x86.h +++ b/lib/raid6/x86.h | |||
| @@ -35,24 +35,29 @@ static inline void kernel_fpu_end(void) | |||
| 35 | { | 35 | { |
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | #define __aligned(x) __attribute__((aligned(x))) | ||
| 39 | |||
| 38 | #define X86_FEATURE_MMX (0*32+23) /* Multimedia Extensions */ | 40 | #define X86_FEATURE_MMX (0*32+23) /* Multimedia Extensions */ |
| 39 | #define X86_FEATURE_FXSR (0*32+24) /* FXSAVE and FXRSTOR instructions | 41 | #define X86_FEATURE_FXSR (0*32+24) /* FXSAVE and FXRSTOR instructions |
| 40 | * (fast save and restore) */ | 42 | * (fast save and restore) */ |
| 41 | #define X86_FEATURE_XMM (0*32+25) /* Streaming SIMD Extensions */ | 43 | #define X86_FEATURE_XMM (0*32+25) /* Streaming SIMD Extensions */ |
| 42 | #define X86_FEATURE_XMM2 (0*32+26) /* Streaming SIMD Extensions-2 */ | 44 | #define X86_FEATURE_XMM2 (0*32+26) /* Streaming SIMD Extensions-2 */ |
| 45 | #define X86_FEATURE_XMM3 (4*32+ 0) /* "pni" SSE-3 */ | ||
| 46 | #define X86_FEATURE_SSSE3 (4*32+ 9) /* Supplemental SSE-3 */ | ||
| 47 | #define X86_FEATURE_AVX (4*32+28) /* Advanced Vector Extensions */ | ||
| 43 | #define X86_FEATURE_MMXEXT (1*32+22) /* AMD MMX extensions */ | 48 | #define X86_FEATURE_MMXEXT (1*32+22) /* AMD MMX extensions */ |
| 44 | 49 | ||
| 45 | /* Should work well enough on modern CPUs for testing */ | 50 | /* Should work well enough on modern CPUs for testing */ |
| 46 | static inline int boot_cpu_has(int flag) | 51 | static inline int boot_cpu_has(int flag) |
| 47 | { | 52 | { |
| 48 | u32 eax = (flag >> 5) ? 0x80000001 : 1; | 53 | u32 eax = (flag & 0x20) ? 0x80000001 : 1; |
| 49 | u32 edx; | 54 | u32 ecx, edx; |
| 50 | 55 | ||
| 51 | asm volatile("cpuid" | 56 | asm volatile("cpuid" |
| 52 | : "+a" (eax), "=d" (edx) | 57 | : "+a" (eax), "=d" (edx), "=c" (ecx) |
| 53 | : : "ecx", "ebx"); | 58 | : : "ebx"); |
| 54 | 59 | ||
| 55 | return (edx >> (flag & 31)) & 1; | 60 | return ((flag & 0x80 ? ecx : edx) >> (flag & 31)) & 1; |
| 56 | } | 61 | } |
| 57 | 62 | ||
| 58 | #endif /* ndef __KERNEL__ */ | 63 | #endif /* ndef __KERNEL__ */ |
