Skip to content

Commit

Permalink
[PATCH] x86_64: ignore machine checks from boot time
Browse files Browse the repository at this point in the history
Don't log machine check events left over from boot.  Too many BIOSes 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>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Andi Kleen authored and Linus Torvalds committed Aug 7, 2005
1 parent cf7bee5 commit d5172f2
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 4 deletions.
5 changes: 5 additions & 0 deletions Documentation/x86_64/boot-options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ only the AMD64 specific ones are listed here.
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

Expand Down
16 changes: 12 additions & 4 deletions arch/x86_64/kernel/mce.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ static unsigned long bank[NR_BANKS] = { [0 ... NR_BANKS-1] = ~0UL };
static unsigned long console_logged;
static int notify_user;
static int rip_msr;
static int mce_bootlog;

/*
* Lockless MCE logging infrastructure.
Expand Down Expand Up @@ -197,10 +198,11 @@ void do_machine_check(struct pt_regs * regs, long error_code)
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,
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -476,11 +478,17 @@ static int __init mcheck_disable(char *str)
}

/* 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;
Expand Down

0 comments on commit d5172f2

Please sign in to comment.