X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=arch%2Fi386%2Fkernel%2Fverify_cpu.S;h=fff4aa61d7c305a606a96982bc8e7baea017ac28;hb=91a6c462b02d8dc02dbe95e5a407d78078a38d01;hp=b2a9d80b64215a826ab17d03407647d4bf129d29;hpb=c5b7bede71853d92fc747cdc12fa5234b6045731;p=powerpc.git diff --git a/arch/i386/kernel/verify_cpu.S b/arch/i386/kernel/verify_cpu.S index b2a9d80b64..fff4aa61d7 100644 --- a/arch/i386/kernel/verify_cpu.S +++ b/arch/i386/kernel/verify_cpu.S @@ -2,13 +2,14 @@ This runs in 16bit mode so that the caller can still use the BIOS to output errors on the screen */ #include +#include verify_cpu: pushfl # Save caller passed flags pushl $0 # Kill any dangerous flags popfl -#if CONFIG_X86_MINIMUM_CPU_MODEL >= 4 +#if CONFIG_X86_MINIMUM_CPU_FAMILY >= 4 pushfl pop %eax orl $(1<<18),%eax # try setting AC @@ -19,7 +20,7 @@ verify_cpu: testl $(1<<18),%eax jz bad #endif -#if REQUIRED_MASK1 != 0 +#if REQUIRED_MASK0 != 0 pushfl # standard way to check for cpuid popl %eax movl %eax,%ebx @@ -38,24 +39,50 @@ verify_cpu: pushfl popl %eax cmpl %eax,%ebx - jz bad # REQUIRED_MASK1 != 0 requires CPUID + jz bad # REQUIRED_MASK0 != 0 requires CPUID movl $0x0,%eax # See if cpuid 1 is implemented cpuid cmpl $0x1,%eax jb bad # no cpuid 1 +#if REQUIRED_MASK0 & NEED_CMPXCHG64 + /* Some VIA C3s need magic MSRs to enable CX64. Do this here */ + cmpl $0x746e6543,%ebx # Cent + jne 1f + cmpl $0x48727561,%edx # aurH + jne 1f + cmpl $0x736c7561,%ecx # auls + jne 1f + movl $1,%eax # check model + cpuid + movl %eax,%ebx + shr $8,%ebx + andl $0xf,%ebx + cmp $6,%ebx # check family == 6 + jne 1f + shr $4,%eax + andl $0xf,%eax + cmpl $6,%eax # check model >= 6 + jb 1f + # assume models >= 6 all support this MSR + movl $MSR_VIA_FCR,%ecx + rdmsr + orl $((1<<1)|(1<<7)),%eax # enable CMPXCHG64 and PGE + wrmsr +1: +#endif movl $0x1,%eax # Does the cpu have what it takes cpuid -#if CONFIG_X86_MINIMUM_CPU_MODEL > 4 +#if CONFIG_X86_MINIMUM_CPU_FAMILY > 4 #error add proper model checking here #endif - andl $REQUIRED_MASK1,%edx - xorl $REQUIRED_MASK1,%edx + andl $REQUIRED_MASK0,%edx + xorl $REQUIRED_MASK0,%edx jnz bad -#endif /* REQUIRED_MASK1 */ +#endif /* REQUIRED_MASK0 */ popfl xor %eax,%eax