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; }
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; }
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); }