Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

signal/unicore32: Generate siginfo in ucs32_notify_die



Pass the signal number, and the signal code, and the faulting
address into uc32_notify_die so the callers do not need
to generate a struct siginfo.

In ucs32_ntoify_die use the newly passed in information to
call force_sig_fault to generate the siginfo and send the error.

This simplifies the code making the chances of bugs much less likely.

Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
parent 5ee527d7
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ struct siginfo;

extern void die(const char *msg, struct pt_regs *regs, int err);
extern void uc32_notify_die(const char *str, struct pt_regs *regs,
		struct siginfo *info, unsigned long err, unsigned long trap);
		int sig, int code, void __user *addr,
		unsigned long err, unsigned long trap);

#endif /* __UNICORE_BUG_H__ */
+3 −2
Original line number Diff line number Diff line
@@ -241,13 +241,14 @@ void die(const char *str, struct pt_regs *regs, int err)
}

void uc32_notify_die(const char *str, struct pt_regs *regs,
		struct siginfo *info, unsigned long err, unsigned long trap)
		int sig, int code, void __user *addr,
		unsigned long err, unsigned long trap)
{
	if (user_mode(regs)) {
		current->thread.error_code = err;
		current->thread.trap_no = trap;

		force_sig_info(info->si_signo, info, current);
		force_sig_fault(sig, code, addr, current);
	} else
		die(str, regs, err);
}
+4 −14
Original line number Diff line number Diff line
@@ -466,7 +466,6 @@ asmlinkage void do_DataAbort(unsigned long addr, unsigned int fsr,
			struct pt_regs *regs)
{
	const struct fsr_info *inf = fsr_info + fsr_fs(fsr);
	struct siginfo info;

	if (!inf->fn(addr, fsr & ~FSR_LNX_PF, regs))
		return;
@@ -474,19 +473,14 @@ asmlinkage void do_DataAbort(unsigned long addr, unsigned int fsr,
	printk(KERN_ALERT "Unhandled fault: %s (0x%03x) at 0x%08lx\n",
	       inf->name, fsr, addr);

	clear_siginfo(&info);
	info.si_signo = inf->sig;
	info.si_errno = 0;
	info.si_code = inf->code;
	info.si_addr = (void __user *)addr;
	uc32_notify_die("", regs, &info, fsr, 0);
	uc32_notify_die("", regs, inf->sig, inf->code, (void __user *)addr,
			fsr, 0);
}

asmlinkage void do_PrefetchAbort(unsigned long addr,
			unsigned int ifsr, struct pt_regs *regs)
{
	const struct fsr_info *inf = fsr_info + fsr_fs(ifsr);
	struct siginfo info;

	if (!inf->fn(addr, ifsr | FSR_LNX_PF, regs))
		return;
@@ -494,10 +488,6 @@ asmlinkage void do_PrefetchAbort(unsigned long addr,
	printk(KERN_ALERT "Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n",
	       inf->name, ifsr, addr);

	clear_siginfo(&info);
	info.si_signo = inf->sig;
	info.si_errno = 0;
	info.si_code = inf->code;
	info.si_addr = (void __user *)addr;
	uc32_notify_die("", regs, &info, ifsr, 0);
	uc32_notify_die("", regs, inf->sig, inf->code, (void __user *)addr,
			ifsr, 0);
}