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

signal/arc: Push siginfo generation into unhandled_exception



Pass signr, sicode, and address into unhandled_exception as explicit
parameters instead of members of struct siginfo.  Then in unhandled
exception generate and send the siginfo using force_sig_fault.

This keeps the code simpler and less error prone.

Acked-by: default avatarVineet Gupta <vgupta@synopsys.com>
Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
parent a618a275
Loading
Loading
Loading
Loading
+8 −14
Original line number Diff line number Diff line
@@ -42,21 +42,22 @@ void die(const char *str, struct pt_regs *regs, unsigned long address)
 *  -for kernel, chk if due to copy_(to|from)_user, otherwise die()
 */
static noinline int
unhandled_exception(const char *str, struct pt_regs *regs, siginfo_t *info)
unhandled_exception(const char *str, struct pt_regs *regs,
		    int signo, int si_code, void __user *addr)
{
	if (user_mode(regs)) {
		struct task_struct *tsk = current;

		tsk->thread.fault_address = (__force unsigned int)info->si_addr;
		tsk->thread.fault_address = (__force unsigned int)addr;

		force_sig_info(info->si_signo, info, tsk);
		force_sig_fault(signo, si_code, addr, tsk);

	} else {
		/* If not due to copy_(to|from)_user, we are doomed */
		if (fixup_exception(regs))
			return 0;

		die(str, regs, (unsigned long)info->si_addr);
		die(str, regs, (unsigned long)addr);
	}

	return 1;
@@ -65,15 +66,8 @@ unhandled_exception(const char *str, struct pt_regs *regs, siginfo_t *info)
#define DO_ERROR_INFO(signr, str, name, sicode) \
int name(unsigned long address, struct pt_regs *regs) \
{								\
	siginfo_t info;				\
						\
	clear_siginfo(&info);			\
	info.si_signo = signr;			\
	info.si_errno = 0;			\
	info.si_code  = sicode;			\
	info.si_addr = (void __user *)address;	\
						\
	return unhandled_exception(str, regs, &info);\
	return unhandled_exception(str, regs, signr, sicode,	\
				   (void __user *)address);	\
}

/*