diff options
| -rw-r--r-- | arch/x86/kernel/cpu/proc.c | 7 | ||||
| -rw-r--r-- | arch/x86/kernel/irqinit.c | 40 | ||||
| -rw-r--r-- | arch/x86/kernel/traps.c | 6 |
3 files changed, 1 insertions, 52 deletions
diff --git a/arch/x86/kernel/cpu/proc.c b/arch/x86/kernel/cpu/proc.c index fbd895562292..3286a92e662a 100644 --- a/arch/x86/kernel/cpu/proc.c +++ b/arch/x86/kernel/cpu/proc.c | |||
| @@ -26,11 +26,6 @@ static void show_cpuinfo_core(struct seq_file *m, struct cpuinfo_x86 *c, | |||
| 26 | #ifdef CONFIG_X86_32 | 26 | #ifdef CONFIG_X86_32 |
| 27 | static void show_cpuinfo_misc(struct seq_file *m, struct cpuinfo_x86 *c) | 27 | static void show_cpuinfo_misc(struct seq_file *m, struct cpuinfo_x86 *c) |
| 28 | { | 28 | { |
| 29 | /* | ||
| 30 | * We use exception 16 if we have hardware math and we've either seen | ||
| 31 | * it or the CPU claims it is internal | ||
| 32 | */ | ||
| 33 | int fpu_exception = c->hard_math && (ignore_fpu_irq || cpu_has_fpu); | ||
| 34 | seq_printf(m, | 29 | seq_printf(m, |
| 35 | "fdiv_bug\t: %s\n" | 30 | "fdiv_bug\t: %s\n" |
| 36 | "hlt_bug\t\t: %s\n" | 31 | "hlt_bug\t\t: %s\n" |
| @@ -45,7 +40,7 @@ static void show_cpuinfo_misc(struct seq_file *m, struct cpuinfo_x86 *c) | |||
| 45 | c->f00f_bug ? "yes" : "no", | 40 | c->f00f_bug ? "yes" : "no", |
| 46 | c->coma_bug ? "yes" : "no", | 41 | c->coma_bug ? "yes" : "no", |
| 47 | c->hard_math ? "yes" : "no", | 42 | c->hard_math ? "yes" : "no", |
| 48 | fpu_exception ? "yes" : "no", | 43 | c->hard_math ? "yes" : "no", |
| 49 | c->cpuid_level, | 44 | c->cpuid_level, |
| 50 | c->wp_works_ok ? "yes" : "no"); | 45 | c->wp_works_ok ? "yes" : "no"); |
| 51 | } | 46 | } |
diff --git a/arch/x86/kernel/irqinit.c b/arch/x86/kernel/irqinit.c index 6e03b0d69138..7dc4e459c2b3 100644 --- a/arch/x86/kernel/irqinit.c +++ b/arch/x86/kernel/irqinit.c | |||
| @@ -42,39 +42,6 @@ | |||
| 42 | * (these are usually mapped into the 0x30-0xff vector range) | 42 | * (these are usually mapped into the 0x30-0xff vector range) |
| 43 | */ | 43 | */ |
| 44 | 44 | ||
| 45 | #ifdef CONFIG_X86_32 | ||
| 46 | /* | ||
| 47 | * Note that on a 486, we don't want to do a SIGFPE on an irq13 | ||
| 48 | * as the irq is unreliable, and exception 16 works correctly | ||
| 49 | * (ie as explained in the intel literature). On a 386, you | ||
| 50 | * can't use exception 16 due to bad IBM design, so we have to | ||
| 51 | * rely on the less exact irq13. | ||
| 52 | * | ||
| 53 | * Careful.. Not only is IRQ13 unreliable, but it is also | ||
| 54 | * leads to races. IBM designers who came up with it should | ||
| 55 | * be shot. | ||
| 56 | */ | ||
| 57 | |||
| 58 | static irqreturn_t math_error_irq(int cpl, void *dev_id) | ||
| 59 | { | ||
| 60 | outb(0, 0xF0); | ||
| 61 | if (ignore_fpu_irq || !boot_cpu_data.hard_math) | ||
| 62 | return IRQ_NONE; | ||
| 63 | math_error(get_irq_regs(), 0, X86_TRAP_MF); | ||
| 64 | return IRQ_HANDLED; | ||
| 65 | } | ||
| 66 | |||
| 67 | /* | ||
| 68 | * New motherboards sometimes make IRQ 13 be a PCI interrupt, | ||
| 69 | * so allow interrupt sharing. | ||
| 70 | */ | ||
| 71 | static struct irqaction fpu_irq = { | ||
| 72 | .handler = math_error_irq, | ||
| 73 | .name = "fpu", | ||
| 74 | .flags = IRQF_NO_THREAD, | ||
| 75 | }; | ||
| 76 | #endif | ||
| 77 | |||
| 78 | /* | 45 | /* |
| 79 | * IRQ2 is cascade interrupt to second interrupt controller | 46 | * IRQ2 is cascade interrupt to second interrupt controller |
| 80 | */ | 47 | */ |
| @@ -242,13 +209,6 @@ void __init native_init_IRQ(void) | |||
| 242 | setup_irq(2, &irq2); | 209 | setup_irq(2, &irq2); |
| 243 | 210 | ||
| 244 | #ifdef CONFIG_X86_32 | 211 | #ifdef CONFIG_X86_32 |
| 245 | /* | ||
| 246 | * External FPU? Set up irq13 if so, for | ||
| 247 | * original braindamaged IBM FERR coupling. | ||
| 248 | */ | ||
| 249 | if (boot_cpu_data.hard_math && !cpu_has_fpu) | ||
| 250 | setup_irq(FPU_IRQ, &fpu_irq); | ||
| 251 | |||
| 252 | irq_ctx_init(smp_processor_id()); | 212 | irq_ctx_init(smp_processor_id()); |
| 253 | #endif | 213 | #endif |
| 254 | } | 214 | } |
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 8276dc6794cc..4e1478c12344 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
| @@ -69,9 +69,6 @@ | |||
| 69 | 69 | ||
| 70 | asmlinkage int system_call(void); | 70 | asmlinkage int system_call(void); |
| 71 | 71 | ||
| 72 | /* Do we ignore FPU interrupts ? */ | ||
| 73 | char ignore_fpu_irq; | ||
| 74 | |||
| 75 | /* | 72 | /* |
| 76 | * The IDT has to be page-aligned to simplify the Pentium | 73 | * The IDT has to be page-aligned to simplify the Pentium |
| 77 | * F0 0F bug workaround. | 74 | * F0 0F bug workaround. |
| @@ -564,9 +561,6 @@ void math_error(struct pt_regs *regs, int error_code, int trapnr) | |||
| 564 | 561 | ||
| 565 | dotraplinkage void do_coprocessor_error(struct pt_regs *regs, long error_code) | 562 | dotraplinkage void do_coprocessor_error(struct pt_regs *regs, long error_code) |
| 566 | { | 563 | { |
| 567 | #ifdef CONFIG_X86_32 | ||
| 568 | ignore_fpu_irq = 1; | ||
| 569 | #endif | ||
| 570 | exception_enter(regs); | 564 | exception_enter(regs); |
| 571 | math_error(regs, error_code, X86_TRAP_MF); | 565 | math_error(regs, error_code, X86_TRAP_MF); |
| 572 | exception_exit(regs); | 566 | exception_exit(regs); |
