c7f81c9453
Check some CPUID bits that are needed for compiler generated early in boot. When the system is still in real mode before changing the VESA BIOS mode it is possible to still display an visible error message on the screen. Similar to x86-64. Includes cleanups from Eric Biederman Signed-off-by: Andi Kleen <ak@suse.de>
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
|