Commit 15773ae9 authored by Eric W. Biederman's avatar Eric W. Biederman
Browse files

signal/arc: Use force_sig_fault where appropriate

parent 44452294
Loading
Loading
Loading
Loading
+5 −15
Original line number Diff line number Diff line
@@ -66,14 +66,12 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)
	struct vm_area_struct *vma = NULL;
	struct task_struct *tsk = current;
	struct mm_struct *mm = tsk->mm;
	siginfo_t info;
	int si_code;
	int ret;
	vm_fault_t fault;
	int write = regs->ecr_cause & ECR_C_PROTV_STORE;  /* ST/EX */
	unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;

	clear_siginfo(&info);

	/*
	 * We fault-in kernel-space virtual memory on-demand. The
	 * 'reference' page table is init_mm.pgd.
@@ -91,7 +89,7 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)
			return;
	}

	info.si_code = SEGV_MAPERR;
	si_code = SEGV_MAPERR;

	/*
	 * If we're in an interrupt or have no user
@@ -119,7 +117,7 @@ retry:
	 * we can handle it..
	 */
good_area:
	info.si_code = SEGV_ACCERR;
	si_code = SEGV_ACCERR;

	/* Handle protection violation, execute on heap or stack */

@@ -199,11 +197,7 @@ bad_area_nosemaphore:
	/* User mode accesses just cause a SIGSEGV */
	if (user_mode(regs)) {
		tsk->thread.fault_address = address;
		info.si_signo = SIGSEGV;
		info.si_errno = 0;
		/* info.si_code has been set above */
		info.si_addr = (void __user *)address;
		force_sig_info(SIGSEGV, &info, tsk);
		force_sig_fault(SIGSEGV, si_code, (void __user *)address, tsk);
		return;
	}

@@ -238,9 +232,5 @@ do_sigbus:
		goto no_context;

	tsk->thread.fault_address = address;
	info.si_signo = SIGBUS;
	info.si_errno = 0;
	info.si_code = BUS_ADRERR;
	info.si_addr = (void __user *)address;
	force_sig_info(SIGBUS, &info, tsk);
	force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)address, tsk);
}