Commit 6662c34f authored by H. Peter Anvin's avatar H. Peter Anvin

x86-32: Unbreak booting on some 486 clones

There appear to have been some 486 clones, including the "enhanced"
version of Am486, which have CPUID but not CR4.  These 486 clones had
only the FPU flag, if any, unlike the Intel 486s with CPUID, which
also had VME and therefore needed CR4.

Therefore, look at the basic CPUID flags and require at least one bit
other than bit 0 before we modify CR4.

Thanks to Christian Ludloff of sandpile.org for confirming this as a
problem.
Signed-off-by: default avatarH. Peter Anvin <hpa@linux.intel.com>
parent cb7cb286
...@@ -292,8 +292,8 @@ default_entry: ...@@ -292,8 +292,8 @@ default_entry:
* be using the global pages. * be using the global pages.
* *
* NOTE! If we are on a 486 we may have no cr4 at all! * NOTE! If we are on a 486 we may have no cr4 at all!
* Specifically, cr4 exists if and only if CPUID exists, * Specifically, cr4 exists if and only if CPUID exists
* which in turn exists if and only if EFLAGS.ID exists. * and has flags other than the FPU flag set.
*/ */
movl $X86_EFLAGS_ID,%ecx movl $X86_EFLAGS_ID,%ecx
pushl %ecx pushl %ecx
...@@ -308,6 +308,11 @@ default_entry: ...@@ -308,6 +308,11 @@ default_entry:
testl %ecx,%eax testl %ecx,%eax
jz 6f # No ID flag = no CPUID = no CR4 jz 6f # No ID flag = no CPUID = no CR4
movl $1,%eax
cpuid
andl $~1,%edx # Ignore CPUID.FPU
jz 6f # No flags or only CPUID.FPU = no CR4
movl pa(mmu_cr4_features),%eax movl pa(mmu_cr4_features),%eax
movl %eax,%cr4 movl %eax,%cr4
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment