5 #include "l4_msg_item.h"
26 explicit Capability(Mword v) : _obj(v) {}
27 Kobject_iface *obj() const { return (Kobject_iface *)(_obj & ~3UL); }
28 //void obj(Phys_addr obj) { _obj = Mword(obj); }
29 void set(Kobject_iface *obj, unsigned char rights)
30 { _obj = Mword(obj) | rights; }
31 bool valid() const { return _obj; }
32 void invalidate() { _obj = 0; }
33 unsigned char rights() const { return _obj & 3; }
34 void add_rights(unsigned char r) { _obj |= r & L4_fpage::CWS; }
35 void del_rights(unsigned char r) { _obj &= ~(r & L4_fpage::CWS); }
37 bool operator == (Capability const &c) const { return _obj == c._obj; }
41 * Tn the case of a flat copy model for capabilities, we have some
42 * extra mapping information directly colocated within the cap tables.
44 class Mapping : public cxx::H_list_item
46 friend class ::Kobject_mapdb;
47 friend class ::Jdb_mapdb;
50 typedef cxx::H_list<Mapping> List;
54 Delete = L4_fpage::CD,
57 Initial_flags = Delete | Ref_cnt | L4_msg_item::C_ctl_rights
65 Mapping() : _flags(0) {}
66 // fake this really badly
67 Mapping *parent() { return this; }
68 Mword delete_rights() const { return _flags & Delete; }
69 Mword ref_cnt() const { return _flags & Ref_cnt; }
71 void put_as_root() { _flags = Initial_flags; }
75 class Entry : public Capability, public Mapping
79 explicit Entry(Mword v) : Capability(v) {}
81 unsigned rights() const
82 { return Capability::rights() | (_flags & ~3); }
84 void set(Kobject_iface *obj, unsigned char rights)
86 Capability::set(obj, rights & 3);
87 _flags = rights & 0xf8;
89 void add_rights(unsigned char r)
91 Capability::add_rights(r & 3);
95 void del_rights(unsigned char r)
97 Capability::del_rights(r & 3);
98 _flags &= ~(r & 0xf8);
109 Cap_addr(Page_number a, Entry *c) : _a(a), _c(c) {}
111 explicit Cap_addr(Page_number a) : _a(a), _c(0) {}
112 explicit Cap_addr(Address adr) : _a(adr), _c(0) {}
114 Address value() const { return _a.value(); }
115 void set_entry(Entry *e) const { _c = e; }
117 bool operator == (Cap_addr const &o) const { return _a == o._a; }
118 bool operator < (Cap_addr const &o) const { return _a < o._a; }
119 bool operator > (Cap_addr const &o) const { return _a > o._a; }
121 void operator += (Page_number o) { _a += o; }
122 void operator += (Cap_addr const &o) { operator += (o._a); }
124 Cap_addr operator + (Page_number o) const { return Cap_addr(_a + o); }
126 Cap_addr offset(Page_number s) const { return Cap_addr(_a.offset(s)); }
127 Cap_addr trunc(Page_number s) const
129 if (s == Page_number(1))
131 return Cap_addr(_a.trunc(s));
134 operator Page_number::Type_conversion_error const * () const
135 { return (Page_number::Type_conversion_error const *)_a; }
137 operator Page_number () const { return _a; }
140 inline void set_entry(Cap_addr const &ca, Entry *e)
146 template< typename SPACE >
147 class Generic_obj_space
149 friend class Jdb_obj_space;
150 friend class Jdb_tcb;
153 enum { Caps_per_page = Config::PAGE_SIZE / sizeof(Obj::Entry) };
155 static char const * const name;
157 typedef Obj::Capability Capability;
158 typedef Obj::Entry Entry;
159 typedef Kobject *Reap_list;
160 typedef Kobject_iface *Phys_addr;
161 typedef Obj::Cap_addr Addr;
162 typedef Page_count Size;
166 Need_insert_tlb_flush = 0,
167 Need_xcpu_tlb_flush = 0,
170 Map_superpage_size = 1,
171 Map_max_address = 1UL << 20, /* 20bit obj index */
178 Insert_ok = 0, ///< Mapping was added successfully.
179 Insert_warn_exists, ///< Mapping already existed
180 Insert_warn_attrib_upgrade, ///< Mapping already existed, attribs upgrade
181 Insert_err_nomem, ///< Couldn't alloc new page table
182 Insert_err_exists ///< A mapping already exists at the target addr
187 /// A mask which contains all mask bits
188 //Page_user_accessible = 1,
194 static Address superpage_size() { return Map_superpage_size; }
195 static bool has_superpages() { return false; }
196 static Phys_addr page_address(Phys_addr o, Size) { return o; }
197 static Phys_addr subpage_address(Phys_addr addr, Size) { return addr; }
200 template< typename SPACE >
201 char const * const Generic_obj_space<SPACE>::name = "Obj_space";
204 // -------------------------------------------------------------------------
207 PUBLIC template< typename SPACE >
210 Generic_obj_space<SPACE>::xlate_flush(unsigned char rights)
213 PUBLIC template< typename SPACE >
216 Generic_obj_space<SPACE>::is_full_flush(unsigned char rights)
217 { return rights & L4_fpage::R; }
219 PUBLIC template< typename SPACE >
222 Generic_obj_space<SPACE>::xlate_flush_result(Mword /*attribs*/)
225 PUBLIC template< typename SPACE >
226 inline NEEDS[Generic_obj_space::caps_free]
227 Generic_obj_space<SPACE>::~Generic_obj_space()
232 PUBLIC template< typename SPACE >
235 Generic_obj_space<SPACE>::v_fabricate(Addr const &address,
236 Phys_addr *phys, Size *size,
237 unsigned* attribs = 0)
239 return Generic_obj_space::v_lookup(address, phys, size, attribs);
243 PUBLIC template< typename SPACE >
246 Generic_obj_space<SPACE>::tlb_flush ()
249 PUBLIC template< typename SPACE >
251 typename Generic_obj_space<SPACE>::Addr
252 Generic_obj_space<SPACE>::canonize(Addr v)
255 // ------------------------------------------------------------------------
258 EXTENSION class Generic_obj_space
264 Generic_obj_space<SPACE> *s;
270 // ------------------------------------------------------------------------
271 IMPLEMENTATION [debug]:
273 #include "dbg_page_info.h"
276 PUBLIC template< typename SPACE >
279 Generic_obj_space<SPACE>::add_dbg_info(void *p, Generic_obj_space *s,
282 Dbg_page_info *info = new Dbg_page_info(Virt_addr((Address)p));
284 if (EXPECT_FALSE(!info))
286 WARN("oom: could not allocate debug info fo page %p\n", p);
290 info->info<Dbg_info>()->s = s;
291 info->info<Dbg_info>()->offset = (cap / Caps_per_page) * Caps_per_page;
292 Dbg_page_info::table().insert(info);
295 PUBLIC template< typename SPACE >
298 Generic_obj_space<SPACE>::remove_dbg_info(void *p)
300 Dbg_page_info *info = Dbg_page_info::table().remove(Virt_addr((Address)p));
304 WARN("could not find debug info for page %p\n", p);
308 // ------------------------------------------------------------------------
309 IMPLEMENTATION [!debug]:
311 PUBLIC template< typename SPACE > inline
314 Generic_obj_space<SPACE>::add_dbg_info(void *, Generic_obj_space *, Address)
317 PUBLIC template< typename SPACE > inline
320 Generic_obj_space<SPACE>::remove_dbg_info(void *)