I'm encountering strange kernel lockup recently. I noticed that
sometimes an interrupt happend in middle of RESTORE_SOME code.
RESTORE_SOME restores CP0_STATUS from stack. But the value in the
stack did not contains EXL bit when the problem happens.
With recent change in kernel_thread(), initial cp0_status value comes
from current C0_STATUS (which does not include EXL bit). Is this
correct? The initial value should contain EXL bit to start the thread
up safely, shouldn't it?
Now I'm testing this patch and it seems to fix the problem.
diff -u linux-mips/arch/mips/kernel/process.c linux/arch/mips/kernel/
--- linux-mips/arch/mips/kernel/process.c Wed Sep 22 13:27:59 2004
+++ linux/arch/mips/kernel/process.c Fri Oct 22 16:49:39 2004
@@ -171,6 +171,9 @@
regs.regs = (unsigned long) fn;
regs.cp0_epc = (unsigned long) kernel_thread_helper;
regs.cp0_status = read_c0_status();
+#if !(defined(CONFIG_CPU_R3000) || defined(CONFIG_CPU_TX39XX))
+ regs.cp0_status |= ST0_EXL;
/* Ok, create the new process.. */
return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL,