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