66 lines
1.2 KiB
ArmAsm
66 lines
1.2 KiB
ArmAsm
|
/* 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
|