From: Andi Kleen <ak@muc.de>

Don't log machine check events left over from boot.

Too many BIOS leave bogus events in there.

This unfortunately also makes it impossible to log events that caused a
reboot.  For people with non broken BIOS there is mce=bootlog

Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 Documentation/x86_64/boot-options.txt |    5 +++++
 arch/x86_64/kernel/mce.c              |   16 ++++++++++++----
 2 files changed, 17 insertions(+), 4 deletions(-)

diff -puN arch/x86_64/kernel/mce.c~x86_64-ignore-machine-checks-from-boot-time arch/x86_64/kernel/mce.c
--- devel/arch/x86_64/kernel/mce.c~x86_64-ignore-machine-checks-from-boot-time	2005-08-05 13:21:58.000000000 -0700
+++ devel-akpm/arch/x86_64/kernel/mce.c	2005-08-05 13:21:58.000000000 -0700
@@ -36,6 +36,7 @@ static unsigned long bank[NR_BANKS] = { 
 static unsigned long console_logged;
 static int notify_user;
 static int rip_msr;
+static int mce_bootlog;
 
 /*
  * Lockless MCE logging infrastructure.
@@ -197,10 +198,11 @@ void do_machine_check(struct pt_regs * r
 			rdmsrl(MSR_IA32_MC0_ADDR + i*4, m.addr);
 
 		mce_get_rip(&m, regs);
-		if (error_code != -1)
+		if (error_code >= 0)
 			rdtscll(m.tsc);
 		wrmsrl(MSR_IA32_MC0_STATUS + i*4, 0);
-		mce_log(&m);
+		if (error_code != -2)
+			mce_log(&m);
 
 		/* Did this bank cause the exception? */
 		/* Assume that the bank with uncorrectable errors did it,
@@ -315,7 +317,7 @@ static void mce_init(void *dummy)
 
 	/* Log the machine checks left over from the previous reset.
 	   This also clears all registers */
-	do_machine_check(NULL, -1);
+	do_machine_check(NULL, mce_bootlog ? -1 : -2);
 
 	set_in_cr4(X86_CR4_MCE);
 
@@ -476,11 +478,17 @@ static int __init mcheck_disable(char *s
 }
 
 /* mce=off disables machine check. Note you can reenable it later
-   using sysfs */
+   using sysfs.
+   mce=bootlog Log MCEs from before booting. Disabled by default to work
+   around buggy BIOS that leave bogus MCEs.  */
 static int __init mcheck_enable(char *str)
 {
+	if (*str == '=')
+		str++;
 	if (!strcmp(str, "off"))
 		mce_dont_init = 1;
+	else if (!strcmp(str, "bootlog"))
+		mce_bootlog = 1;
 	else
 		printk("mce= argument %s ignored. Please use /sys", str); 
 	return 0;
diff -puN Documentation/x86_64/boot-options.txt~x86_64-ignore-machine-checks-from-boot-time Documentation/x86_64/boot-options.txt
--- devel/Documentation/x86_64/boot-options.txt~x86_64-ignore-machine-checks-from-boot-time	2005-08-05 13:21:58.000000000 -0700
+++ devel-akpm/Documentation/x86_64/boot-options.txt	2005-08-05 13:21:58.000000000 -0700
@@ -6,6 +6,11 @@ only the AMD64 specific ones are listed 
 Machine check
 
    mce=off disable machine check
+   mce=bootlog Enable logging of machine checks left over from booting.
+               Disabled by default because some BIOS leave bogus ones.
+               If your BIOS doesn't do that it's a good idea to enable though
+               to make sure you log even machine check events that result
+               in a reboot.
 
    nomce (for compatibility with i386): same as mce=off
 
_