diff options
Diffstat (limited to 'arch/nios2/kernel/traps.c')
-rw-r--r-- | arch/nios2/kernel/traps.c | 34 |
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 | ||
24 | static DEFINE_SPINLOCK(die_lock); | 24 | static DEFINE_SPINLOCK(die_lock); |
25 | 25 | ||
26 | static 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 | |||
26 | void die(const char *str, struct pt_regs *regs, long err) | 37 | void 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 | ||
40 | void _exception(int signo, struct pt_regs *regs, int code, unsigned long addr) | 51 | void _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 | |||
192 | asmlinkage void handle_trap_1_c(struct pt_regs *fp) | ||
193 | { | ||
194 | _send_sig(SIGUSR1, 0, fp->ea); | ||
195 | } | ||
196 | |||
197 | asmlinkage void handle_trap_2_c(struct pt_regs *fp) | ||
198 | { | ||
199 | _send_sig(SIGUSR2, 0, fp->ea); | ||
200 | } | ||
201 | |||
202 | asmlinkage void handle_trap_3_c(struct pt_regs *fp) | ||
203 | { | ||
204 | _send_sig(SIGILL, ILL_ILLTRP, fp->ea); | ||
205 | } | ||