#define trace_async_page_fault async_page_fault
#endif
-dotraplinkage void do_divide_error(struct pt_regs *, long);
-dotraplinkage void do_debug(struct pt_regs *, long);
-dotraplinkage void do_nmi(struct pt_regs *, long);
-dotraplinkage void do_int3(struct pt_regs *, long);
-dotraplinkage void do_overflow(struct pt_regs *, long);
-dotraplinkage void do_bounds(struct pt_regs *, long);
-dotraplinkage void do_invalid_op(struct pt_regs *, long);
-dotraplinkage void do_device_not_available(struct pt_regs *, long);
-dotraplinkage void do_coprocessor_segment_overrun(struct pt_regs *, long);
-dotraplinkage void do_invalid_TSS(struct pt_regs *, long);
-dotraplinkage void do_segment_not_present(struct pt_regs *, long);
-dotraplinkage void do_stack_segment(struct pt_regs *, long);
+dotraplinkage int do_divide_error(struct pt_regs *, long);
+dotraplinkage int do_debug(struct pt_regs *, long);
+dotraplinkage int do_nmi(struct pt_regs *, long);
+dotraplinkage int do_int3(struct pt_regs *, long);
+dotraplinkage int do_overflow(struct pt_regs *, long);
+dotraplinkage int do_bounds(struct pt_regs *, long);
+dotraplinkage int do_invalid_op(struct pt_regs *, long);
+dotraplinkage int do_device_not_available(struct pt_regs *, long);
+dotraplinkage int do_coprocessor_segment_overrun(struct pt_regs *, long);
+dotraplinkage int do_invalid_TSS(struct pt_regs *, long);
+dotraplinkage int do_segment_not_present(struct pt_regs *, long);
+dotraplinkage int do_stack_segment(struct pt_regs *, long);
#ifdef CONFIG_X86_64
-dotraplinkage void do_double_fault(struct pt_regs *, long);
+dotraplinkage int do_double_fault(struct pt_regs *, long);
asmlinkage struct pt_regs *sync_regs(struct pt_regs *);
#endif
-dotraplinkage void do_general_protection(struct pt_regs *, long);
-dotraplinkage void do_page_fault(struct pt_regs *, unsigned long);
+dotraplinkage int do_general_protection(struct pt_regs *, long);
+dotraplinkage int do_page_fault(struct pt_regs *, unsigned long);
#ifdef CONFIG_TRACING
-dotraplinkage void trace_do_page_fault(struct pt_regs *, unsigned long);
+dotraplinkage int trace_do_page_fault(struct pt_regs *, unsigned long);
#else
-static inline void trace_do_page_fault(struct pt_regs *regs, unsigned long error)
+static inline int trace_do_page_fault(struct pt_regs *regs, unsigned long error)
{
- do_page_fault(regs, error);
+ return do_page_fault(regs, error);
}
#endif
-dotraplinkage void do_spurious_interrupt_bug(struct pt_regs *, long);
-dotraplinkage void do_coprocessor_error(struct pt_regs *, long);
-dotraplinkage void do_alignment_check(struct pt_regs *, long);
+dotraplinkage int do_spurious_interrupt_bug(struct pt_regs *, long);
+dotraplinkage int do_coprocessor_error(struct pt_regs *, long);
+dotraplinkage int do_alignment_check(struct pt_regs *, long);
#ifdef CONFIG_X86_MCE
-dotraplinkage void do_machine_check(struct pt_regs *, long);
+dotraplinkage int do_machine_check(struct pt_regs *, long);
#endif
-dotraplinkage void do_simd_coprocessor_error(struct pt_regs *, long);
+dotraplinkage int do_simd_coprocessor_error(struct pt_regs *, long);
#ifdef CONFIG_X86_32
-dotraplinkage void do_iret_error(struct pt_regs *, long);
+dotraplinkage int do_iret_error(struct pt_regs *, long);
#endif
static inline int get_si_code(unsigned long condition)
}
NOKPROBE_SYMBOL(do_trap);
-static void do_error_trap(struct pt_regs *regs, long error_code, char *str,
+static int do_error_trap(struct pt_regs *regs, long error_code, char *str,
unsigned long trapnr, int signr)
{
enum ctx_state prev_state = exception_enter();
siginfo_t info;
+ int ret;
- if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) !=
- NOTIFY_STOP) {
+ ret = notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr);
+ if ((ret & NOTIFY_STOP_MASK) != NOTIFY_STOP_MASK) {
conditional_sti(regs);
do_trap(trapnr, signr, str, regs, error_code,
fill_trap_info(regs, signr, trapnr, &info));
}
exception_exit(prev_state);
+ return notifier_to_errno(ret);
}
#define DO_ERROR(trapnr, signr, str, name) \
-dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \
+dotraplinkage int do_##name(struct pt_regs *regs, long error_code) \
{ \
- do_error_trap(regs, error_code, str, trapnr, signr); \
+ return do_error_trap(regs, error_code, str, trapnr, signr); \
}
DO_ERROR(X86_TRAP_DE, SIGFPE, "divide error", divide_error)
#ifdef CONFIG_X86_64
/* Runs on IST stack */
-dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code)
+dotraplinkage int do_double_fault(struct pt_regs *regs, long error_code)
{
static const char str[] = "double fault";
struct task_struct *tsk = current;
regs->ip = (unsigned long)general_protection;
regs->sp = (unsigned long)&normal_regs->orig_ax;
- return;
+ return 0;
}
#endif
*/
for (;;)
die(str, regs, error_code);
+
+ return 0;
}
#endif
-dotraplinkage void do_bounds(struct pt_regs *regs, long error_code)
+dotraplinkage int do_bounds(struct pt_regs *regs, long error_code)
{
struct task_struct *tsk = current;
struct xsave_struct *xsave_buf;
exit:
exception_exit(prev_state);
- return;
+ return 0;
exit_trap:
/*
* This path out is for all the cases where we could not
*/
do_trap(X86_TRAP_BR, SIGSEGV, "bounds", regs, error_code, NULL);
exception_exit(prev_state);
+ return 0;
}
-dotraplinkage void
+dotraplinkage int
do_general_protection(struct pt_regs *regs, long error_code)
{
struct task_struct *tsk;
enum ctx_state prev_state;
+ int ret = 0;
prev_state = exception_enter();
conditional_sti(regs);
tsk->thread.error_code = error_code;
tsk->thread.trap_nr = X86_TRAP_GP;
- if (notify_die(DIE_GPF, "general protection fault", regs, error_code,
- X86_TRAP_GP, SIGSEGV) != NOTIFY_STOP)
+ ret = notify_die(DIE_GPF, "general protection fault", regs,
+ error_code, X86_TRAP_GP, SIGSEGV);
+ if ((ret & NOTIFY_STOP_MASK) != NOTIFY_STOP_MASK)
die("general protection fault", regs, error_code);
goto exit;
}
force_sig_info(SIGSEGV, SEND_SIG_PRIV, tsk);
exit:
exception_exit(prev_state);
+ return notifier_to_errno(ret);
}
NOKPROBE_SYMBOL(do_general_protection);
/* May run on IST stack. */
-dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code)
+dotraplinkage int notrace do_int3(struct pt_regs *regs, long error_code)
{
enum ctx_state prev_state;
+ int ret = 0;
#ifdef CONFIG_DYNAMIC_FTRACE
/*
*/
if (unlikely(atomic_read(&modifying_ftrace_code)) &&
ftrace_int3_handler(regs))
- return;
+ return 0;
#endif
if (poke_int3_handler(regs))
- return;
+ return 0;
prev_state = ist_enter(regs);
#ifdef CONFIG_KGDB_LOW_LEVEL_TRAP
goto exit;
#endif
- if (notify_die(DIE_INT3, "int3", regs, error_code, X86_TRAP_BP,
- SIGTRAP) == NOTIFY_STOP)
+ ret = notify_die(DIE_INT3, "int3", regs, error_code, X86_TRAP_BP,
+ SIGTRAP);
+ if ((ret & NOTIFY_STOP_MASK) == NOTIFY_STOP_MASK) {
+ ret = notifier_to_errno(ret);
goto exit;
+ }
/*
* Let others (NMI) know that the debug stack is in use
debug_stack_usage_dec();
exit:
ist_exit(regs, prev_state);
+ return ret;
}
NOKPROBE_SYMBOL(do_int3);
*
* May run on IST stack.
*/
-dotraplinkage void do_debug(struct pt_regs *regs, long error_code)
+dotraplinkage int do_debug(struct pt_regs *regs, long error_code)
{
struct task_struct *tsk = current;
enum ctx_state prev_state;
exit:
ist_exit(regs, prev_state);
+ return 0;
}
NOKPROBE_SYMBOL(do_debug);
force_sig_info(SIGFPE, &info, task);
}
-dotraplinkage void do_coprocessor_error(struct pt_regs *regs, long error_code)
+dotraplinkage int do_coprocessor_error(struct pt_regs *regs, long error_code)
{
enum ctx_state prev_state;
prev_state = exception_enter();
math_error(regs, error_code, X86_TRAP_MF);
exception_exit(prev_state);
+ return 0;
}
-dotraplinkage void
+dotraplinkage int
do_simd_coprocessor_error(struct pt_regs *regs, long error_code)
{
enum ctx_state prev_state;
prev_state = exception_enter();
math_error(regs, error_code, X86_TRAP_XF);
exception_exit(prev_state);
+ return 0;
}
-dotraplinkage void
+dotraplinkage int
do_spurious_interrupt_bug(struct pt_regs *regs, long error_code)
{
conditional_sti(regs);
/* No need to warn about this any longer. */
pr_info("Ignoring P6 Local APIC Spurious Interrupt Bug...\n");
#endif
+ return 0;
}
asmlinkage __visible void __attribute__((weak)) smp_thermal_interrupt(void)
}
EXPORT_SYMBOL_GPL(math_state_restore);
-dotraplinkage void
+dotraplinkage int
do_device_not_available(struct pt_regs *regs, long error_code)
{
enum ctx_state prev_state;
info.regs = regs;
math_emulate(&info);
exception_exit(prev_state);
- return;
+ return 0;
}
#endif
math_state_restore(); /* interrupts still off */
conditional_sti(regs);
#endif
exception_exit(prev_state);
+ return 0;
}
NOKPROBE_SYMBOL(do_device_not_available);