typename Generic_obj_space<SPACE>::Status Generic_obj_space<SPACE>::v_insert(Phys_addr phys, Addr const &virt, Size size, unsigned char page_attribs) { (void)size; assert (size.value() == 1); Entry *c = get_cap(virt.value()); if (!c && !(c = caps_alloc(virt.value()))) return Insert_err_nomem; assert (size.value() == 1); if (c->valid()) { if (c->obj() == phys) { if (EXPECT_FALSE(c->rights() == page_attribs)) return Insert_warn_exists; c->add_rights(page_attribs); return Insert_warn_attrib_upgrade; } else return Insert_err_exists; } Obj::set_entry(virt, c); c->set(phys, page_attribs); return Insert_ok; }
Obj_space_phys<SPACE>::v_insert(Phys_addr phys, V_pfn const &virt, Page_order size, Attr page_attribs) { (void)size; assert (size == Page_order(0)); Entry *c = get_cap(virt); if (!c && !(c = caps_alloc(virt))) return Obj::Insert_err_nomem; if (c->valid()) { if (c->obj() == phys) { if (EXPECT_FALSE(c->rights() == page_attribs)) return Obj::Insert_warn_exists; c->add_rights(page_attribs); return Obj::Insert_warn_attrib_upgrade; } else return Obj::Insert_err_exists; } Obj::set_entry(virt, c); c->set(phys, page_attribs); return Obj::Insert_ok; }
typename Generic_obj_space<SPACE>::Status Generic_obj_space<SPACE>::v_insert(Phys_addr phys, Addr const &virt, Size size, unsigned char page_attribs) { (void)size; assert (size.value() == 1); Entry *c; if (Optimize_local && mem_space() == Mem_space::current_mem_space(current_cpu())) { c = cap_virt(virt.value()); if (!c) return Insert_err_nomem; Capability cap; if (!Mem_layout::read_special_safe((Capability*)c, cap) && !caps_alloc(virt.value())) return Insert_err_nomem; } else { c = alien_lookup(virt.value()); if (!c && !(c = caps_alloc(virt.value()))) return Insert_err_nomem; Obj::set_entry(virt, c); } if (c->valid()) { if (c->obj() == phys) { if (EXPECT_FALSE(c->rights() == page_attribs)) return Insert_warn_exists; c->add_rights(page_attribs); return Insert_warn_attrib_upgrade; } else return Insert_err_exists; } c->set(phys, page_attribs); return Insert_ok; }
Obj_space_virt<SPACE>::v_insert(Phys_addr phys, V_pfn const &virt, Order size, Attr page_attribs) { (void)size; assert (size == Order(0)); Entry *c; if (Optimize_local && SPACE::mem_space(this) == Mem_space::current_mem_space(current_cpu())) { c = cap_virt(virt); if (!c) return Obj::Insert_err_nomem; Capability cap; if (!Mem_layout::read_special_safe((Capability*)c, cap) && !caps_alloc(virt)) return Obj::Insert_err_nomem; } else { c = get_cap(virt); if (!c && !(c = caps_alloc(virt))) return Obj::Insert_err_nomem; Obj::set_entry(virt, c); } if (c->valid()) { if (c->obj() == phys) { if (EXPECT_FALSE(c->rights() == page_attribs)) return Obj::Insert_warn_exists; c->add_rights(page_attribs); return Obj::Insert_warn_attrib_upgrade; } else return Obj::Insert_err_exists; } c->set(phys, page_attribs); return Obj::Insert_ok; }