Subject: port-powerpc/35705: interrupt handler ext_intr for edge triggered IRQs, only?
To: None <email@example.com, firstname.lastname@example.org,>
From: None <email@example.com>
Date: 02/19/2007 12:25:00
>Synopsis: interrupt handler ext_intr for edge triggered IRQs, only?
>Arrival-Date: Mon Feb 19 12:25:00 +0000 2007
>Originator: Gernot Fussan
For the PowerPC-arch the machine-depending main interrupt handler ("ext_intr()") doesn't work correctly for level-triggered interrupts, as re-enabling interrupting before calling the interrupt-specific routine causes a re-jump into the ext_intr() with marking the second jump as a "pending" interrupt. So, every interrupt handler is called twice per hard-interrupt, always!
Why was it implemented like that?
Can anybody help here?
Run a kernel profiling and compare number of calls of your hardware interrupt rountine and the (expected) amount of hardware interrupts really received during the profiling time.
Level-triggered interrupts will always interrupt when set and enabled.
Todo: Disable the currently processed (level-triggered) interrupt BEFORE re-enable all interrupts (with mtmsr(msr|PSL_EE)) and during the processing of this interrupt, and re-enable this interrupt again right AFTER its processing, after it's been unset.