Commit 5d727926 authored by Andi Kleen's avatar Andi Kleen Committed by H. Peter Anvin

x86, mce: use a call vector to call the 64bit mce handler

Allows to call different machine check handlers from the low
level machine check entry vector.

This is needed for later when it will be used for 32bit too.
Signed-off-by: default avatarAndi Kleen <ak@linux.intel.com>
Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
Signed-off-by: default avatarHidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
parent 2e6f694f
...@@ -39,6 +39,16 @@ ...@@ -39,6 +39,16 @@
#include "mce.h" #include "mce.h"
/* Handle unconfigured int18 (should never happen) */
static void unexpected_machine_check(struct pt_regs *regs, long error_code)
{
printk(KERN_ERR "CPU#%d: Unexpected int18 (Machine Check).\n",
smp_processor_id());
}
/* Call the installed machine check handler for this CPU setup. */
void (*machine_check_vector)(struct pt_regs *, long error_code) =
unexpected_machine_check;
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
#define MISC_MCELOG_MINOR 227 #define MISC_MCELOG_MINOR 227
...@@ -715,6 +725,8 @@ void __cpuinit mcheck_init(struct cpuinfo_x86 *c) ...@@ -715,6 +725,8 @@ void __cpuinit mcheck_init(struct cpuinfo_x86 *c)
} }
mce_cpu_quirks(c); mce_cpu_quirks(c);
machine_check_vector = do_machine_check;
mce_init(NULL); mce_init(NULL);
mce_cpu_features(c); mce_cpu_features(c);
mce_init_timer(); mce_init_timer();
...@@ -1285,17 +1297,6 @@ int mce_disabled; ...@@ -1285,17 +1297,6 @@ int mce_disabled;
int nr_mce_banks; int nr_mce_banks;
EXPORT_SYMBOL_GPL(nr_mce_banks); /* non-fatal.o */ EXPORT_SYMBOL_GPL(nr_mce_banks); /* non-fatal.o */
/* Handle unconfigured int18 (should never happen) */
static void unexpected_machine_check(struct pt_regs *regs, long error_code)
{
printk(KERN_ERR "CPU#%d: Unexpected int18 (Machine Check).\n",
smp_processor_id());
}
/* Call the installed machine check handler for this CPU setup. */
void (*machine_check_vector)(struct pt_regs *, long error_code) =
unexpected_machine_check;
/* This has to be run for each processor */ /* This has to be run for each processor */
void mcheck_init(struct cpuinfo_x86 *c) void mcheck_init(struct cpuinfo_x86 *c)
{ {
......
...@@ -7,11 +7,12 @@ void intel_p5_mcheck_init(struct cpuinfo_x86 *c); ...@@ -7,11 +7,12 @@ void intel_p5_mcheck_init(struct cpuinfo_x86 *c);
void intel_p6_mcheck_init(struct cpuinfo_x86 *c); void intel_p6_mcheck_init(struct cpuinfo_x86 *c);
void winchip_mcheck_init(struct cpuinfo_x86 *c); void winchip_mcheck_init(struct cpuinfo_x86 *c);
#ifdef CONFIG_X86_32
/* Call the installed machine check handler for this CPU setup. */ /* Call the installed machine check handler for this CPU setup. */
extern void (*machine_check_vector)(struct pt_regs *, long error_code); extern void (*machine_check_vector)(struct pt_regs *, long error_code);
#ifdef CONFIG_X86_32
extern int nr_mce_banks; extern int nr_mce_banks;
void intel_set_thermal_handler(void); void intel_set_thermal_handler(void);
......
...@@ -1382,7 +1382,7 @@ paranoiderrorentry stack_segment do_stack_segment ...@@ -1382,7 +1382,7 @@ paranoiderrorentry stack_segment do_stack_segment
errorentry general_protection do_general_protection errorentry general_protection do_general_protection
errorentry page_fault do_page_fault errorentry page_fault do_page_fault
#ifdef CONFIG_X86_MCE #ifdef CONFIG_X86_MCE
paranoidzeroentry machine_check do_machine_check paranoidzeroentry machine_check *machine_check_vector(%rip)
#endif #endif
/* /*
......
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