[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <464EE2AA.3030607@cv-sv.de>
Date: Sat, 19 May 2007 13:42:34 +0200
From: Christian Volkmann <haveaniceday@...sv.de>
To: Andi Kleen <ak@...e.de>
CC: Dave Jones <davej@...hat.com>, linux-kernel@...r.kernel.org
Subject: Re: 2.6.22-rc1 does not boot on VIA C3_2 cause of X86_CMPXCHG64 II
Andi Kleen wrote:
> Can someone please test if this patch works?
>
> This preserves the 6 <= model <= 9 logic of the C code; this means
> if VIA ever brings out model >= 10 it hopefully sets this bit by default.
> Dave, do you have any information to the contrary?
>
> -Andi
>
Hi Andi,
your patch did not work. See the correction below. The mask should contain 1<<1
instead of 1.
Model 10 is now also included.
I add also a patch for setup.S. It does not print the CPUID message in case
the CPUID is wrong, cause %ds was not set proper.
Best regards,
Christian
Index: linux/arch/i386/kernel/verify_cpu.S
===================================================================
--- linux.orig/arch/i386/kernel/verify_cpu.S
+++ linux/arch/i386/kernel/verify_cpu.S
@@ -2,6 +2,7 @@
This runs in 16bit mode so that the caller can still use the BIOS
to output errors on the screen */
#include <asm/cpufeature.h>
+#include <asm/msr.h>
verify_cpu:
pushfl # Save caller passed flags
@@ -45,6 +46,28 @@
cmpl $0x1,%eax
jb bad # no cpuid 1
+#if REQUIRED_MASK1 & 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
+ shr $4,%eax
+ andl $0xf,%eax # get model
+ cmpl $6,%eax
+ jb 1f
+ cmpl $10,%eax # newer vias hopefully don't require
+ ja 1f # this anymore
+ 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
Index: linux/arch/i386/boot/verify_cpu.S
===================================================================
--- linux.orig/arch/i386/boot/setup.S
+++ linux/arch/i386/boot/setup.S
@@ -310,12 +310,15 @@
call verify_cpu
testl %eax,%eax
jz cpu_ok
+ # missed before: set ds
+ pushw %cs # CPU too old or CPUID function bits are wrong.
+ popw %ds # die.
lea cpu_panic_mess,%si
call prtstr
1: jmp 1b
cpu_panic_mess:
- .asciz "PANIC: CPU too old for this kernel."
+ .asciz "PANIC: CPU too old for this kernel or CPUID function bits are wrong."
#include "../kernel/verify_cpu.S"
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists