4 #include "l4_msg_item.h"
25 explicit Capability(Mword v) : _obj(v) {}
26 Kobject_iface *obj() const { return (Kobject_iface *)(_obj & ~3UL); }
27 //void obj(Phys_addr obj) { _obj = Mword(obj); }
28 void set(Kobject_iface *obj, unsigned char rights)
29 { _obj = Mword(obj) | rights; }
30 bool valid() const { return _obj; }
31 void invalidate() { _obj = 0; }
32 unsigned char rights() const { return _obj & 3; }
33 void add_rights(unsigned char r) { _obj |= r & L4_fpage::CWS; }
34 void del_rights(unsigned char r) { _obj &= ~(r & L4_fpage::CWS); }
36 bool operator == (Capability const &c) const { return _obj == c._obj; }
40 * Tn the case of a flat copy model for capabilities, we have some
41 * extra mapping information directly colocated within the cap tables.
45 friend class ::Kobject_mapdb;
46 friend class ::Jdb_mapdb;
51 Delete = L4_fpage::CD,
54 Initial_flags = Delete | Ref_cnt | L4_msg_item::C_ctl_rights
63 Mapping() : _flags(0) {}
64 // fake this really badly
65 Mapping *parent() { return this; }
66 Mword delete_rights() const { return _flags & Delete; }
67 Mword ref_cnt() const { return _flags & Ref_cnt; }
69 void put_as_root(Mapping **root_ptr)
72 _flags = Initial_flags;
79 class Entry : public Capability, public Mapping
83 explicit Entry(Mword v) : Capability(v) {}
85 unsigned rights() const
86 { return Capability::rights() | (_flags & ~3); }
88 void set(Kobject_iface *obj, unsigned char rights)
90 Capability::set(obj, rights & 3);
91 _flags = rights & 0xf8;
93 void add_rights(unsigned char r)
95 Capability::add_rights(r & 3);
99 void del_rights(unsigned char r)
101 Capability::del_rights(r & 3);
102 _flags &= ~(r & 0xf8);
113 Cap_addr(Page_number a, Entry *c) : _a(a), _c(c) {}
115 explicit Cap_addr(Page_number a) : _a(a), _c(0) {}
116 explicit Cap_addr(Address adr) : _a(adr), _c(0) {}
118 Address value() const { return _a.value(); }
119 void set_entry(Entry *e) const { _c = e; }
121 bool operator == (Cap_addr const &o) const { return _a == o._a; }
122 bool operator < (Cap_addr const &o) const { return _a < o._a; }
123 bool operator > (Cap_addr const &o) const { return _a > o._a; }
125 void operator += (Page_number o) { _a += o; }
126 void operator += (Cap_addr const &o) { operator += (o._a); }
128 Cap_addr operator + (Page_number o) const { return Cap_addr(_a + o); }
130 Cap_addr offset(Page_number s) const { return Cap_addr(_a.offset(s)); }
131 Cap_addr trunc(Page_number s) const
133 if (s == Page_number(1))
135 return Cap_addr(_a.trunc(s));
138 operator Page_number::Type_conversion_error const * () const
139 { return (Page_number::Type_conversion_error const *)_a; }
141 operator Page_number () const { return _a; }
144 inline void set_entry(Cap_addr const &ca, Entry *e)
150 template< typename SPACE >
151 class Generic_obj_space
153 friend class Jdb_obj_space;
154 friend class Jdb_tcb;
157 enum { Caps_per_page = Config::PAGE_SIZE / sizeof(Obj::Entry) };
159 static char const * const name;
161 typedef Obj::Capability Capability;
162 typedef Obj::Entry Entry;
163 typedef Kobject *Reap_list;
164 typedef Kobject_iface *Phys_addr;
165 typedef Obj::Cap_addr Addr;
166 typedef Page_count Size;
170 Need_insert_tlb_flush = 0,
171 Need_xcpu_tlb_flush = 0,
174 Map_superpage_size = 1,
175 Map_max_address = 1UL << 20, /* 20bit obj index */
182 Insert_ok = 0, ///< Mapping was added successfully.
183 Insert_warn_exists, ///< Mapping already existed
184 Insert_warn_attrib_upgrade, ///< Mapping already existed, attribs upgrade
185 Insert_err_nomem, ///< Couldn't alloc new page table
186 Insert_err_exists ///< A mapping already exists at the target addr
191 /// A mask which contains all mask bits
192 //Page_user_accessible = 1,
198 static Address superpage_size() { return Map_superpage_size; }
199 static bool has_superpages() { return false; }
200 static Phys_addr page_address(Phys_addr o, Size) { return o; }
201 static Phys_addr subpage_address(Phys_addr addr, Size) { return addr; }
202 static Mword phys_to_word(Phys_addr a) { return Mword(a); }
205 template< typename SPACE >
206 char const * const Generic_obj_space<SPACE>::name = "Obj_space";
209 // -------------------------------------------------------------------------
212 PUBLIC template< typename SPACE >
215 Generic_obj_space<SPACE>::xlate_flush(unsigned char rights)
218 PUBLIC template< typename SPACE >
221 Generic_obj_space<SPACE>::is_full_flush(unsigned char rights)
222 { return rights & L4_fpage::R; }
224 PUBLIC template< typename SPACE >
227 Generic_obj_space<SPACE>::xlate_flush_result(Mword /*attribs*/)
230 PUBLIC template< typename SPACE >
231 inline NEEDS[Generic_obj_space::caps_free]
232 Generic_obj_space<SPACE>::~Generic_obj_space()
237 PUBLIC template< typename SPACE >
240 Generic_obj_space<SPACE>::v_fabricate(Addr const &address,
241 Phys_addr *phys, Size *size,
242 unsigned* attribs = 0)
244 return Generic_obj_space::v_lookup(address, phys, size, attribs);
248 PUBLIC template< typename SPACE >
251 Generic_obj_space<SPACE>::tlb_flush ()
254 PUBLIC template< typename SPACE >
256 typename Generic_obj_space<SPACE>::Addr
257 Generic_obj_space<SPACE>::canonize(Addr v)
260 // ------------------------------------------------------------------------
263 EXTENSION class Generic_obj_space
269 Generic_obj_space<SPACE> *s;
275 // ------------------------------------------------------------------------
276 IMPLEMENTATION [debug]:
278 #include "dbg_page_info.h"
281 PUBLIC template< typename SPACE >
284 Generic_obj_space<SPACE>::add_dbg_info(void *p, Generic_obj_space *s,
287 Dbg_page_info *info = new Dbg_page_info(Virt_addr((Address)p));
289 if (EXPECT_FALSE(!info))
291 WARN("oom: could not allocate debug info fo page %p\n", p);
295 info->info<Dbg_info>()->s = s;
296 info->info<Dbg_info>()->offset = (cap / Caps_per_page) * Caps_per_page;
297 Dbg_page_info::table().insert(info);
300 PUBLIC template< typename SPACE >
303 Generic_obj_space<SPACE>::remove_dbg_info(void *p)
305 Dbg_page_info *info = Dbg_page_info::table().remove(Virt_addr((Address)p));
309 WARN("could not find debug info for page %p\n", p);
313 // ------------------------------------------------------------------------
314 IMPLEMENTATION [!debug]:
316 PUBLIC template< typename SPACE > inline
319 Generic_obj_space<SPACE>::add_dbg_info(void *, Generic_obj_space *, Address)
322 PUBLIC template< typename SPACE > inline
325 Generic_obj_space<SPACE>::remove_dbg_info(void *)