Пример #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 */
	}
}
Пример #2
0
/**
 * 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;
}
Пример #3
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;
}