bool Generic_obj_space<SPACE>::v_lookup(Addr const &virt, Phys_addr *phys = 0, Size *size = 0, unsigned *attribs = 0) { if (size) size->set_value(1); Entry *cap; if (Optimize_local && mem_space() == Mem_space::current_mem_space(current_cpu())) cap = cap_virt(virt.value()); else cap = get_cap(virt.value()); if (EXPECT_FALSE(!cap)) { if (size) size->set_value(Caps_per_page); return false; } if (Optimize_local) { Capability c = Mem_layout::read_special_safe((Capability*)cap); if (phys) *phys = c.obj(); if (c.valid() && attribs) *attribs = c.rights(); return c.valid(); } else { Obj::set_entry(virt, cap); if (phys) *phys = cap->obj(); if (cap->valid() && attribs) *attribs = cap->rights(); return cap->valid(); } }
Obj_space_virt<SPACE>::v_delete(V_pfn virt, Order size, L4_fpage::Rights 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 L4_fpage::Rights(0); Capability cap = Mem_layout::read_special_safe((Capability*)c); if (!cap.valid()) return L4_fpage::Rights(0); } else c = get_cap(virt); if (c && c->valid()) { if (page_attribs & L4_fpage::Rights::R()) c->invalidate(); else c->del_rights(page_attribs & L4_fpage::Rights::CWSD()); } return L4_fpage::Rights(0); }
unsigned long Generic_obj_space<SPACE>::v_delete(Page_number virt, Size size, unsigned long page_attribs = L4_fpage::CRWSD) { (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 0; Capability cap = Mem_layout::read_special_safe((Capability*)c); if (!cap.valid()) return 0; } else c = get_cap(virt.value()); if (c && c->valid()) { if (page_attribs & L4_fpage::R) c->invalidate(); else c->del_rights(page_attribs & L4_fpage::CWSD); } return 0; }
Obj_space_phys<SPACE>::v_lookup(V_pfn const &virt, Phys_addr *phys, Page_order *size, Attr *attribs) { if (size) *size = Page_order(0); Entry *cap = get_cap(virt); if (EXPECT_FALSE(!cap)) { if (size) *size = Page_order(Obj::Caps_per_page_ld2); return false; } Capability c = *cap; Obj::set_entry(virt, cap); if (phys) *phys = c.obj(); if (c.valid() && attribs) *attribs = cap->rights(); return c.valid(); }
bool Generic_obj_space<SPACE>::v_lookup(Addr const &virt, Phys_addr *phys = 0, Size *size = 0, unsigned *attribs = 0) { if (size) *size = Size::create(1); Entry *cap = get_cap(virt.value()); if (EXPECT_FALSE(!cap)) { if (size) *size = Size::create(Caps_per_page); return false; } Capability c = *cap; Obj::set_entry(virt, cap); if (phys) *phys = c.obj(); if (c.valid() && attribs) *attribs = cap->rights(); return c.valid(); }
Obj_space_virt<SPACE>::v_lookup(V_pfn const &virt, Phys_addr *phys, Page_order *size, Attr *attribs) { if (size) *size = Order(0); Entry *cap; if (Optimize_local && SPACE::mem_space(this) == Mem_space::current_mem_space(current_cpu())) cap = cap_virt(virt); else cap = get_cap(virt); if (EXPECT_FALSE(!cap)) { if (size) *size = Order(Obj::Caps_per_page_ld2); return false; } if (Optimize_local) { Capability c = Mem_layout::read_special_safe((Capability*)cap); if (phys) *phys = c.obj(); if (c.valid() && attribs) *attribs = Attr(c.rights()); return c.valid(); } else { Obj::set_entry(virt, cap); if (phys) *phys = cap->obj(); if (cap->valid() && attribs) *attribs = Attr(cap->rights()); return cap->valid(); } }
Obj_space_phys<SPACE>::v_delete(V_pfn virt, Page_order size, L4_fpage::Rights page_attribs = L4_fpage::Rights::FULL()) { (void)size; assert (size == Page_order(0)); Capability *c = get_cap(virt); if (c && c->valid()) { if (page_attribs & L4_fpage::Rights::R()) c->invalidate(); else c->del_rights(page_attribs); } return L4_fpage::Rights(0); }
unsigned long Generic_obj_space<SPACE>::v_delete(Page_number virt, Size size, unsigned long page_attribs = L4_fpage::RWX) { (void)size; assert (size.value() == 1); Capability *c = get_cap(virt.value()); if (c && c->valid()) { if (page_attribs & L4_fpage::R) c->invalidate(); else c->del_rights(page_attribs & L4_fpage::WX); } return 0; }