summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2018-09-22 09:54:33 +0200
committerEric W. Biederman <ebiederm@xmission.com>2018-09-27 21:54:10 +0200
commitaefab2b4c01ee67f2b60e400e46bad63d29c2603 (patch)
treec54bfc5f61f718c342d04a0b49e7bbbfd185e48d
parent9ea3a9743cac4fd2e296223ae6a95bf11d7365d0 (diff)
downloadlinux-aefab2b4c01ee67f2b60e400e46bad63d29c2603.tar.bz2
signal/arm64: For clarity separate the 3 signal sending cases in do_page_fault
It gets easy to confuse what is going on when some code is shared and some not so stop sharing the trivial bits of signal generation to make future updates easier to understand. 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/mm/fault.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
index 0ddc8c6ba53b..14d6ff895139 100644
--- a/arch/arm64/mm/fault.c
+++ b/arch/arm64/mm/fault.c
@@ -567,16 +567,16 @@ retry:
return 0;
}
- clear_siginfo(&si);
- si.si_addr = (void __user *)addr;
-
if (fault & VM_FAULT_SIGBUS) {
/*
* We had some memory, but were unable to successfully fix up
* this page fault.
*/
+ clear_siginfo(&si);
si.si_signo = SIGBUS;
si.si_code = BUS_ADRERR;
+ si.si_addr = (void __user *)addr;
+ __do_user_fault(&si, esr);
} else if (fault & (VM_FAULT_HWPOISON_LARGE | VM_FAULT_HWPOISON)) {
unsigned int lsb;
@@ -584,20 +584,25 @@ retry:
if (fault & VM_FAULT_HWPOISON_LARGE)
lsb = hstate_index_to_shift(VM_FAULT_GET_HINDEX(fault));
+ clear_siginfo(&si);
si.si_signo = SIGBUS;
si.si_code = BUS_MCEERR_AR;
+ si.si_addr = (void __user *)addr;
si.si_addr_lsb = lsb;
+ __do_user_fault(&si, esr);
} else {
/*
* Something tried to access memory that isn't in our memory
* map.
*/
+ clear_siginfo(&si);
si.si_signo = SIGSEGV;
si.si_code = fault == VM_FAULT_BADACCESS ?
SEGV_ACCERR : SEGV_MAPERR;
+ si.si_addr = (void __user *)addr;
+ __do_user_fault(&si, esr);
}
- __do_user_fault(&si, esr);
return 0;
no_context: