|
@@ -0,0 +1,65 @@
|
|
|
+/* Check if CPU has some minimum CPUID bits
|
|
|
+ This runs in 16bit mode so that the caller can still use the BIOS
|
|
|
+ to output errors on the screen */
|
|
|
+#include <asm/cpufeature.h>
|
|
|
+
|
|
|
+verify_cpu:
|
|
|
+ pushfl # Save caller passed flags
|
|
|
+ pushl $0 # Kill any dangerous flags
|
|
|
+ popfl
|
|
|
+
|
|
|
+#if CONFIG_X86_MINIMUM_CPU_MODEL >= 4
|
|
|
+ pushfl
|
|
|
+ orl $(1<<18),(%esp) # try setting AC
|
|
|
+ popfl
|
|
|
+ pushfl
|
|
|
+ popl %eax
|
|
|
+ testl $(1<<18),%eax
|
|
|
+ jz bad
|
|
|
+#endif
|
|
|
+#if REQUIRED_MASK1 != 0
|
|
|
+ pushfl # standard way to check for cpuid
|
|
|
+ popl %eax
|
|
|
+ movl %eax,%ebx
|
|
|
+ xorl $0x200000,%eax
|
|
|
+ pushl %eax
|
|
|
+ popfl
|
|
|
+ pushfl
|
|
|
+ popl %eax
|
|
|
+ cmpl %eax,%ebx
|
|
|
+ pushfl # standard way to check for cpuid
|
|
|
+ popl %eax
|
|
|
+ movl %eax,%ebx
|
|
|
+ xorl $0x200000,%eax
|
|
|
+ pushl %eax
|
|
|
+ popfl
|
|
|
+ pushfl
|
|
|
+ popl %eax
|
|
|
+ cmpl %eax,%ebx
|
|
|
+ jz bad # REQUIRED_MASK1 != 0 requires CPUID
|
|
|
+
|
|
|
+ movl $0x0,%eax # See if cpuid 1 is implemented
|
|
|
+ cpuid
|
|
|
+ cmpl $0x1,%eax
|
|
|
+ jb bad # no cpuid 1
|
|
|
+
|
|
|
+ movl $0x1,%eax # Does the cpu have what it takes
|
|
|
+ cpuid
|
|
|
+
|
|
|
+#if CONFIG_X86_MINIMUM_CPU_MODEL > 4
|
|
|
+#error add proper model checking here
|
|
|
+#endif
|
|
|
+
|
|
|
+ andl $REQUIRED_MASK1,%edx
|
|
|
+ xorl $REQUIRED_MASK1,%edx
|
|
|
+ jnz bad
|
|
|
+#endif /* REQUIRED_MASK1 */
|
|
|
+
|
|
|
+ popfl
|
|
|
+ xor %eax,%eax
|
|
|
+ ret
|
|
|
+
|
|
|
+bad:
|
|
|
+ popfl
|
|
|
+ movl $1,%eax
|
|
|
+ ret
|