|
@@ -224,24 +224,19 @@ void die(const char *str, struct pt_regs *regs, int err)
|
|
|
do_exit(SIGSEGV);
|
|
|
}
|
|
|
|
|
|
-static bool show_unhandled_signals_ratelimited(void)
|
|
|
+static void arm64_show_signal(int signo, const char *str)
|
|
|
{
|
|
|
static DEFINE_RATELIMIT_STATE(rs, DEFAULT_RATELIMIT_INTERVAL,
|
|
|
DEFAULT_RATELIMIT_BURST);
|
|
|
- return show_unhandled_signals && __ratelimit(&rs);
|
|
|
-}
|
|
|
-
|
|
|
-void arm64_force_sig_info(struct siginfo *info, const char *str)
|
|
|
-{
|
|
|
struct task_struct *tsk = current;
|
|
|
unsigned int esr = tsk->thread.fault_code;
|
|
|
struct pt_regs *regs = task_pt_regs(tsk);
|
|
|
|
|
|
- if (!unhandled_signal(tsk, info->si_signo))
|
|
|
- goto send_sig;
|
|
|
-
|
|
|
- if (!show_unhandled_signals_ratelimited())
|
|
|
- goto send_sig;
|
|
|
+ /* Leave if the signal won't be shown */
|
|
|
+ if (!show_unhandled_signals ||
|
|
|
+ !unhandled_signal(tsk, signo) ||
|
|
|
+ !__ratelimit(&rs))
|
|
|
+ return;
|
|
|
|
|
|
pr_info("%s[%d]: unhandled exception: ", tsk->comm, task_pid_nr(tsk));
|
|
|
if (esr)
|
|
@@ -251,9 +246,12 @@ void arm64_force_sig_info(struct siginfo *info, const char *str)
|
|
|
print_vma_addr(KERN_CONT " in ", regs->pc);
|
|
|
pr_cont("\n");
|
|
|
__show_regs(regs);
|
|
|
+}
|
|
|
|
|
|
-send_sig:
|
|
|
- force_sig_info(info->si_signo, info, tsk);
|
|
|
+void arm64_force_sig_info(struct siginfo *info, const char *str)
|
|
|
+{
|
|
|
+ arm64_show_signal(info->si_signo, str);
|
|
|
+ force_sig_info(info->si_signo, info, current);
|
|
|
}
|
|
|
|
|
|
void arm64_notify_die(const char *str, struct pt_regs *regs,
|