summaryrefslogtreecommitdiffstats
path: root/arch/mips/kernel
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1998-03-27 04:47:53 +0000
committerRalf Baechle <ralf@linux-mips.org>1998-03-27 04:47:53 +0000
commit36ea5120664550fae6d31f1c6f695e4f8975cb06 (patch)
tree7b985f066e6fa149027022366b9f3dd92506db24 /arch/mips/kernel
parentf7f4aaffdad04eb69ab618c771df0416ad04a952 (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.S36
-rw-r--r--arch/mips/kernel/head.S8
-rw-r--r--arch/mips/kernel/irixsig.c59
-rw-r--r--arch/mips/kernel/process.c2
-rw-r--r--arch/mips/kernel/r2300_switch.S24
-rw-r--r--arch/mips/kernel/scall_o32.S98
-rw-r--r--arch/mips/kernel/signal.c32
-rw-r--r--arch/mips/kernel/syscall.c6
-rw-r--r--arch/mips/kernel/traps.c12
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(&current->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" (&regs));
+ /* 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(&regs, 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(&regs);
lock_kernel();
res = do_fork(SIGCHLD, regs.regs[29], &regs);
unlock_kernel();
@@ -125,6 +128,7 @@ asmlinkage int sys_clone(struct pt_regs regs)
unsigned long newsp;
int res;
+ save_static(&regs);
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;