/* * Called with interrupts enabled. */ void acpicpu_md_cstate_enter(int method, int state) { struct cpu_info *ci = curcpu(); KASSERT(ci->ci_ilevel == IPL_NONE); switch (method) { case ACPICPU_C_STATE_FFH: x86_monitor(&ci->ci_want_resched, 0, 0); if (__predict_false(ci->ci_want_resched != 0)) return; x86_mwait((state - 1) << 4, 0); break; case ACPICPU_C_STATE_HALT: x86_disable_intr(); if (__predict_false(ci->ci_want_resched != 0)) { x86_enable_intr(); return; } x86_stihlt(); break; } }
static inline void acpi_cstate_ffh_enter(CpuidleCstate *cState) { cpu_ent *cpu = get_cpu_struct(); if (cpu->invoke_scheduler) return; x86_monitor((void *)&cpu->invoke_scheduler, 0, 0); if (!cpu->invoke_scheduler) x86_mwait((unsigned long)cState->pData, 1); }