Commit a28680b4 authored by Alexander van Heukelum's avatar Alexander van Heukelum Committed by Ingo Molnar

x86, traps: split out math_error and simd_math_error

Split out math_error from do_coprocessor_error and simd_math_error
from do_simd_coprocessor_error, like on i386. While at it, add the
"error_code" parameter to do_coprocessor_error, do_simd_coprocessor_error
and do_spurious_interrupt_bug.

This does not change the generated code, but brings the declarations in
line with all the other trap handlers.
Signed-off-by: default avatarAlexander van Heukelum <heukelum@fastmail.fm>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 6fcbede3
...@@ -452,18 +452,12 @@ static int kernel_math_error(struct pt_regs *regs, const char *str, int trapnr) ...@@ -452,18 +452,12 @@ static int kernel_math_error(struct pt_regs *regs, const char *str, int trapnr)
* the correct behaviour even in the presence of the asynchronous * the correct behaviour even in the presence of the asynchronous
* IRQ13 behaviour * IRQ13 behaviour
*/ */
asmlinkage void do_coprocessor_error(struct pt_regs *regs) void math_error(void __user *ip)
{ {
void __user *ip = (void __user *)(regs->ip);
struct task_struct *task; struct task_struct *task;
siginfo_t info; siginfo_t info;
unsigned short cwd, swd; unsigned short cwd, swd;
conditional_sti(regs);
if (!user_mode(regs) &&
kernel_math_error(regs, "kernel x87 math error", 16))
return;
/* /*
* Save the info for the exception handler and clear the error. * Save the info for the exception handler and clear the error.
*/ */
...@@ -516,23 +510,26 @@ asmlinkage void do_coprocessor_error(struct pt_regs *regs) ...@@ -516,23 +510,26 @@ asmlinkage void do_coprocessor_error(struct pt_regs *regs)
force_sig_info(SIGFPE, &info, task); force_sig_info(SIGFPE, &info, task);
} }
asmlinkage void do_coprocessor_error(struct pt_regs *regs, long error_code)
{
conditional_sti(regs);
if (!user_mode(regs) &&
kernel_math_error(regs, "kernel x87 math error", 16))
return;
math_error((void __user *)regs->ip);
}
asmlinkage void bad_intr(void) asmlinkage void bad_intr(void)
{ {
printk("bad interrupt"); printk("bad interrupt");
} }
asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs) static void simd_math_error(void __user *ip)
{ {
void __user *ip = (void __user *)(regs->ip);
struct task_struct *task; struct task_struct *task;
siginfo_t info; siginfo_t info;
unsigned short mxcsr; unsigned short mxcsr;
conditional_sti(regs);
if (!user_mode(regs) &&
kernel_math_error(regs, "kernel simd math error", 19))
return;
/* /*
* Save the info for the exception handler and clear the error. * Save the info for the exception handler and clear the error.
*/ */
...@@ -575,7 +572,16 @@ asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs) ...@@ -575,7 +572,16 @@ asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs)
force_sig_info(SIGFPE, &info, task); force_sig_info(SIGFPE, &info, task);
} }
asmlinkage void do_spurious_interrupt_bug(struct pt_regs *regs) asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs, long error_code)
{
conditional_sti(regs);
if (!user_mode(regs) &&
kernel_math_error(regs, "kernel simd math error", 19))
return;
simd_math_error((void __user *)regs->ip);
}
asmlinkage void do_spurious_interrupt_bug(struct pt_regs *regs, long error_code)
{ {
} }
......
...@@ -72,9 +72,9 @@ asmlinkage void double_fault(void); ...@@ -72,9 +72,9 @@ asmlinkage void double_fault(void);
asmlinkage void do_int3(struct pt_regs *, long); asmlinkage void do_int3(struct pt_regs *, long);
asmlinkage void do_stack_segment(struct pt_regs *, long); asmlinkage void do_stack_segment(struct pt_regs *, long);
asmlinkage void do_debug(struct pt_regs *, unsigned long); asmlinkage void do_debug(struct pt_regs *, unsigned long);
asmlinkage void do_coprocessor_error(struct pt_regs *); asmlinkage void do_coprocessor_error(struct pt_regs *, long);
asmlinkage void do_simd_coprocessor_error(struct pt_regs *); asmlinkage void do_simd_coprocessor_error(struct pt_regs *, long);
asmlinkage void do_spurious_interrupt_bug(struct pt_regs *); asmlinkage void do_spurious_interrupt_bug(struct pt_regs *, long);
asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code); asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code);
......
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