diff options
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)) |