[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <alpine.DEB.2.02.1311111421400.30673@ionos.tec.linutronix.de>
Date: Mon, 11 Nov 2013 15:11:10 +0100 (CET)
From: Thomas Gleixner <tglx@...utronix.de>
To: Geert Uytterhoeven <geert@...ux-m68k.org>
cc: Michael Schmitz <schmitz@...phys.uni-duesseldorf.de>,
LKML <linux-kernel@...r.kernel.org>,
Linux/m68k <linux-m68k@...r.kernel.org>
Subject: Re: [patch 1/6] hardirq: Make hardirq bits generic
On Sun, 10 Nov 2013, Geert Uytterhoeven wrote:
> On Sun, Nov 10, 2013 at 9:49 AM, Michael Schmitz
> <schmitz@...phys.uni-duesseldorf.de> wrote:
> >> Is there an easy to setup/use emulator around on which I could try to
> >> dig into that myself?
> >
> > I believe Geert uses ARAnyM for his tests of m68k kernels on emulators - it
> > is reasonably easy to set up and use. I've used it to debug problems we had
> > with the SLUB allocator two years ago.
>
> Indeed. ARAnyM is the way to go.
Ok. Got it running and looked a bit deeper. I haven't yet found the
root cause, but there are quite some fishy things going on. Adding
enough debug printks makes the thing boot. Aside of that there seems
to be a violation of the 68k interrupt model.
The 68k interrupt handling allows only interrupts which have an higher
level than the value of the interrupt priority mask in SR. Further the
cpu sets the SR priority mask on interrupt entry to the level of the
interrupt which is serviced.
So now with aranym I can see a different behaviour. I just added the
debug patch below to a vanilla 3.12.
And I can see ever repeating
IRQ 13 flags 0x400 regs->sr 0x400
with a few
IRQ 15 flags 0x400 regs->sr 0x400
sprinkeled in.
Not what you would expect, right?
Thanks,
tglx
Index: linux-2.6/arch/m68k/kernel/irq.c
===================================================================
--- linux-2.6.orig/arch/m68k/kernel/irq.c
+++ linux-2.6/arch/m68k/kernel/irq.c
@@ -20,6 +20,12 @@
asmlinkage void do_IRQ(int irq, struct pt_regs *regs)
{
struct pt_regs *oldregs = set_irq_regs(regs);
+ unsigned long nested = regs->sr & ~ALLOWINT;
+ unsigned long flags = arch_local_save_flags() & ~ALLOWINT;
+
+ if (nested >= flags)
+ printk(KERN_ERR "IRQ %d flags 0x%lx regs->sr 0x%lx\n",
+ irq, flags, nested);
irq_enter();
generic_handle_irq(irq);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists