diff options
Diffstat (limited to 'arch/x86/kernel/traps.c')
-rw-r--r-- | arch/x86/kernel/traps.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 98c2d055284b..7932338d7cb3 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
@@ -896,7 +896,7 @@ asmlinkage void math_state_restore(void) | |||
896 | EXPORT_SYMBOL_GPL(math_state_restore); | 896 | EXPORT_SYMBOL_GPL(math_state_restore); |
897 | 897 | ||
898 | #ifndef CONFIG_MATH_EMULATION | 898 | #ifndef CONFIG_MATH_EMULATION |
899 | asmlinkage void math_emulate(long arg) | 899 | void math_emulate(struct math_emu_info *info) |
900 | { | 900 | { |
901 | printk(KERN_EMERG | 901 | printk(KERN_EMERG |
902 | "math-emulation not enabled and no coprocessor found.\n"); | 902 | "math-emulation not enabled and no coprocessor found.\n"); |
@@ -906,16 +906,19 @@ asmlinkage void math_emulate(long arg) | |||
906 | } | 906 | } |
907 | #endif /* CONFIG_MATH_EMULATION */ | 907 | #endif /* CONFIG_MATH_EMULATION */ |
908 | 908 | ||
909 | dotraplinkage void __kprobes | 909 | dotraplinkage void __kprobes do_device_not_available(struct pt_regs regs) |
910 | do_device_not_available(struct pt_regs *regs, long error) | ||
911 | { | 910 | { |
912 | #ifdef CONFIG_X86_32 | 911 | #ifdef CONFIG_X86_32 |
913 | if (read_cr0() & X86_CR0_EM) { | 912 | if (read_cr0() & X86_CR0_EM) { |
914 | conditional_sti(regs); | 913 | struct math_emu_info info = { }; |
915 | math_emulate(0); | 914 | |
915 | conditional_sti(®s); | ||
916 | |||
917 | info.regs = ®s; | ||
918 | math_emulate(&info); | ||
916 | } else { | 919 | } else { |
917 | math_state_restore(); /* interrupts still off */ | 920 | math_state_restore(); /* interrupts still off */ |
918 | conditional_sti(regs); | 921 | conditional_sti(®s); |
919 | } | 922 | } |
920 | #else | 923 | #else |
921 | math_state_restore(); | 924 | math_state_restore(); |