|
@@ -630,38 +630,38 @@ do_trap(int trapnr, int signr, char *str, struct pt_regs *regs,
|
|
|
{
|
|
|
struct task_struct *tsk = current;
|
|
|
|
|
|
- if (user_mode(regs)) {
|
|
|
- /*
|
|
|
- * We want error_code and trap_no set for userspace
|
|
|
- * faults and kernelspace faults which result in
|
|
|
- * die(), but not kernelspace faults which are fixed
|
|
|
- * up. die() gives the process no chance to handle
|
|
|
- * the signal and notice the kernel fault information,
|
|
|
- * so that won't result in polluting the information
|
|
|
- * about previously queued, but not yet delivered,
|
|
|
- * faults. See also do_general_protection below.
|
|
|
- */
|
|
|
- tsk->thread.error_code = error_code;
|
|
|
- tsk->thread.trap_no = trapnr;
|
|
|
-
|
|
|
- if (show_unhandled_signals && unhandled_signal(tsk, signr) &&
|
|
|
- printk_ratelimit()) {
|
|
|
- printk(KERN_INFO
|
|
|
- "%s[%d] trap %s ip:%lx sp:%lx error:%lx",
|
|
|
- tsk->comm, tsk->pid, str,
|
|
|
- regs->ip, regs->sp, error_code);
|
|
|
- print_vma_addr(" in ", regs->ip);
|
|
|
- printk("\n");
|
|
|
- }
|
|
|
+ if (!user_mode(regs))
|
|
|
+ goto kernel_trap;
|
|
|
|
|
|
- if (info)
|
|
|
- force_sig_info(signr, info, tsk);
|
|
|
- else
|
|
|
- force_sig(signr, tsk);
|
|
|
- return;
|
|
|
+ /*
|
|
|
+ * We want error_code and trap_no set for userspace faults and
|
|
|
+ * kernelspace faults which result in die(), but not
|
|
|
+ * kernelspace faults which are fixed up. die() gives the
|
|
|
+ * process no chance to handle the signal and notice the
|
|
|
+ * kernel fault information, so that won't result in polluting
|
|
|
+ * the information about previously queued, but not yet
|
|
|
+ * delivered, faults. See also do_general_protection below.
|
|
|
+ */
|
|
|
+ tsk->thread.error_code = error_code;
|
|
|
+ tsk->thread.trap_no = trapnr;
|
|
|
+
|
|
|
+ if (show_unhandled_signals && unhandled_signal(tsk, signr) &&
|
|
|
+ printk_ratelimit()) {
|
|
|
+ printk(KERN_INFO
|
|
|
+ "%s[%d] trap %s ip:%lx sp:%lx error:%lx",
|
|
|
+ tsk->comm, tsk->pid, str,
|
|
|
+ regs->ip, regs->sp, error_code);
|
|
|
+ print_vma_addr(" in ", regs->ip);
|
|
|
+ printk("\n");
|
|
|
}
|
|
|
|
|
|
+ if (info)
|
|
|
+ force_sig_info(signr, info, tsk);
|
|
|
+ else
|
|
|
+ force_sig(signr, tsk);
|
|
|
+ return;
|
|
|
|
|
|
+kernel_trap:
|
|
|
if (!fixup_exception(regs)) {
|
|
|
tsk->thread.error_code = error_code;
|
|
|
tsk->thread.trap_no = trapnr;
|