Beispiel #1
0
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 */
	}
}
Beispiel #2
0
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;
}