aboutsummaryrefslogtreecommitdiffstats
path: root/arch/nios2/kernel/traps.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/nios2/kernel/traps.c')
-rw-r--r--arch/nios2/kernel/traps.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/arch/nios2/kernel/traps.c b/arch/nios2/kernel/traps.c
index b7b97641a9a6..81f7da7b1d55 100644
--- a/arch/nios2/kernel/traps.c
+++ b/arch/nios2/kernel/traps.c
@@ -23,6 +23,17 @@
23 23
24static DEFINE_SPINLOCK(die_lock); 24static DEFINE_SPINLOCK(die_lock);
25 25
26static void _send_sig(int signo, int code, unsigned long addr)
27{
28 siginfo_t info;
29
30 info.si_signo = signo;
31 info.si_errno = 0;
32 info.si_code = code;
33 info.si_addr = (void __user *) addr;
34 force_sig_info(signo, &info, current);
35}
36
26void die(const char *str, struct pt_regs *regs, long err) 37void die(const char *str, struct pt_regs *regs, long err)
27{ 38{
28 console_verbose(); 39 console_verbose();
@@ -39,16 +50,10 @@ void die(const char *str, struct pt_regs *regs, long err)
39 50
40void _exception(int signo, struct pt_regs *regs, int code, unsigned long addr) 51void _exception(int signo, struct pt_regs *regs, int code, unsigned long addr)
41{ 52{
42 siginfo_t info;
43
44 if (!user_mode(regs)) 53 if (!user_mode(regs))
45 die("Exception in kernel mode", regs, signo); 54 die("Exception in kernel mode", regs, signo);
46 55
47 info.si_signo = signo; 56 _send_sig(signo, code, addr);
48 info.si_errno = 0;
49 info.si_code = code;
50 info.si_addr = (void __user *) addr;
51 force_sig_info(signo, &info, current);
52} 57}
53 58
54/* 59/*
@@ -183,3 +188,18 @@ asmlinkage void unhandled_exception(struct pt_regs *regs, int cause)
183 188
184 pr_emerg("opcode: 0x%08lx\n", *(unsigned long *)(regs->ea)); 189 pr_emerg("opcode: 0x%08lx\n", *(unsigned long *)(regs->ea));
185} 190}
191
192asmlinkage void handle_trap_1_c(struct pt_regs *fp)
193{
194 _send_sig(SIGUSR1, 0, fp->ea);
195}
196
197asmlinkage void handle_trap_2_c(struct pt_regs *fp)
198{
199 _send_sig(SIGUSR2, 0, fp->ea);
200}
201
202asmlinkage void handle_trap_3_c(struct pt_regs *fp)
203{
204 _send_sig(SIGILL, ILL_ILLTRP, fp->ea);
205}