diff options
Diffstat (limited to 'arch/hexagon/mm/vm_fault.c')
| -rw-r--r-- | arch/hexagon/mm/vm_fault.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/arch/hexagon/mm/vm_fault.c b/arch/hexagon/mm/vm_fault.c index 308ef0ce648..8704c932003 100644 --- a/arch/hexagon/mm/vm_fault.c +++ b/arch/hexagon/mm/vm_fault.c @@ -53,8 +53,7 @@ void do_page_fault(unsigned long address, long cause, struct pt_regs *regs) int si_code = SEGV_MAPERR; int fault; const struct exception_table_entry *fixup; - unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | - (cause > 0 ? FAULT_FLAG_WRITE : 0); + unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; /* * If we're in an interrupt or have no user context, @@ -65,6 +64,8 @@ void do_page_fault(unsigned long address, long cause, struct pt_regs *regs) local_irq_enable(); + if (user_mode(regs)) + flags |= FAULT_FLAG_USER; retry: down_read(&mm->mmap_sem); vma = find_vma(mm, address); @@ -96,6 +97,7 @@ good_area: case FLT_STORE: if (!(vma->vm_flags & VM_WRITE)) goto bad_area; + flags |= FAULT_FLAG_WRITE; break; } @@ -147,7 +149,7 @@ good_area: } info.si_errno = 0; info.si_addr = (void __user *)address; - force_sig_info(info.si_code, &info, current); + force_sig_info(info.si_signo, &info, current); return; bad_area: @@ -158,7 +160,7 @@ bad_area: info.si_errno = 0; info.si_code = si_code; info.si_addr = (void *)address; - force_sig_info(SIGSEGV, &info, current); + force_sig_info(info.si_signo, &info, current); return; } /* Kernel-mode fault falls through */ |
