Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
/*
 *  割込みマスクの変更
 *
 *  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);
}
Esempio n. 4
0
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);
}