| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* ----------------------------------------------------------------------- * | 
|  | 2 | * | 
|  | 3 | *   Copyright 2002-2004 H. Peter Anvin - All Rights Reserved | 
|  | 4 | * | 
|  | 5 | *   This program is free software; you can redistribute it and/or modify | 
|  | 6 | *   it under the terms of the GNU General Public License as published by | 
|  | 7 | *   the Free Software Foundation, Inc., 53 Temple Place Ste 330, | 
| Atsushi SAKAI | 93ed05e | 2009-03-31 14:57:37 +1100 | [diff] [blame] | 8 | *   Boston MA 02111-1307, USA; either version 2 of the License, or | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 9 | *   (at your option) any later version; incorporated herein by reference. | 
|  | 10 | * | 
|  | 11 | * ----------------------------------------------------------------------- */ | 
|  | 12 |  | 
|  | 13 | /* | 
| NeilBrown | a8e026c | 2010-08-12 06:44:54 +1000 | [diff] [blame] | 14 | * raid6/x86.h | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 15 | * | 
|  | 16 | * Definitions common to x86 and x86-64 RAID-6 code only | 
|  | 17 | */ | 
|  | 18 |  | 
|  | 19 | #ifndef LINUX_RAID_RAID6X86_H | 
|  | 20 | #define LINUX_RAID_RAID6X86_H | 
|  | 21 |  | 
| Al Viro | ca5cd87 | 2007-10-29 04:31:16 +0000 | [diff] [blame] | 22 | #if (defined(__i386__) || defined(__x86_64__)) && !defined(__arch_um__) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 23 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 24 | #ifdef __KERNEL__ /* Real code */ | 
|  | 25 |  | 
| H. Peter Anvin | a723406 | 2007-02-28 20:11:25 -0800 | [diff] [blame] | 26 | #include <asm/i387.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 27 |  | 
|  | 28 | #else /* Dummy code for user space testing */ | 
|  | 29 |  | 
| H. Peter Anvin | a723406 | 2007-02-28 20:11:25 -0800 | [diff] [blame] | 30 | static inline void kernel_fpu_begin(void) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 31 | { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 32 | } | 
|  | 33 |  | 
| H. Peter Anvin | a723406 | 2007-02-28 20:11:25 -0800 | [diff] [blame] | 34 | static inline void kernel_fpu_end(void) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 35 | { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 36 | } | 
|  | 37 |  | 
| Jim Kukunas | 2dbf708 | 2012-05-22 13:54:23 +1000 | [diff] [blame] | 38 | #define __aligned(x) __attribute__((aligned(x))) | 
|  | 39 |  | 
| H. Peter Anvin | a723406 | 2007-02-28 20:11:25 -0800 | [diff] [blame] | 40 | #define X86_FEATURE_MMX		(0*32+23) /* Multimedia Extensions */ | 
|  | 41 | #define X86_FEATURE_FXSR	(0*32+24) /* FXSAVE and FXRSTOR instructions | 
|  | 42 | * (fast save and restore) */ | 
|  | 43 | #define X86_FEATURE_XMM		(0*32+25) /* Streaming SIMD Extensions */ | 
|  | 44 | #define X86_FEATURE_XMM2	(0*32+26) /* Streaming SIMD Extensions-2 */ | 
| Jim Kukunas | 2dbf708 | 2012-05-22 13:54:23 +1000 | [diff] [blame] | 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 */ | 
| H. Peter Anvin | a723406 | 2007-02-28 20:11:25 -0800 | [diff] [blame] | 48 | #define X86_FEATURE_MMXEXT	(1*32+22) /* AMD MMX extensions */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 49 |  | 
| H. Peter Anvin | a723406 | 2007-02-28 20:11:25 -0800 | [diff] [blame] | 50 | /* Should work well enough on modern CPUs for testing */ | 
|  | 51 | static inline int boot_cpu_has(int flag) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 52 | { | 
| Jim Kukunas | 2dbf708 | 2012-05-22 13:54:23 +1000 | [diff] [blame] | 53 | u32 eax = (flag & 0x20) ? 0x80000001 : 1; | 
|  | 54 | u32 ecx, edx; | 
| H. Peter Anvin | a723406 | 2007-02-28 20:11:25 -0800 | [diff] [blame] | 55 |  | 
|  | 56 | asm volatile("cpuid" | 
| Jim Kukunas | 2dbf708 | 2012-05-22 13:54:23 +1000 | [diff] [blame] | 57 | : "+a" (eax), "=d" (edx), "=c" (ecx) | 
|  | 58 | : : "ebx"); | 
| H. Peter Anvin | a723406 | 2007-02-28 20:11:25 -0800 | [diff] [blame] | 59 |  | 
| Jim Kukunas | 2dbf708 | 2012-05-22 13:54:23 +1000 | [diff] [blame] | 60 | return ((flag & 0x80 ? ecx : edx) >> (flag & 31)) & 1; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 61 | } | 
|  | 62 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 63 | #endif /* ndef __KERNEL__ */ | 
|  | 64 |  | 
|  | 65 | #endif | 
|  | 66 | #endif |