int _splraise(int newipl) { struct cpu_info * const ci = curcpu(); const int oldipl = ci->ci_cpl; KASSERT(newipl < NIPL); if (newipl > ci->ci_cpl) { pic_set_priority(ci, newipl); } return oldipl; }
void pic_do_pending_ints(register_t psw, int newipl, void *frame) { struct cpu_info * const ci = curcpu(); if (__predict_false(newipl == IPL_HIGH)) { KASSERTMSG(ci->ci_cpl == IPL_HIGH, "cpl %d", ci->ci_cpl); return; } while ((pic_pending_ipls & ~__BIT(newipl)) > __BIT(newipl)) { KASSERT(pic_pending_ipls < __BIT(NIPL)); for (;;) { int ipl = 31 - __builtin_clz(pic_pending_ipls); KASSERT(ipl < NIPL); if (ipl <= newipl) break; pic_set_priority(ci, ipl); pic_list_deliver_irqs(psw, ipl, frame); pic_list_unblock_irqs(); } } if (ci->ci_cpl != newipl) pic_set_priority(ci, newipl); }