3 #include "kobject_mapdb.h"
15 save_access_attribs (Kobject_mapdb* /*mapdb*/,
16 const Kobject_mapdb::Frame& /*mapdb_frame*/,
17 Kobject_mapdb::Mapping* /*mapping*/, Obj_space* /*space*/,
18 unsigned /*page_rights*/,
19 Obj_space::Addr /*virt*/, Obj_space::Phys_addr /*phys*/, Obj_space::Size /*size*/,
24 obj_map(Space *from, L4_fpage const &fp_from,
25 Space *to, L4_fpage const &fp_to, L4_msg_item control,
28 typedef Map_traits<Obj_space> Mt;
29 Mt::Addr rcv_addr = Mt::get_addr(fp_to);
30 Mt::Addr snd_addr = Mt::get_addr(fp_from);
31 Mt::Size snd_size = Mt::Size::from_shift(fp_from.order());
32 Mt::Size rcv_size = Mt::Size::from_shift(fp_to.order());
33 Mt::Addr offs(control.index());
35 snd_addr = snd_addr.trunc(snd_size);
36 rcv_addr = rcv_addr.trunc(rcv_size);
38 Mt::constraint(snd_addr, snd_size, rcv_addr, rcv_size, offs);
42 if (Config::conservative)
43 kdb_ke("fpage transfer = nop");
44 return L4_error::None;
47 unsigned long del_attribs, add_attribs;
48 Mt::attribs(control, fp_from, &del_attribs, &add_attribs);
50 return map((Kobject_mapdb*)0,
51 from->obj_space(), from, snd_addr,
53 to->obj_space(), to, rcv_addr,
54 control.is_grant(), add_attribs, del_attribs,
59 obj_fpage_unmap(Space * space, L4_fpage fp, L4_map_mask mask,
62 typedef Map_traits<Obj_space> Mt;
63 Mt::Size size = Mt::Size::from_shift(fp.order());
64 Mt::Addr addr = Mt::get_addr(fp);
65 addr = addr.trunc(size);
67 // XXX prevent unmaps when a task has no caps enabled
69 return unmap((Kobject_mapdb*)0, space->obj_space(), space,
71 fp.rights(), mask, reap_list);
76 obj_map(Space *from, unsigned long snd_addr, unsigned long snd_size,
77 Space *to, unsigned long rcv_addr,
78 Kobject ***reap_list, bool grant = false,
79 unsigned attrib_add = 0, unsigned attrib_del = 0)
81 typedef Map_traits<Obj_space> Mt;
83 return map((Kobject_mapdb*)0,
84 from->obj_space(), from, Mt::Addr(snd_addr),
86 to->obj_space(), to, Mt::Addr(rcv_addr),
87 grant, attrib_add, attrib_del, reap_list);
91 map(Kobject_iface *o, Obj_space* to, Space *to_id, Address _rcv_addr,
92 Kobject ***reap_list, unsigned attribs = L4_fpage::CRWSD)
94 typedef Obj_space SPACE;
95 typedef Obj_space::Addr Addr;
96 typedef Obj_space::Size Size;
98 Page_number const rcv_addr = Page_number::create(_rcv_addr);
100 if (EXPECT_FALSE(rcv_addr >= to->map_max_address()))
104 Obj_space::Phys_addr r_phys;
109 if (to->v_lookup(ra, &r_phys, &r_size, &r_attribs))
110 unmap((Kobject_mapdb*)0, to, to_id, ra, r_size,
111 L4_fpage::RWX, L4_map_mask::full(), reap_list);
113 attribs &= L4_fpage::WX;
114 // Do the actual insertion.
115 Obj_space::Status status
116 = to->v_insert(o, ra, Size::create(1), attribs);
120 case SPACE::Insert_warn_exists:
121 case SPACE::Insert_warn_attrib_upgrade:
122 case SPACE::Insert_ok:
124 if (status == SPACE::Insert_ok)
126 if (! o->map_root()->insert(0, to_id, ra))
128 to->v_delete(rcv_addr, Obj_space::Size::create(1));
134 case SPACE::Insert_err_nomem:
138 case SPACE::Insert_err_exists:
139 if (Config::conservative)
140 kdb_ke("existing mapping");
141 // Do not flag an error here -- because according to L4
142 // semantics, it isn't.