Esempio n. 1
0
static void load_script( uint8_t *script, uint8_t size )
{
    codemem_t cm = ker_codemem_alloc(size, CODEMEM_TYPE_EXECUTABLE);
    ker_codemem_write( cm, THIS_MODULE_ID, script, size, 0);
    ker_codemem_flush( cm, THIS_MODULE_ID);
    post_short(script[0], THIS_MODULE_ID, MSG_LOADER_DATA_AVAILABLE, script[1], cm, 0);
    return;
}
Esempio n. 2
0
static int8_t handle_data(Message *msg)
{
	fetcher_fragment_t *f;
	int8_t ret = -EINVAL;
	fetcher_cam_t *cam;

	f = (fetcher_fragment_t*)msg->data;

	DEBUG_PID(KER_FETCHER_PID, "fetcher: get data, key = %d, frag_id = %d\n", f->key, f->frag_id);
	//msg_print(msg);

	if(f->key != fst->map.key) {
		DEBUG_PID(KER_FETCHER_PID,"version mis-match\n");
		return SOS_OK;
	}

	cam = (fetcher_cam_t *) ker_shm_get( KER_FETCHER_PID, f->key);
	if( cam == NULL ) {
		// XXX cannot find CAM...
		// TODO: need to inform upper layer...
		return -EINVAL;
	}
	if( (fst->map.bitmap[(f->frag_id) / 8] & (1 << ((f->frag_id) % 8))) == 0 ) {
		// we already have the fragment...
		return SOS_OK;
	}

	if((f->frag_id != 0) && ((fst->map.bitmap[0] & 0x01) != 0)
		&& (cam->fetchtype == FETCHTYPE_MODULE)) {
		// if the first fragment is not available, we drop the packet
		return SOS_OK;
	}

	ret = ker_codemem_write(cam->cm, KER_FETCHER_PID,
			f->fragment, FETCHER_FRAGMENT_SIZE,
			(code_addr_t)FETCHER_FRAGMENT_SIZE * f->frag_id);
	if(ret == SOS_SPLIT) {
		send_state.fragr = (fetcher_fragment_t*) ker_msg_take_data(KER_FETCHER_PID, msg);	
		f = send_state.fragr;
	} else if(ret != SOS_OK) {
		//DEBUG("codemem_write failed\n");
		return SOS_OK;
	}

	fst->map.bitmap[(f->frag_id) / 8] &= ~(1 << ((f->frag_id) % 8));
	check_map_and_post();
	return SOS_OK;
}
Esempio n. 3
0
static void start_experiment(uint16_t size)
{
	sos_cam_t key;
	loader_cam_t *cam;
	codemem_t cm;
	uint8_t buf[2];

	buf[0] = 128;
	buf[1] = 1;
	DEBUG_PID(KER_DFT_LOADER_PID, "start experiment: size = %d\n", size);
	cm = ker_codemem_alloc( size, CODEMEM_TYPE_EXECUTABLE);
	ker_codemem_write(cm, KER_DFT_LOADER_PID, buf, 2, 0);
	cam = ker_malloc(sizeof(loader_cam_t), KER_DFT_LOADER_PID);

	st.version_data->pam_ver[0]++;
	st.version_data->pam_size[0] = (size + (LOADER_SIZE_MULTIPLIER - 1)) / LOADER_SIZE_MULTIPLIER;
	st.version_data->version ++;

	key = ker_cam_key( KER_DFT_LOADER_PID, 0 );
	cam->fetcher.fetchtype = FETCHTYPE_DATA;
	cam->fetcher.cm = cm;
	ker_cam_add(key, cam);	
	restartInterval(0);
}