Skip to content

Commit

Permalink
arm64: Introduce arm64_force_sig_info and hook up in arm64_notify_die
Browse files Browse the repository at this point in the history
In preparation for consolidating our handling of printing unhandled
signals, introduce a wrapper around force_sig_info which can act as
the canonical place for dealing with show_unhandled_signals.

Initially, we just hook this up to arm64_notify_die.

Signed-off-by: Will Deacon <will.deacon@arm.com>
  • Loading branch information
Will Deacon committed Mar 6, 2018
1 parent a7e6f1c commit a1ece82
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 1 deletion.
2 changes: 2 additions & 0 deletions arch/arm64/include/asm/traps.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ void register_undef_hook(struct undef_hook *hook);
void unregister_undef_hook(struct undef_hook *hook);
void force_signal_inject(int signal, int code, unsigned long address);
void arm64_notify_segfault(unsigned long addr);
void arm64_force_sig_info(struct siginfo *info, const char *str,
struct task_struct *tsk);

/*
* Move regs->pc to next instruction and do necessary setup before it
Expand Down
28 changes: 27 additions & 1 deletion arch/arm64/kernel/traps.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,13 +223,39 @@ void die(const char *str, struct pt_regs *regs, int err)
do_exit(SIGSEGV);
}

void arm64_force_sig_info(struct siginfo *info, const char *str,
struct task_struct *tsk)
{
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;

pr_info("%s[%d]: unhandled exception: ", tsk->comm, task_pid_nr(tsk));
if (esr)
pr_cont("%s, ESR 0x%08x, ", esr_get_class_string(esr), esr);

pr_cont("%s", 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_notify_die(const char *str, struct pt_regs *regs,
struct siginfo *info, int err)
{
if (user_mode(regs)) {
WARN_ON(regs != current_pt_regs());
current->thread.fault_address = 0;
current->thread.fault_code = err;
force_sig_info(info->si_signo, info, current);
arm64_force_sig_info(info, str, current);
} else {
die(str, regs, err);
}
Expand Down

0 comments on commit a1ece82

Please sign in to comment.