static struct mapping * mapping_lookup(spdid_t spdid, vaddr_t addr) { struct comp_vas *cv = cvas_lookup(spdid); if (!cv) return NULL; return cvect_lookup(cv->pages, addr >> PAGE_SHIFT); }
/* Make a child mapping */ static struct mapping * mapping_crt(struct mapping *p, struct frame *f, spdid_t dest, vaddr_t to, int flags) { struct comp_vas *cv = cvas_lookup(dest); struct mapping *m = NULL; long idx = to >> PAGE_SHIFT; assert(!p || p->f == f); assert(dest && to); /* no vas structure for this spd yet... */ if (!cv) { cv = cvas_alloc(dest); if (!cv) goto done; assert(cv == cvas_lookup(dest)); } assert(cv->pages); if (cvect_lookup(cv->pages, idx)) goto collision; cvas_ref(cv); m = cslab_alloc_mapping(); if (!m) goto collision; if (cos_mmap_cntl(COS_MMAP_GRANT, flags, dest, to, frame_index(f))) { printc("mem_man: could not grant at %x:%d\n", dest, (int)to); goto no_mapping; } mapping_init(m, dest, to, p, f); assert(!p || frame_nrefs(f) > 0); frame_ref(f); assert(frame_nrefs(f) > 0); if (cvect_add(cv->pages, m, idx)) BUG(); done: return m; no_mapping: cslab_free_mapping(m); collision: cvas_deref(cv); m = NULL; goto done; }
static struct comp_vas * cvas_alloc(spdid_t spdid) { struct comp_vas *cv; assert(!cvas_lookup(spdid)); cv = cslab_alloc_cvas(); if (!cv) goto done; cv->pages = cvect_alloc(); if (!cv->pages) goto free; cvect_init(cv->pages); cvect_add(&comps, cv, spdid); cv->nmaps = 0; done: return cv; free: cslab_free_cvas(cv); cv = NULL; goto done; }
static void __mapping_destroy(struct mapping *m) { struct comp_vas *cv; int idx; assert(m); assert(EMPTY_LIST(m, _s, s_)); assert(m->p == NULL && m->c == NULL); cv = cvas_lookup(m->spdid); assert(cv && cv->pages); assert(m == cvect_lookup(cv->pages, m->addr >> PAGE_SHIFT)); cvect_del(cv->pages, m->addr >> PAGE_SHIFT); cvas_deref(cv); idx = cos_mmap_cntl(COS_MMAP_REVOKE, 0, m->spdid, m->addr, 0); assert(idx == frame_index(m->f)); frame_deref(m->f); cslab_free_mapping(m); }