9 /** A mapping database.
16 typedef Obj_space::Phys_addr Phys_addr;
17 typedef Obj_space::Addr Vaddr;
18 typedef Obj::Mapping Mapping;
23 friend class Kobject_mapdb;
24 friend class Kobject_mapdb::Iterator;
25 Kobject_mappable* frame;
28 inline size_t size() const;
32 * We'll never iterate over some thing, because we have
33 * no child relationship for capability passing.
38 inline Mapping* operator->() const { return 0; }
39 inline Mapping* operator * () const { return 0; }
40 inline operator Mapping*() const { return 0; }
43 Iterator(Frame const &, Mapping *, Page_number, Page_number) {}
45 Iterator &operator ++ () { return *this; }
50 // ---------------------------------------------------------------------------
57 #include "std_macros.h"
61 Kobject_mapdb::lookup(Space *, Vaddr va, Phys_addr obj,
62 Mapping** out_mapping, Frame* out_lock)
64 Kobject_mappable *rn = obj->map_root();
66 if (va._c->obj() == obj)
79 Kobject_mapdb::valid_address(Phys_addr obj)
86 Kobject_mapdb::vaddr(const Frame&, Mapping*)
87 { return Page_number(0); }
90 Kobject_mapdb::Mapping *
91 Kobject_mapdb::check_for_upgrade(Obj_space::Phys_addr,
96 // Hm we never or seldomly do upgrades on cap anyway
101 Kobject_mapdb::Mapping *
102 Kobject_mapdb::insert(const Frame&, Mapping*, Space *,
103 Vaddr va, Obj_space::Phys_addr o, Page_count size)
107 assert (size.value() == 1);
110 Kobject_mappable *rn = o->map_root();
111 //LOG_MSG_3VAL(current(), "ins", o->dbg_id(), (Mword)m, (Mword)va._a.value());
114 Obj::Entry *e = static_cast<Obj::Entry*>(m);
115 if (e->ref_cnt()) // counted
123 Kobject_mapdb::grant(const Frame &f, Mapping *sm, Space *,
126 Obj::Entry *re = va._c;
127 Obj::Entry *se = static_cast<Obj::Entry*>(sm);
128 //LOG_MSG_3VAL(current(), "gra", f.frame->dbg_id(), (Mword)sm, (Mword)va._a.value());
130 // replace the source cap with the destination cap in the list
131 Mapping::List::replace(se, re);
133 if (se->ref_cnt() && !re->ref_cnt())
141 Kobject_mapdb::free (const Frame& f)
143 f.frame->_lock.clear();
148 Kobject_mapdb::flush(const Frame& f, Mapping *m, L4_map_mask mask,
149 Page_number, Page_number)
151 //LOG_MSG_3VAL(current(), "unm", f.frame->dbg_id(), (Mword)m, 0);
152 if (!mask.self_unmap())
157 if (mask.do_delete() && m->delete_rights())
161 Obj::Entry *e = static_cast<Obj::Entry*>(m);
162 if (e->ref_cnt()) // counted
163 flush = --f.frame->_cnt <= 0;
166 Mapping::List::remove(m);
171 for (Mapping::List::Iterator i = f.frame->_root.begin();
172 i != Mapping::List::end(); ++i)
174 Obj::Entry *e = static_cast<Obj::Entry*>(*i);
175 if (e->ref_cnt()) // counted
179 f.frame->_root.clear();