| 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, | 
|  | 8 | *   Bostom MA 02111-1307, USA; either version 2 of the License, or | 
|  | 9 | *   (at your option) any later version; incorporated herein by reference. | 
|  | 10 | * | 
|  | 11 | * ----------------------------------------------------------------------- */ | 
|  | 12 |  | 
|  | 13 | /* | 
|  | 14 | * raid6x86.h | 
|  | 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 |  | 
|  | 22 | #if defined(__i386__) || defined(__x86_64__) | 
|  | 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 |  | 
| H. Peter Anvin | a723406 | 2007-02-28 20:11:25 -0800 | [diff] [blame] | 38 | #define X86_FEATURE_MMX		(0*32+23) /* Multimedia Extensions */ | 
|  | 39 | #define X86_FEATURE_FXSR	(0*32+24) /* FXSAVE and FXRSTOR instructions | 
|  | 40 | * (fast save and restore) */ | 
|  | 41 | #define X86_FEATURE_XMM		(0*32+25) /* Streaming SIMD Extensions */ | 
|  | 42 | #define X86_FEATURE_XMM2	(0*32+26) /* Streaming SIMD Extensions-2 */ | 
|  | 43 | #define X86_FEATURE_MMXEXT	(1*32+22) /* AMD MMX extensions */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 44 |  | 
| H. Peter Anvin | a723406 | 2007-02-28 20:11:25 -0800 | [diff] [blame] | 45 | /* Should work well enough on modern CPUs for testing */ | 
|  | 46 | static inline int boot_cpu_has(int flag) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 47 | { | 
| H. Peter Anvin | a723406 | 2007-02-28 20:11:25 -0800 | [diff] [blame] | 48 | u32 eax = (flag >> 5) ? 0x80000001 : 1; | 
|  | 49 | u32 edx; | 
|  | 50 |  | 
|  | 51 | asm volatile("cpuid" | 
|  | 52 | : "+a" (eax), "=d" (edx) | 
|  | 53 | : : "ecx", "ebx"); | 
|  | 54 |  | 
|  | 55 | return (edx >> (flag & 31)) & 1; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 56 | } | 
|  | 57 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 58 | #endif /* ndef __KERNEL__ */ | 
|  | 59 |  | 
|  | 60 | #endif | 
|  | 61 | #endif |