/* 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 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