Ejemplo n.º 1
0
/* システム用イベント生成 */
SYSEVT_HANDLE SysEvt_Create(int iAttr)
{
	T_CFLG cflg;
	ER_ID  erid;

	/* ロック用セマフォ生成 */
	cflg.flgatr  = TA_TFIFO | ((iAttr & SYSEVT_ATTR_AUTOCLEAR) ? TA_CLR : 0);
	cflg.iflgptn = 0;
	erid = acre_flg(&cflg);
	if ( erid < 0 )
	{
		return SYSEVT_HANDLE_NULL;
	}

	return (SYSMTX_HANDLE)erid;
}
Ejemplo n.º 2
0
static ER
handle_module_cfg_tab(T_LDM_CAN *ldm_can) {
	// TODO: check cfg table memory
	assert(ldm_can->cfg_entry_num > 0 && ldm_can->cfg_table != NULL);
	assert(probe_ldm_memory(ldm_can->cfg_table, sizeof(MOD_CFG_ENTRY) * ldm_can->cfg_entry_num, ldm_can));

	ER_ID ercd = E_OK;

	// Creation stage
	for(SIZE i = 0; i < ldm_can->cfg_entry_num && ercd == E_OK; ++i) {
		MOD_CFG_ENTRY *ent = &ldm_can->cfg_table[i];
		switch(ent->sfncd) {
		case TSFN_CRE_TSK: {
            syslog(LOG_DEBUG, "%s(): MOD_CFG_ENTRY TSFN_CRE_TSK", __FUNCTION__);
			assert(probe_ldm_memory(ent->argument, sizeof(T_CTSK), ldm_can));
			assert(probe_ldm_memory(ent->retvalptr, sizeof(ID), ldm_can));
			T_CTSK pk_ctsk = *(T_CTSK*)ent->argument;
			assert(probe_ldm_memory(pk_ctsk.stk, pk_ctsk.stksz, ldm_can)); // Check user stack
			assert(pk_ctsk.sstk == NULL);                                  // Check system stack
			pk_ctsk.tskatr &= ~TA_ACT;                                     // Clear TA_ACT
			assert(get_atrdomid(pk_ctsk.tskatr) == TDOM_SELF);             // Check original DOMID
			pk_ctsk.tskatr |= TA_DOM(ldm_can->domid);                      // Set new DOMID
			pk_ctsk.task = app_tsk_wrapper;                                // Use task wrapper
			pk_ctsk.exinf = (intptr_t)ent->argument;
			ercd = acre_tsk(&pk_ctsk);
			assert(ercd > 0);
			if(ercd > 0) {
				// Store ID
			    *(ID*)ent->retvalptr = ercd;

			    // Setup task exception routine
			    T_DTEX dtex;
			    dtex.texatr = TA_NULL;
			    dtex.texrtn = app_tex_rtn;
			    ercd = def_tex(ercd, &dtex);
			    assert(ercd == E_OK);
#if defined(DEBUG)
			    syslog(LOG_NOTICE, "%s(): Task (tid = %d) created.", __FUNCTION__, *(ID*)ent->retvalptr);
#endif

			    ercd = E_OK;
			}
			break; }

		case TSFN_CRE_SEM: {
		    syslog(LOG_DEBUG, "%s(): MOD_CFG_ENTRY TSFN_CRE_SEM", __FUNCTION__);
            assert(probe_ldm_memory(ent->argument, sizeof(T_CSEM), ldm_can));
            assert(probe_ldm_memory(ent->retvalptr, sizeof(ID), ldm_can));
            T_CSEM pk_csem = *(T_CSEM*)ent->argument;
            // TODO: check pk_csem
            ercd = acre_sem(&pk_csem);
            assert(ercd > 0);
            if(ercd > 0) {
                // Store ID
                *(ID*)ent->retvalptr = ercd;

#if defined(DEBUG)
                syslog(LOG_NOTICE, "%s(): Semaphore (id = %d) is created.", __FUNCTION__, *(ID*)ent->retvalptr);
#endif

                ercd = E_OK;
            }
		    break; }

        case TSFN_CRE_FLG: {
            syslog(LOG_DEBUG, "%s(): MOD_CFG_ENTRY TSFN_CRE_FLG", __FUNCTION__);
            assert(probe_ldm_memory(ent->argument, sizeof(T_CFLG), ldm_can));
            assert(probe_ldm_memory(ent->retvalptr, sizeof(ID), ldm_can));
            T_CFLG pk_cflg = *(T_CFLG*)ent->argument;
            // TODO: check pk_csem
            ercd = acre_flg(&pk_cflg);
            assert(ercd > 0);
            if(ercd > 0) {
                // Store ID
                *(ID*)ent->retvalptr = ercd;

#if defined(DEBUG)
                syslog(LOG_NOTICE, "%s(): Event flag (id = %d) is created.", __FUNCTION__, *(ID*)ent->retvalptr);
#endif

                ercd = E_OK;
            }
            break; }

		default:
		    syslog(LOG_ERROR, "%s(): Unsupported static function code %d.", __FUNCTION__, ent->sfncd);
		    ercd = E_OBJ;
		}
	}

	// Rollback stage
	// TODO: implement this
	assert(ercd == E_OK);
	syslog(LOG_DEBUG, "%s(): text paddr: 0x%x, data paddr: 0x%x", __FUNCTION__, ldm_can->text_mempool, ldm_can->data_mempool);

	// Acting stage
    for(SIZE i = 0; i < ldm_can->cfg_entry_num; ++i) {
        MOD_CFG_ENTRY *ent = &ldm_can->cfg_table[i];
        switch(ent->sfncd) {
        case TSFN_CRE_TSK: {
        	T_CTSK pk_ctsk = *(T_CTSK*)ent->argument;
        	if(pk_ctsk.tskatr & TA_ACT) {
        		ercd = act_tsk(*(ID*)ent->retvalptr);
            	assert(ercd == E_OK);
        	}
            break; }
        default:
            syslog(LOG_ERROR, "%s(): Unsupported static function code %d.", __FUNCTION__, ent->sfncd);
        }
    }

    return ercd;
}