/* * This is our default idle handler. We need to disable * interrupts here to ensure we don't miss a wakeup call. */ static void default_idle(void) { #ifdef CONFIG_IPIPE ipipe_suspend_domain(); #endif local_irq_disable_hw(); if (!need_resched()) idle_with_irq_disabled(); local_irq_enable_hw(); }
void __ipipe_halt_root(void) { struct ipipe_percpu_domain_data *p; /* Emulate sti+hlt sequence over the root domain. */ local_irq_disable_hw(); p = ipipe_root_cpudom_ptr(); trace_hardirqs_on(); __clear_bit(IPIPE_STALL_FLAG, &p->status); if (unlikely(__ipipe_ipending_p(p))) { __ipipe_sync_pipeline(); local_irq_enable_hw(); } else { #ifdef CONFIG_IPIPE_TRACE_IRQSOFF ipipe_trace_end(0x8000000E); #endif /* CONFIG_IPIPE_TRACE_IRQSOFF */ asm volatile("sti; hlt": : :"memory"); } }