Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -292,8 +292,8 @@ default_entry:
 *	be using the global pages. 
 *
 *	NOTE! If we are on a 486 we may have no cr4 at all!
 *	Specifically, cr4 exists if and only if CPUID exists,
 *	which in turn exists if and only if EFLAGS.ID exists.
 *	Specifically, cr4 exists if and only if CPUID exists
 *	and has flags other than the FPU flag set.
 */
	movl $X86_EFLAGS_ID,%ecx
	pushl %ecx
@@ -308,6 +308,11 @@ default_entry:
	testl %ecx,%eax
	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 %eax,%cr4