Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
[linux-2.6] / arch / i386 / kernel / verify_cpu.S
1 /* Check if CPU has some minimum CPUID bits
2    This runs in 16bit mode so that the caller can still use the BIOS
3    to output errors on the screen */
4 #include <asm/cpufeature.h>
5
6 verify_cpu:
7         pushfl                          # Save caller passed flags
8         pushl   $0                      # Kill any dangerous flags
9         popfl
10
11 #if CONFIG_X86_MINIMUM_CPU_MODEL >= 4
12         pushfl
13         orl     $(1<<18),(%esp)         # try setting AC
14         popfl
15         pushfl
16         popl    %eax
17         testl   $(1<<18),%eax
18         jz      bad
19 #endif
20 #if REQUIRED_MASK1 != 0
21         pushfl                          # standard way to check for cpuid
22         popl    %eax
23         movl    %eax,%ebx
24         xorl    $0x200000,%eax
25         pushl   %eax
26         popfl
27         pushfl
28         popl    %eax
29         cmpl    %eax,%ebx
30         pushfl                          # standard way to check for cpuid
31         popl    %eax
32         movl    %eax,%ebx
33         xorl    $0x200000,%eax
34         pushl   %eax
35         popfl
36         pushfl
37         popl    %eax
38         cmpl    %eax,%ebx
39         jz      bad                     # REQUIRED_MASK1 != 0 requires CPUID
40
41         movl    $0x0,%eax               # See if cpuid 1 is implemented
42         cpuid
43         cmpl    $0x1,%eax
44         jb      bad                     # no cpuid 1
45
46         movl    $0x1,%eax               # Does the cpu have what it takes
47         cpuid
48
49 #if CONFIG_X86_MINIMUM_CPU_MODEL > 4
50 #error  add proper model checking here
51 #endif
52
53         andl    $REQUIRED_MASK1,%edx
54         xorl    $REQUIRED_MASK1,%edx
55         jnz     bad
56 #endif /* REQUIRED_MASK1 */
57
58         popfl
59         xor     %eax,%eax
60         ret
61
62 bad:
63         popfl
64         movl    $1,%eax
65         ret