diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1998-03-27 04:47:53 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1998-03-27 04:47:53 +0000 |
commit | 36ea5120664550fae6d31f1c6f695e4f8975cb06 (patch) | |
tree | 7b985f066e6fa149027022366b9f3dd92506db24 /arch/mips/kernel | |
parent | f7f4aaffdad04eb69ab618c771df0416ad04a952 (diff) |
o Speedup syscalls. Now 816ns per syscall. Yes, nanoseconds and goodbye
Pentium :-)
o Little bit smarter handling of unimplemented exceptions.
o Fix FPU context switches.
o Fix reboot / halt. Powerdown in software still doesn't work.
o Fix the fix for handling of return values of interrupted syscalls.
o Handling of the Indy second level cache now works as spec'ed. Purely
cosmentic, this was not causing any problems.
Diffstat (limited to 'arch/mips/kernel')
-rw-r--r-- | arch/mips/kernel/entry.S | 36 | ||||
-rw-r--r-- | arch/mips/kernel/head.S | 8 | ||||
-rw-r--r-- | arch/mips/kernel/irixsig.c | 59 | ||||
-rw-r--r-- | arch/mips/kernel/process.c | 2 | ||||
-rw-r--r-- | arch/mips/kernel/r2300_switch.S | 24 | ||||
-rw-r--r-- | arch/mips/kernel/scall_o32.S | 98 | ||||
-rw-r--r-- | arch/mips/kernel/signal.c | 32 | ||||
-rw-r--r-- | arch/mips/kernel/syscall.c | 6 | ||||
-rw-r--r-- | arch/mips/kernel/traps.c | 12 |
9 files changed, 152 insertions, 125 deletions
diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S index 8abe70182..afabc6156 100644 --- a/arch/mips/kernel/entry.S +++ b/arch/mips/kernel/entry.S @@ -7,7 +7,7 @@ * * Copyright (C) 1994, 1995 by Ralf Baechle * - * $Id: entry.S,v 1.6 1998/03/17 22:07:32 ralf Exp $ + * $Id: entry.S,v 1.10 1998/03/26 07:39:09 ralf Exp $ */ /* @@ -40,7 +40,7 @@ .set noreorder .set mips3 .align 4 -handle_bottom_half: +EXPORT(handle_bottom_half) jal do_bottom_half nop b 9f @@ -96,6 +96,10 @@ LEAF(spurious_interrupt) * the C preprocessor ... */ #define __BUILD_clear_none(exception) +#define __BUILD_clear_sti(exception) \ + STI +#define __BUILD_clear_cli(exception) \ + CLI #define __BUILD_clear_fpe(exception) \ cfc1 a1,fcr31; \ li a2,~(0x3f<<12); \ @@ -103,7 +107,8 @@ LEAF(spurious_interrupt) ctc1 a2,fcr31; #define __BUILD_clear_ade(exception) \ MFC0 t0,CP0_BADVADDR; \ - REG_S t0,PT_BVADDR(sp); + REG_S t0,PT_BVADDR(sp); \ + STI #define __BUILD_silent(exception) #define fmt "Got %s at %08lx.\n" @@ -129,11 +134,8 @@ EXPORT(exception_count_##exception); \ .set noat; \ SAVE_ALL; \ __BUILD_clear_##clear(exception); \ - STI; \ .set at; \ __BUILD_##verbose(exception); \ - li t0,-1; /* not a sys call */ \ - REG_S t0,PT_OR2(sp); \ jal do_##handler; \ move a0,sp; \ j ret_from_sys_call; \ @@ -142,18 +144,18 @@ EXPORT(exception_count_##exception); \ BUILD_HANDLER(adel,ade,ade,silent) /* #4 */ BUILD_HANDLER(ades,ade,ade,silent) /* #5 */ - BUILD_HANDLER(ibe,ibe,none,verbose) /* #6 */ - BUILD_HANDLER(dbe,dbe,none,verbose) /* #7 */ - BUILD_HANDLER(bp,bp,none,silent) /* #9 */ - BUILD_HANDLER(ri,ri,none,silent) /* #10 */ - BUILD_HANDLER(cpu,cpu,none,silent) /* #11 */ - BUILD_HANDLER(ov,ov,none,silent) /* #12 */ - BUILD_HANDLER(tr,tr,none,silent) /* #13 */ - BUILD_HANDLER(vcei,vcei,none,verbose) /* #14 */ + BUILD_HANDLER(ibe,ibe,cli,verbose) /* #6 */ + BUILD_HANDLER(dbe,dbe,cli,verbose) /* #7 */ + BUILD_HANDLER(bp,bp,sti,silent) /* #9 */ + BUILD_HANDLER(ri,ri,sti,silent) /* #10 */ + BUILD_HANDLER(cpu,cpu,sti,silent) /* #11 */ + BUILD_HANDLER(ov,ov,sti,silent) /* #12 */ + BUILD_HANDLER(tr,tr,sti,silent) /* #13 */ + BUILD_HANDLER(vcei,vcei,sti,verbose) /* #14 */ BUILD_HANDLER(fpe,fpe,fpe,silent) /* #15 */ - BUILD_HANDLER(watch,watch,none,verbose) /* #23 */ - BUILD_HANDLER(vced,vced,none,verbose) /* #31 */ - BUILD_HANDLER(reserved,reserved,none,verbose) /* others */ + BUILD_HANDLER(watch,watch,sti,verbose) /* #23 */ + BUILD_HANDLER(vced,vced,sti,verbose) /* #31 */ + BUILD_HANDLER(reserved,reserved,sti,verbose) /* others */ /* * Table of syscalls diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S index 229f78930..29c326e49 100644 --- a/arch/mips/kernel/head.S +++ b/arch/mips/kernel/head.S @@ -8,7 +8,7 @@ * * Head.S contains the MIPS exception handler and startup code. * - * $Id: head.S,v 1.5 1997/12/01 17:57:27 ralf Exp $ + * $Id: head.S,v 1.11 1998/03/22 20:43:43 ralf Exp $ */ #include <linux/config.h> #include <linux/tasks.h> @@ -396,6 +396,12 @@ probe_done: jal sgi_sysinit nop #endif + +#ifdef CONFIG_COBALT_MICRO_SERVER + jal SetUpBootInfo + nop +#endif + /* Get the very one tags we need early in the boot process */ nop jal bi_EarlySnarf diff --git a/arch/mips/kernel/irixsig.c b/arch/mips/kernel/irixsig.c index 88fca61f2..d0e286def 100644 --- a/arch/mips/kernel/irixsig.c +++ b/arch/mips/kernel/irixsig.c @@ -1,7 +1,9 @@ -/* $Id: irixsig.c,v 1.9 1998/03/17 00:59:35 ralf Exp $ +/* * irixsig.c: WHEEE, IRIX signals! YOW, am I compatable or what?!?! * * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com) + * + * $Id: irixsig.c,v 1.11 1998/03/26 07:39:09 ralf Exp $ */ #include <linux/kernel.h> @@ -154,30 +156,27 @@ static inline void handle_signal(unsigned long sig, struct k_sigaction *ka, } } -static inline void syscall_restart(unsigned long r0, unsigned long or2, - unsigned long or7, struct pt_regs *regs, - struct sigaction *sa) +static inline void syscall_restart(struct pt_regs *regs, struct k_sigaction *ka) { - switch(r0) { + switch(regs->regs[0]) { case ERESTARTNOHAND: - no_system_call_restart: - regs->regs[0] = regs->regs[2] = EINTR; + regs->regs[2] = EINTR; break; case ERESTARTSYS: - if(!(sa->sa_flags & SA_RESTART)) - goto no_system_call_restart; + if(!(ka->sa.sa_flags & SA_RESTART)) { + regs->regs[2] = EINTR; + break; + } /* fallthrough */ - case ERESTARTNOINTR: - regs->regs[0] = regs->regs[2] = or2; - regs->regs[7] = or7; - regs->cp0_epc -= 8; + case ERESTARTNOINTR: /* Userland will reload $v0. */ + regs->cp0_epc -= 8; } + + regs->regs[0] = 0; /* Don't deal with this again. */ } asmlinkage int do_irix_signal(sigset_t *oldset, struct pt_regs *regs) { - unsigned long r0 = regs->regs[0]; - unsigned long r7 = regs->orig_reg7; struct k_sigaction *ka; siginfo_t info; @@ -279,8 +278,8 @@ asmlinkage int do_irix_signal(sigset_t *oldset, struct pt_regs *regs) } } - if (r0) - syscall_restart(r0, regs->orig_reg2, r7, regs, &ka->sa); + if (regs->regs[0]) + syscall_restart(regs, ka); /* Whee! Actually deliver the signal. */ handle_signal(signr, ka, &info, oldset, regs); return 1; @@ -291,13 +290,12 @@ asmlinkage int do_irix_signal(sigset_t *oldset, struct pt_regs *regs) * dies here!!! The li instruction, a single machine instruction, * must directly be followed by the syscall instruction. */ - if (r0 && - (regs->regs[2] == ERESTARTNOHAND || - regs->regs[2] == ERESTARTSYS || - regs->regs[2] == ERESTARTNOINTR)) { - regs->regs[0] = regs->regs[2] = regs->orig_reg2; - regs->regs[7] = r7; - regs->cp0_epc -= 8; + if (regs->regs[0]) { + if (regs->regs[2] == ERESTARTNOHAND || + regs->regs[2] == ERESTARTSYS || + regs->regs[2] == ERESTARTNOINTR) { + regs->cp0_epc -= 8; + } } return 0; } @@ -356,10 +354,15 @@ asmlinkage unsigned long irix_sigreturn(struct pt_regs *regs) recalc_sigpending(current); spin_unlock_irq(¤t->sigmask_lock); - regs->orig_reg2 = -1; - __get_user(res, &context->regs[2]); - - return res; + /* + * Don't let your children do this ... + */ + __asm__ __volatile__( + "move\t$29,%0\n\t" + "j\tret_from_sys_call" + :/* no outputs */ + :"r" (®s)); + /* Unreached */ badframe: lock_kernel(); diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c index 4b65d3c97..45d58730c 100644 --- a/arch/mips/kernel/process.c +++ b/arch/mips/kernel/process.c @@ -7,7 +7,7 @@ * * Copyright (C) 1994 - 1998 by Ralf Baechle and others. * - * $Id: process.c,v 1.5 1998/03/22 23:27:13 ralf Exp $ + * $Id: process.c,v 1.7 1998/03/22 20:43:43 ralf Exp $ */ #include <linux/config.h> #include <linux/errno.h> diff --git a/arch/mips/kernel/r2300_switch.S b/arch/mips/kernel/r2300_switch.S index 7efd61927..f4470e54d 100644 --- a/arch/mips/kernel/r2300_switch.S +++ b/arch/mips/kernel/r2300_switch.S @@ -1,10 +1,12 @@ -/* $Id: r2300_switch.S,v 1.1.1.1 1997/06/01 03:16:43 ralf Exp $ +/* * r2300_switch.S: R3000/R2000 specific task switching code. * * Copyright (C) 1994, 1995, 1996 by Ralf Baechle and Andreas Busse * * Multi-cpu abstraction and macros for easier reading: * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com) + * + * $Id: r2300_switch.S,v 1.3 1998/03/23 06:34:37 ralf Exp $ */ #include <asm/asm.h> #include <asm/bootinfo.h> @@ -25,7 +27,8 @@ MODE_ALIAS = 0x00e0 # uncachable, dirty, valid .text - .set mips3 + .set mips1 + .set noreorder /* * Code necessary to switch tasks on an Linux/MIPS machine. * FIXME: We don't need to disable interrupts anymore. @@ -39,15 +42,10 @@ MODE_ALIAS = 0x00e0 # uncachable, dirty, valid mtc0 t2,CP0_STATUS CPU_SAVE_NONSCRATCH($28) sll t2,t1,2 # Save floating point state - bgez t2,2f - sw ra,THREAD_REG31($28) - sll t2,t1,5 bgez t2,1f - swc1 $f0, (THREAD_FPU + 0x00)($28) - FPU_SAVE_16ODD($28) + sw ra,THREAD_REG31($28) + FPU_SAVE($28, t0) 1: - FPU_SAVE_16EVEN($28, t1) -2: move $28, a0 lw t0,THREAD_PGDIR($28) # Switch the root pointer li t1,TLB_ROOT # get PFN @@ -80,14 +78,10 @@ MODE_ALIAS = 0x00e0 # uncachable, dirty, valid xori t1,1 mtc0 t1,CP0_STATUS sll t0,a2,2 - bgez t0,2f - sll t0,a2,5 bgez t0,1f - lwc1 $f0, (THREAD_FPU + 0x00)($28) - FPU_RESTORE_16ODD($28) + lw ra,THREAD_REG31($28) + FPU_RESTORE($28, t0) 1: - FPU_RESTORE_16EVEN($28, t0) -2: CPU_RESTORE_NONSCRATCH($28) lw t0,THREAD_KSP($28) # Restore status register sw t0,kernelsp diff --git a/arch/mips/kernel/scall_o32.S b/arch/mips/kernel/scall_o32.S index eb25c34e5..6c46dedda 100644 --- a/arch/mips/kernel/scall_o32.S +++ b/arch/mips/kernel/scall_o32.S @@ -1,9 +1,13 @@ /* - * Handle ABI O32 style syscalls. + * arch/mips/kernel/scall_o32.S + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. * * Copyright (C) 1997, 1998 by Ralf Baechle * - * $Id: scall_o32.S,v 1.1 1998/03/12 19:06:20 ralf Exp $ + * $Id: scall_o32.S,v 1.3 1998/03/26 07:39:10 ralf Exp $ */ #include <asm/asm.h> #include <linux/errno.h> @@ -25,18 +29,11 @@ .align 5 NESTED(handle_sys, PT_SIZE, sp) .set noat - SAVE_ALL + SAVE_SOME STI .set at - /* - * By convention "li v0,<syscallno>" is always preceeding - * the syscall instruction. So if we're in a delay slot - * userland is screwed up. - */ - lw t0, PT_CAUSE(sp) # delay slot? lw t1, PT_EPC(sp) # skip syscall on return - bltz t0, sigill_and_out sltiu t0, v0, MAX_SYSCALL_NO + 1 # check syscall number addiu t1, 4 # skip to next instruction @@ -45,18 +42,19 @@ NESTED(handle_sys, PT_SIZE, sp) /* XXX Put both in one cacheline, should save a bit. */ sll t0, v0, 2 - lw s0, sys_call_table(t0) # syscall routine - lbu s1, sys_narg_table(v0) # number of arguments - beqz s0, illegal_syscall; + lw t2, sys_call_table(t0) # syscall routine + lbu t3, sys_narg_table(v0) # number of arguments + beqz t2, illegal_syscall; - subu t0, s1, 5 # 5 or more arguments? - bgezal t0, stackargs + subu t0, t3, 5 # 5 or more arguments? + bgez t0, stackargs - lw s3, TASK_FLAGS($28) # syscall tracing enabled? - andi s3, PF_TRACESYS - bnez s3, trace_a_syscall +stack_done: + lw t0, TASK_FLAGS($28) # syscall tracing enabled? + andi t0, PF_TRACESYS + bnez t0, trace_a_syscall - jalr s0 # Do The Real Thing (TM) + jalr t2 # Do The Real Thing (TM) li t0, -EMAXERRNO - 1 # error? sltu t0, t0, v0 @@ -66,14 +64,49 @@ NESTED(handle_sys, PT_SIZE, sp) negu v0 # error sw v0, PT_R0(sp) # set flag for syscall restarting 1: sw v0, PT_R2(sp) # result - j ret_from_sys_call + +EXPORT(o32_ret_from_sys_call) + lw t0,bh_mask + lw t1,bh_active # unused delay slot + and t0,t1 + bnez t0,o32_handle_bottom_half + +9: lw t0,PT_STATUS(sp) # returning to kernel mode? + andi t1, t0, 0x10 + lw t2, need_resched + beqz t1, o32_return # -> yes + bnez t2, o32_reschedule + lw v0, TASK_SIGPENDING($28) + move a0, zero + beqz v0, o32_return + move a1, sp + SAVE_STATIC + jal do_signal + +o32_return: + RESTORE_SOME + RESTORE_SP + .set mips3 + eret + .set mips0 + +o32_handle_bottom_half: + jal do_bottom_half + b 9b +o32_reschedule: + SAVE_STATIC + jal schedule + b o32_ret_from_sys_call /* ------------------------------------------------------------------------ */ trace_a_syscall: + SAVE_STATIC + sw t2,PT_R1(sp) jal syscall_trace + sw t2,PT_R1(sp) - jalr s0 # Do The Real Thing (TM) + jalr t2 # Do The Real Thing (TM) li t0, -EMAXERRNO - 1 # error? sltu t0, t0, v0 @@ -95,20 +128,18 @@ trace_a_syscall: * This Sucks (TM). */ stackargs: - move s3, ra # save return address - lw t0, PT_R29(sp) # get old user stack pointer - subu s2, s1, 4 - sll t1, s2, 2 # stack valid? + subu t3, 4 + sll t1, t3, 2 # stack valid? addu t1, t0 # end address - or t2, t0, t1 + or t0, t1 bltz t0, bad_stack # -> sp is bad lw t0, PT_R29(sp) # get old user stack pointer la t1, 3f # copy 1 to 2 arguments - sll s2, s2, 3 - subu t1, s2 + sll t3, t3, 3 + subu t1, t3 jr t1 /* Ok, copy the args from the luser stack to the kernel stack */ @@ -117,7 +148,7 @@ stackargs: 2: lw t1, 16(t0) # argument #5 from usp sw t1, 16(sp) -3: jr s3 # go back +3: j stack_done # go back .section __ex_table,"a" PTR 1b,bad_stack @@ -144,12 +175,3 @@ illegal_syscall: li t0, 1 # set error flag sw t0, PT_R7(sp) j ret_from_sys_call - -sigill_and_out: - li t0, -1 # not a sys call - REG_S t0, PT_OR2(sp) - li a0, SIGILL - move a2, $28 - jal force_sig - j ret_from_sys_call - END(handle_sys) diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c index 0e7a24766..007e95452 100644 --- a/arch/mips/kernel/signal.c +++ b/arch/mips/kernel/signal.c @@ -4,7 +4,7 @@ * Copyright (C) 1991, 1992 Linus Torvalds * Copyright (C) 1994, 1995, 1996 Ralf Baechle * - * $Id: signal.c,v 1.9 1998/03/17 22:07:36 ralf Exp $ + * $Id: signal.c,v 1.17 1998/03/26 07:39:10 ralf Exp $ */ #include <linux/config.h> #include <linux/sched.h> @@ -203,11 +203,6 @@ asmlinkage int sys_sigreturn(struct pt_regs regs) restore_sigcontext(®s, context); /* - * Disable syscall checks - */ - regs.orig_reg2 = -1; - - /* * Don't let your children do this ... */ __asm__ __volatile__( @@ -347,30 +342,29 @@ static inline void handle_signal(unsigned long sig, struct k_sigaction *ka, } } -static inline void syscall_restart(unsigned long or2, unsigned long or7, - struct pt_regs *regs, struct sigaction *sa) +static inline void syscall_restart(struct pt_regs *regs, struct k_sigaction *ka) { switch(regs->regs[0]) { case ERESTARTNOHAND: - no_system_call_restart: - regs->regs[0] = regs->regs[2] = EINTR; + regs->regs[2] = EINTR; break; case ERESTARTSYS: - if(!(sa->sa_flags & SA_RESTART)) - goto no_system_call_restart; + if(!(ka->sa.sa_flags & SA_RESTART)) { + regs->regs[2] = EINTR; + break; + } /* fallthrough */ - case ERESTARTNOINTR: - regs->regs[0] = regs->regs[2] = or2; - regs->regs[7] = or7; + case ERESTARTNOINTR: /* Userland will reload $v0. */ regs->cp0_epc -= 8; } + + regs->regs[0] = 0; /* Don't deal with this again. */ } extern int do_irix_signal(sigset_t *oldset, struct pt_regs *regs); asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs) { - unsigned long r7 = regs->orig_reg7; struct k_sigaction *ka; siginfo_t info; @@ -478,7 +472,7 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs) } if (regs->regs[0]) - syscall_restart(regs->orig_reg2, r7, regs, &ka->sa); + syscall_restart(regs, ka); /* Whee! Actually deliver the signal. */ handle_signal(signr, ka, &info, oldset, regs); return 1; @@ -493,9 +487,7 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs) if (regs->regs[2] == ERESTARTNOHAND || regs->regs[2] == ERESTARTSYS || regs->regs[2] == ERESTARTNOINTR) { - regs->regs[0] = regs->regs[2] = regs->orig_reg2; - regs->regs[7] = r7; - regs->cp0_epc -= 8; + regs->cp0_epc -= 8; } } return 0; diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c index ac5cd123b..4781e790b 100644 --- a/arch/mips/kernel/syscall.c +++ b/arch/mips/kernel/syscall.c @@ -11,7 +11,7 @@ * Don't waste that much memory for empty entries in the syscall * table. * - * $Id: syscall.c,v 1.6 1998/03/17 22:07:36 ralf Exp $ + * $Id: syscall.c,v 1.8 1998/03/26 07:39:10 ralf Exp $ */ #undef CONF_PRINT_SYSCALLS #undef CONF_DEBUG_IRIX @@ -27,8 +27,10 @@ #include <linux/utsname.h> #include <linux/unistd.h> #include <asm/branch.h> +#include <asm/offset.h> #include <asm/ptrace.h> #include <asm/signal.h> +#include <asm/stackframe.h> #include <asm/uaccess.h> extern asmlinkage void syscall_trace(void); @@ -113,6 +115,7 @@ asmlinkage int sys_fork(struct pt_regs regs) { int res; + save_static(®s); lock_kernel(); res = do_fork(SIGCHLD, regs.regs[29], ®s); unlock_kernel(); @@ -125,6 +128,7 @@ asmlinkage int sys_clone(struct pt_regs regs) unsigned long newsp; int res; + save_static(®s); lock_kernel(); clone_flags = regs.regs[4]; newsp = regs.regs[5]; diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index f2ad107fa..629a07836 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c @@ -8,7 +8,7 @@ * Copyright 1994, 1995, 1996, 1997 by Ralf Baechle * Modified for R3000 by Paul M. Antoine, 1995, 1996 * - * $Id: traps.c,v 1.7 1998/03/17 22:07:38 ralf Exp $ + * $Id: traps.c,v 1.12 1998/03/26 07:39:11 ralf Exp $ */ #include <linux/config.h> #include <linux/init.h> @@ -183,6 +183,7 @@ static void default_be_board_handler(struct pt_regs *regs) void do_ibe(struct pt_regs *regs) { lock_kernel(); +show_regs(regs); while(1); ibe_board_handler(regs); unlock_kernel(); } @@ -190,6 +191,7 @@ void do_ibe(struct pt_regs *regs) void do_dbe(struct pt_regs *regs) { lock_kernel(); +show_regs(regs); while(1); dbe_board_handler(regs); unlock_kernel(); } @@ -240,11 +242,11 @@ void do_fpe(struct pt_regs *regs, unsigned long fcr31) show_regs(regs); #endif if (fcr31 & 0x20000) { - printk("Unimplemented exception at 0x%08lx in %s.\n", - regs->cp0_epc, current->comm); /* Retry instruction with flush to zero ... */ if (!(fcr31 & (1<<24))) { - printk("Setting flush to zero ...\n"); + printk("Setting flush to zero for %s.\n", + current->comm); + fcr31 &= ~0x20000; fcr31 |= (1<<24); __asm__ __volatile__( "ctc1\t%0,$31" @@ -252,6 +254,8 @@ void do_fpe(struct pt_regs *regs, unsigned long fcr31) : "r" (fcr31)); goto out; } + printk("Unimplemented exception at 0x%08lx in %s.\n", + regs->cp0_epc, current->comm); } if (compute_return_epc(regs)) goto out; |