aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2018-09-22 04:37:15 -0400
committerEric W. Biederman <ebiederm@xmission.com>2018-09-27 15:54:51 -0400
commitb4d5557caa07a01796ca8a2d756eeaa5308f6876 (patch)
tree37bd3a6073a48da0be4864bf298359e1a88f932a
parentfeca355b3d8eba3a2cbca63c97a59a14681983f7 (diff)
signal/arm64: Add and use arm64_force_sig_mceerr as appropriate
Add arm64_force_sig_mceerr for consistency with arm64_force_sig_fault, and use it in the one location that can take advantage of it. This removes the fiddly filling out of siginfo before sending a signal reporting an memory error to userspace. Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Tested-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
-rw-r--r--arch/arm64/include/asm/traps.h1
-rw-r--r--arch/arm64/kernel/traps.c7
-rw-r--r--arch/arm64/mm/fault.c9
3 files changed, 10 insertions, 7 deletions
diff --git a/arch/arm64/include/asm/traps.h b/arch/arm64/include/asm/traps.h
index 08e99901edbc..193f0b0e8ee3 100644
--- a/arch/arm64/include/asm/traps.h
+++ b/arch/arm64/include/asm/traps.h
@@ -38,6 +38,7 @@ void unregister_undef_hook(struct undef_hook *hook);
38void force_signal_inject(int signal, int code, unsigned long address); 38void force_signal_inject(int signal, int code, unsigned long address);
39void arm64_notify_segfault(unsigned long addr); 39void arm64_notify_segfault(unsigned long addr);
40void arm64_force_sig_fault(int signo, int code, void __user *addr, const char *str); 40void arm64_force_sig_fault(int signo, int code, void __user *addr, const char *str);
41void arm64_force_sig_mceerr(int code, void __user *addr, short lsb, const char *str);
41void arm64_force_sig_info(struct siginfo *info, const char *str); 42void arm64_force_sig_info(struct siginfo *info, const char *str);
42 43
43/* 44/*
diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
index 37a3309863e0..baa96dfffeec 100644
--- a/arch/arm64/kernel/traps.c
+++ b/arch/arm64/kernel/traps.c
@@ -255,6 +255,13 @@ void arm64_force_sig_fault(int signo, int code, void __user *addr,
255 force_sig_fault(signo, code, addr, current); 255 force_sig_fault(signo, code, addr, current);
256} 256}
257 257
258void arm64_force_sig_mceerr(int code, void __user *addr, short lsb,
259 const char *str)
260{
261 arm64_show_signal(SIGBUS, str);
262 force_sig_mceerr(code, addr, lsb, current);
263}
264
258void arm64_force_sig_info(struct siginfo *info, const char *str) 265void arm64_force_sig_info(struct siginfo *info, const char *str)
259{ 266{
260 arm64_show_signal(info->si_signo, str); 267 arm64_show_signal(info->si_signo, str);
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
index 66c295019a9a..f0ccb209d181 100644
--- a/arch/arm64/mm/fault.c
+++ b/arch/arm64/mm/fault.c
@@ -422,7 +422,6 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr,
422 const struct fault_info *inf; 422 const struct fault_info *inf;
423 struct task_struct *tsk; 423 struct task_struct *tsk;
424 struct mm_struct *mm; 424 struct mm_struct *mm;
425 struct siginfo si;
426 vm_fault_t fault, major = 0; 425 vm_fault_t fault, major = 0;
427 unsigned long vm_flags = VM_READ | VM_WRITE; 426 unsigned long vm_flags = VM_READ | VM_WRITE;
428 unsigned int mm_flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; 427 unsigned int mm_flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
@@ -574,12 +573,8 @@ retry:
574 if (fault & VM_FAULT_HWPOISON_LARGE) 573 if (fault & VM_FAULT_HWPOISON_LARGE)
575 lsb = hstate_index_to_shift(VM_FAULT_GET_HINDEX(fault)); 574 lsb = hstate_index_to_shift(VM_FAULT_GET_HINDEX(fault));
576 575
577 clear_siginfo(&si); 576 arm64_force_sig_mceerr(BUS_MCEERR_AR, (void __user *)addr, lsb,
578 si.si_signo = SIGBUS; 577 inf->name);
579 si.si_code = BUS_MCEERR_AR;
580 si.si_addr = (void __user *)addr;
581 si.si_addr_lsb = lsb;
582 arm64_force_sig_info(&si, inf->name);
583 } else { 578 } else {
584 /* 579 /*
585 * Something tried to access memory that isn't in our memory 580 * Something tried to access memory that isn't in our memory