static void sys_thread_control(uint32_t *param1, uint32_t *param2) { l4_thread_t dest = param1[REG_R0]; l4_thread_t space = param1[REG_R1]; l4_thread_t pager = param1[REG_R3]; void *utcb = (void *) param2[0]; /* R4 */ mempool_t *utcb_pool = mempool_getbyid(mempool_search((memptr_t) utcb, UTCB_SIZE)); if (!utcb_pool || !(utcb_pool->flags & (MP_UR | MP_UW))) { /* Incorrect UTCB relocation */ return; } if (space != L4_NILTHREAD) { /* Creation of thread */ tcb_t *thr = thread_create(dest, utcb); thread_space(thr, space, utcb); thr->utcb->t_pager = pager; } else { /* TODO: Thread destroy */ } }
/** * Create and initialize new fpage * @param base base address of fpage * @param shift (1 << shift) - fpage size * @param mpid - id of mpool * */ fpage_t* create_fpage(memptr_t base, size_t shift, int mpid) { fpage_t* fpage = (fpage_t*) ktable_alloc(&fpage_table); assert(fpage != NULL); fpage->as_next = NULL; fpage->map_next = fpage; /*That is first fpage in mapping*/ fpage->fpage.mpid = mpid; fpage->fpage.flags = 0; fpage->fpage.rwx = MP_USER_PERM(mempool_getbyid(mpid)->flags); fpage->fpage.base = base; fpage->fpage.shift = shift; if(mempool_getbyid(mpid)->flags & MP_MAP_ALWAYS) fpage->fpage.flags |= FPAGE_ALWAYS; return fpage; }
int assign_fpages_ext(int mpid, as_t* as, memptr_t base, size_t size, fpage_t** pfirst, fpage_t** plast) { assert(size > 0); /*if mpid is unknown, search using base addr*/ if(mpid == -1) { if((mpid = mempool_search(base, size)) == -1) { /* Cannot find appropriate mempool, return error*/ return -1; } } dbg_printf(DL_MEMORY, "MEM: fpage chain %s [b:%p, sz:%p] as %p\n", mempool_getbyid(mpid)->name, base, size, as); create_fpage_chain(mempool_align(mpid, base), mempool_align(mpid, size), mpid, pfirst, plast); if(as) insert_fpage_chain_to_as(as, *pfirst, *plast); return 0; }