root_stall_after_handler is a fixup for the root state, required when
CONFIG_TRACE_IRQFLAGS is enabled. It then calls local_irq_disable which
reenables hard irqs as a side effect. This causes all types of
corruptions after return from __ipipe_sync_stage which is supposed to
leave hard irqs off.

Fix it by reordering root_stall_after_handler and local_irq_disable_hw.

Signed-off-by: Jan Kiszka <[email protected]>
---
 kernel/ipipe/core.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/ipipe/core.c b/kernel/ipipe/core.c
index 9ad7757..9aa4800 100644
--- a/kernel/ipipe/core.c
+++ b/kernel/ipipe/core.c
@@ -1277,14 +1277,14 @@ void __ipipe_sync_stage(void)
                        irq_enter();
                        ipd->irqs[irq].handler(irq, ipd->irqs[irq].cookie);
                        irq_exit();
-                       local_irq_disable_hw();
                        root_stall_after_handler();
+                       local_irq_disable_hw();
                        while (__ipipe_check_root_resched())
                                __ipipe_preempt_schedule_irq();
                } else {
                        __ipipe_do_root_xirq(ipd, irq);
-                       local_irq_disable_hw();
                        root_stall_after_handler();
+                       local_irq_disable_hw();
                }
 
                p = ipipe_cpudom_ptr(__ipipe_current_domain);
-- 
1.7.1

_______________________________________________
Adeos-main mailing list
[email protected]
https://mail.gna.org/listinfo/adeos-main

Reply via email to