diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2018-04-15 21:14:10 -0400 |
---|---|---|
committer | Eric W. Biederman <ebiederm@xmission.com> | 2018-04-25 11:44:05 -0400 |
commit | 75bfb9a1c89ae1f28cd09f7ae0d236ebde9b97ec (patch) | |
tree | 10bf007bd8672c57cd06c890ff1d81078f5b1c7e /arch/openrisc/mm | |
parent | c046e2c693c770153acb568e56c0c41cce9c91e2 (diff) |
signal/openrisc: Use force_sig_fault where appropriate
Filling in struct siginfo before calling force_sig_info a tedious and
error prone process, where once in a great while the wrong fields
are filled out, and siginfo has been inconsistently cleared.
Simplify this process by using the helper force_sig_fault. Which
takes as a parameters all of the information it needs, ensures
all of the fiddly bits of filling in struct siginfo are done properly
and then calls force_sig_info.
In short about a 5 line reduction in code for every time force_sig_info
is called, which makes the calling function clearer.
Cc: Jonas Bonn <jonas@southpole.se>
Cc: Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
Cc: Stafford Horne <shorne@gmail.com>
Cc: openrisc@lists.librecores.org
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Diffstat (limited to 'arch/openrisc/mm')
-rw-r--r-- | arch/openrisc/mm/fault.c | 19 |
1 files changed, 5 insertions, 14 deletions
diff --git a/arch/openrisc/mm/fault.c b/arch/openrisc/mm/fault.c index 68be33e4ae17..9f011d16cc46 100644 --- a/arch/openrisc/mm/fault.c +++ b/arch/openrisc/mm/fault.c | |||
@@ -52,11 +52,10 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long address, | |||
52 | struct task_struct *tsk; | 52 | struct task_struct *tsk; |
53 | struct mm_struct *mm; | 53 | struct mm_struct *mm; |
54 | struct vm_area_struct *vma; | 54 | struct vm_area_struct *vma; |
55 | siginfo_t info; | 55 | int si_code; |
56 | int fault; | 56 | int fault; |
57 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; | 57 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; |
58 | 58 | ||
59 | clear_siginfo(&info); | ||
60 | tsk = current; | 59 | tsk = current; |
61 | 60 | ||
62 | /* | 61 | /* |
@@ -98,7 +97,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long address, | |||
98 | } | 97 | } |
99 | 98 | ||
100 | mm = tsk->mm; | 99 | mm = tsk->mm; |
101 | info.si_code = SEGV_MAPERR; | 100 | si_code = SEGV_MAPERR; |
102 | 101 | ||
103 | /* | 102 | /* |
104 | * If we're in an interrupt or have no user | 103 | * If we're in an interrupt or have no user |
@@ -140,7 +139,7 @@ retry: | |||
140 | */ | 139 | */ |
141 | 140 | ||
142 | good_area: | 141 | good_area: |
143 | info.si_code = SEGV_ACCERR; | 142 | si_code = SEGV_ACCERR; |
144 | 143 | ||
145 | /* first do some preliminary protection checks */ | 144 | /* first do some preliminary protection checks */ |
146 | 145 | ||
@@ -214,11 +213,7 @@ bad_area_nosemaphore: | |||
214 | /* User mode accesses just cause a SIGSEGV */ | 213 | /* User mode accesses just cause a SIGSEGV */ |
215 | 214 | ||
216 | if (user_mode(regs)) { | 215 | if (user_mode(regs)) { |
217 | info.si_signo = SIGSEGV; | 216 | force_sig_fault(SIGSEGV, si_code, (void __user *)address, tsk); |
218 | info.si_errno = 0; | ||
219 | /* info.si_code has been set above */ | ||
220 | info.si_addr = (void *)address; | ||
221 | force_sig_info(SIGSEGV, &info, tsk); | ||
222 | return; | 217 | return; |
223 | } | 218 | } |
224 | 219 | ||
@@ -283,11 +278,7 @@ do_sigbus: | |||
283 | * Send a sigbus, regardless of whether we were in kernel | 278 | * Send a sigbus, regardless of whether we were in kernel |
284 | * or user mode. | 279 | * or user mode. |
285 | */ | 280 | */ |
286 | info.si_signo = SIGBUS; | 281 | force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)address, tsk); |
287 | info.si_errno = 0; | ||
288 | info.si_code = BUS_ADRERR; | ||
289 | info.si_addr = (void *)address; | ||
290 | force_sig_info(SIGBUS, &info, tsk); | ||
291 | 282 | ||
292 | /* Kernel mode? Handle exceptions or die */ | 283 | /* Kernel mode? Handle exceptions or die */ |
293 | if (!user_mode(regs)) | 284 | if (!user_mode(regs)) |