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 */ } }
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; }