Exemplo n.º 1
0
vaddr_t mman_alias_page(spdid_t s_spd, vaddr_t s_addr, spdid_t d_spd, vaddr_t d_addr)
{
	struct mapping *m, *n;
	vaddr_t ret = 0;

	LOCK();
	mm_init();
	m = mapping_lookup(s_spd, s_addr);
	if (!m) goto done; 	/* -EINVAL */
	n = mapping_crt(m, m->f, d_spd, d_addr);
	if (!n) goto done;

	assert(n->addr  == d_addr);
	assert(n->spdid == d_spd);
	assert(n->p     == m);
	ret = d_addr;
done:
	UNLOCK();
	return ret;
}
Exemplo n.º 2
0
vaddr_t __mman_alias_page(spdid_t s_spd, vaddr_t s_addr, u32_t d_spd_flags, vaddr_t d_addr)
{
	struct mapping *m, *n;
	vaddr_t ret = 0;
	spdid_t d_spd;
	int flags;

	d_spd = d_spd_flags >> 16;
	flags = d_spd_flags & 0xFFFF;
	LOCK();
	m = mapping_lookup(s_spd, s_addr);
	if (!m) goto done; 	/* -EINVAL */
	n = mapping_crt(m, m->f, d_spd, d_addr, flags);
	if (!n) goto done;

	assert(n->addr  == d_addr);
	assert(n->spdid == d_spd);
	assert(n->p     == m);
	ret = d_addr;
done:
	UNLOCK();
	return ret;
}
Exemplo n.º 3
0
vaddr_t mman_get_page(spdid_t spd, vaddr_t addr, int flags)
{
	struct frame *f;
	struct mapping *m = NULL;
	vaddr_t ret = -1;

	LOCK();
	mm_init();
	f = frame_alloc();
	if (!f) goto done; 	/* -ENOMEM */
	frame_ref(f);
	m = mapping_crt(NULL, f, spd, addr);
	if (!m) goto dealloc;
	assert(m->addr == addr);
	assert(m->spdid == spd);
	assert(m == mapping_lookup(spd, addr));
	ret = m->addr;
done:
	UNLOCK();
	return ret;
dealloc:
	frame_deref(f);
	goto done;		/* -EINVAL */
}