mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-03 23:58:05 +00:00
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:
parent
a618a2754c
commit
4445229445
1 changed files with 8 additions and 14 deletions
|
@ -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);\
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue