ER chg_ipm(PRI intpri) { ER ercd; LOG_CHG_IPM_ENTER(intpri); CHECK_TSKCTX_UNL(); CHECK_INTPRI_CHGIPM(intpri); t_lock_cpu(); t_set_ipm(intpri); if (intpri == TIPM_ENAALL) { ipmflg = true; if (!disdsp) { dspflg = true; if (p_runtsk != p_schedtsk) { dispatch(); } } if (p_runtsk->enatex && p_runtsk->texptn != 0U) { call_texrtn(); } } else { ipmflg = false; dspflg = false; } ercd = E_OK; t_unlock_cpu(); error_exit: LOG_CHG_IPM_LEAVE(ercd); return(ercd); }
ER chg_ipm(PRI intpri) { bool_t locked; ER ercd; LOG_CHG_IPM_ENTER(intpri); CHECK_TSKCTX(); CHECK_INTPRI_CHGIPM(intpri); locked = t_sense_lock(); if (!locked) { t_lock_cpu(); } t_set_ipm(intpri); if (intpri != TIPM_ENAALL) { dspflg = false; } else if (!disdsp) { dspflg = true; if (p_runtsk != p_schedtsk) { dispatch(); } } ercd = E_OK; if (!locked) { t_unlock_cpu(); } error_exit: LOG_CHG_IPM_LEAVE(ercd); return(ercd); }
/* * 割込みマスクの変更 * * PowerPCコアにはIPMがなく、割込みコントローラのIPMのみ扱って * いる点に注意 * * chg_ipm を使って NMI以外のすべての割込みを禁止できるかどうか * は割込みコントローラに依存する。 * NMI以外のすべての割込みを禁止したい場合には,loc_cpuによりCPU * ロック状態にすればよい. * IPMによって一部の割込みがマスクされている時にも,タスクディス * パッチは保留されない.IPMは,タスクディスパッチによって,新し * く実行状態になったタスクへ引き継がれる.そのため,タスクが実 * 行中に,別のタスクによって IPMが変更される場合がある.JSPカー * ネルでは,IPMの変更はタスク例外処理ルーチンによっても起こるが, * これによって扱いが難しくなる状況は少ないと思われる.IPM の値 * によってタスクディスパッチを禁止したい場合には,dis_dspを併用 * すればよい. */ SYSCALL ER chg_ipm(IPM ipm) { ER ercd; LOG_CHG_IPM_ENTER(ipm); /* ICU依存 */ CHECK_TSKCTX_UNL(); CHECK_IPM(ipm); /* ICU依存 */ t_lock_cpu(); CHG_IPM(ipm); /* ICU依存 */ ercd = E_OK; t_unlock_cpu(); exit: LOG_CHG_IPM_LEAVE(ercd); return(ercd); }
ER chg_ipm(PRI intpri) { ER ercd; LOG_CHG_IPM_ENTER(intpri); CHECK_TSKCTX_UNL(); CHECK_INTPRI_CHGIPM(intpri); CHECK_ACPTN(sysstat_acvct.acptn2); t_lock_cpu(); t_set_ipm(intpri); if (intpri == TIPM_ENAALL) { ipmflg = true; if (!disdsp) { dspflg = true; if (p_runtsk != p_schedtsk) { dispatch(); } } if (p_runtsk->enatex && p_runtsk->texptn != 0U && rundom == TACP_KERNEL && p_runtsk->svclevel == 0U) { call_texrtn_stask(); } } else { ipmflg = false; dspflg = false; } ercd = E_OK; t_unlock_cpu(); error_exit: LOG_CHG_IPM_LEAVE(ercd); return(ercd); }