|
@@ -189,7 +189,7 @@ int fixup_bug(struct pt_regs *regs, int trapnr)
|
|
|
}
|
|
|
|
|
|
static nokprobe_inline int
|
|
|
-do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str,
|
|
|
+do_trap_no_signal(struct task_struct *tsk, int trapnr, const char *str,
|
|
|
struct pt_regs *regs, long error_code)
|
|
|
{
|
|
|
if (v8086_mode(regs)) {
|
|
@@ -202,10 +202,7 @@ do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str,
|
|
|
error_code, trapnr))
|
|
|
return 0;
|
|
|
}
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- if (!user_mode(regs)) {
|
|
|
+ } else if (!user_mode(regs)) {
|
|
|
if (fixup_exception(regs, trapnr))
|
|
|
return 0;
|
|
|
|
|
@@ -214,6 +211,18 @@ do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str,
|
|
|
die(str, regs, error_code);
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * We want error_code and trap_nr 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_nr = trapnr;
|
|
|
+
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
@@ -271,17 +280,6 @@ do_trap(int trapnr, int signr, char *str, struct pt_regs *regs,
|
|
|
|
|
|
if (!do_trap_no_signal(tsk, trapnr, str, regs, error_code))
|
|
|
return;
|
|
|
- /*
|
|
|
- * We want error_code and trap_nr 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_nr = trapnr;
|
|
|
|
|
|
show_signal(tsk, signr, "trap ", str, regs, error_code);
|
|
|
|