3 #include "kobject_mapdb.h"
9 #include "assert_opt.h"
11 #include "obj_space.h"
15 inline NEEDS["assert_opt.h"]
17 save_access_attribs (Kobject_mapdb* /*mapdb*/,
18 const Kobject_mapdb::Frame& /*mapdb_frame*/,
19 Kobject_mapdb::Mapping* /*mapping*/, Obj_space* /*space*/,
20 unsigned /*page_rights*/,
21 Obj_space::Addr /*virt*/, Obj_space::Phys_addr /*phys*/, Obj_space::Size /*size*/,
26 obj_map(Space *from, L4_fpage const &fp_from,
27 Space *to, L4_fpage const &fp_to, L4_msg_item control,
33 typedef Map_traits<Obj_space> Mt;
34 Mt::Addr rcv_addr = Mt::get_addr(fp_to);
35 Mt::Addr snd_addr = Mt::get_addr(fp_from);
36 Mt::Size snd_size = Mt::Size::from_shift(fp_from.order());
37 Mt::Size rcv_size = Mt::Size::from_shift(fp_to.order());
38 Mt::Addr offs(control.index());
40 snd_addr = snd_addr.trunc(snd_size);
41 rcv_addr = rcv_addr.trunc(rcv_size);
43 Mt::constraint(snd_addr, snd_size, rcv_addr, rcv_size, offs);
46 return L4_error::None;
48 unsigned long del_attribs, add_attribs;
49 Mt::attribs(control, fp_from, &del_attribs, &add_attribs);
51 return map<Obj_space>((Kobject_mapdb*)0,
55 control.is_grant(), add_attribs, del_attribs,
59 unsigned __attribute__((nonnull(1)))
60 obj_fpage_unmap(Space * space, L4_fpage fp, L4_map_mask mask,
64 typedef Map_traits<Obj_space> Mt;
65 Mt::Size size = Mt::Size::from_shift(fp.order());
66 Mt::Addr addr = Mt::get_addr(fp);
67 addr = addr.trunc(size);
69 // XXX prevent unmaps when a task has no caps enabled
71 return unmap<Obj_space>((Kobject_mapdb*)0, space, space,
73 fp.rights(), mask, reap_list);
78 obj_map(Space *from, unsigned long snd_addr, unsigned long snd_size,
79 Space *to, unsigned long rcv_addr,
80 Kobject ***reap_list, bool grant = false,
81 unsigned attrib_add = 0, unsigned attrib_del = 0)
85 typedef Map_traits<Obj_space> Mt;
87 return map<Obj_space>((Kobject_mapdb*)0,
88 from, from, Mt::Addr(snd_addr),
90 to, to, Mt::Addr(rcv_addr),
91 grant, attrib_add, attrib_del, reap_list);
95 map(Kobject_iface *o, Obj_space* to, Space *to_id, Address _rcv_addr,
96 Kobject ***reap_list, unsigned attribs = L4_fpage::CRWSD)
102 typedef Obj_space SPACE;
103 typedef Obj_space::Addr Addr;
104 typedef Obj_space::Size Size;
106 Page_number const rcv_addr = Page_number::create(_rcv_addr);
108 if (EXPECT_FALSE(rcv_addr >= to->map_max_address()))
112 Obj_space::Phys_addr r_phys;
117 if (to->v_lookup(ra, &r_phys, &r_size, &r_attribs))
118 unmap((Kobject_mapdb*)0, to, to_id, ra, r_size,
119 L4_fpage::RWX, L4_map_mask::full(), reap_list);
121 attribs &= L4_fpage::WX;
122 // Do the actual insertion.
123 Obj_space::Status status
124 = to->v_insert(o, ra, Size::create(1), attribs);
128 case SPACE::Insert_warn_exists:
129 case SPACE::Insert_warn_attrib_upgrade:
130 case SPACE::Insert_ok:
132 if (status == SPACE::Insert_ok)
134 if (! o->map_root()->insert(0, to_id, ra))
136 to->v_delete(rcv_addr, Obj_space::Size::create(1));
142 case SPACE::Insert_err_nomem:
145 case SPACE::Insert_err_exists:
146 // Do not flag an error here -- because according to L4
147 // semantics, it isn't.