On Mon, Jun 10, 2013 at 01:00:01PM +0530, Jayachandran C wrote: > Kernel threads should be able to use COP2 if the platform needs it. > Do not call die_if_kernel() for a coprocessor unusable exception if > the exception due to COP2 usage. Instead, the default notifier for > COP2 exceptions is updated to call die_if_kernel. > > Signed-off-by: Jayachandran C <jchandra@xxxxxxxxxxxx> > --- > arch/mips/kernel/traps.c | 15 +++++---------- > 1 file changed, 5 insertions(+), 10 deletions(-) > > diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c > index beba1e6..142d2be 100644 > --- a/arch/mips/kernel/traps.c > +++ b/arch/mips/kernel/traps.c > @@ -1056,15 +1056,9 @@ static int default_cu2_call(struct notifier_block *nfb, unsigned long action, > { > struct pt_regs *regs = data; > > - switch (action) { > - default: > - die_if_kernel("Unhandled kernel unaligned access or invalid " > + die_if_kernel("COP2: Unhandled kernel unaligned access or invalid " > "instruction", regs); > - /* Fall through */ > - > - case CU2_EXCEPTION: > - force_sig(SIGILL, current); > - } > + force_sig(SIGILL, current); > > return NOTIFY_OK; > } The idea for cu2_chain notifiers is that they should return a value with NOTIFY_STOP_MASK set. That would prevent further calls to other notifiers. The default_cu2_call() notifier is installed with the lowest possible priority and is meant to only be called if there is no other notifier was installed, that is on a bog standard MIPS core with no CP2. > @@ -1080,10 +1074,11 @@ asmlinkage void do_cpu(struct pt_regs *regs) > unsigned long __maybe_unused flags; > > prev_state = exception_enter(); > - die_if_kernel("do_cpu invoked from kernel context!", regs); > - > cpid = (regs->cp0_cause >> CAUSEB_CE) & 3; > > + if (cpid != 2) > + die_if_kernel("do_cpu invoked from kernel context!", regs); > + > switch (cpid) { > case 0: > epc = (unsigned int __user *)exception_epc(regs); I'm ok with this segment. Ralf