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: Vineet Gupta <vgupta@synopsys.com>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
This commit is contained in:
Eric W. Biederman 2018-04-19 19:20:58 -05:00
parent a618a2754c
commit 4445229445

View file

@ -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() * -for kernel, chk if due to copy_(to|from)_user, otherwise die()
*/ */
static noinline int 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)) { if (user_mode(regs)) {
struct task_struct *tsk = current; 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 { } else {
/* If not due to copy_(to|from)_user, we are doomed */ /* If not due to copy_(to|from)_user, we are doomed */
if (fixup_exception(regs)) if (fixup_exception(regs))
return 0; return 0;
die(str, regs, (unsigned long)info->si_addr); die(str, regs, (unsigned long)addr);
} }
return 1; return 1;
@ -64,16 +65,9 @@ unhandled_exception(const char *str, struct pt_regs *regs, siginfo_t *info)
#define DO_ERROR_INFO(signr, str, name, sicode) \ #define DO_ERROR_INFO(signr, str, name, sicode) \
int name(unsigned long address, struct pt_regs *regs) \ int name(unsigned long address, struct pt_regs *regs) \
{ \ { \
siginfo_t info; \ return unhandled_exception(str, regs, signr, sicode, \
\ (void __user *)address); \
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);\
} }
/* /*