32 namespace L4Re {
namespace Util {
34 template<
typename Rm_server,
typename SVR_DATA,
typename RM,
typename IOS>
35 int region_map_server(SVR_DATA *sdata, RM *rm, IOS &ios)
48 typename Rm_server::Dataspace ds =
typename Rm_server::Dataspace();
52 ios >> start >> size >> flags >> offs >> align;
55 ios >> client_cap_idx >> ds_cap;
57 if (
int r = Rm_server::validate_ds(sdata, ds_cap, flags, &ds))
70 start =
l4_addr_t(rm->attach((
void*)start, size,
71 typename RM::Region_handler(ds, client_cap_idx, offs, r_flags),
85 ios >> addr >> size >> flags;
88 typename RM::Region_handler h;
89 int err = rm->detach((
void*)addr, size, flags, &r, &h);
96 ios <<
l4_addr_t(r.start()) << (
unsigned long)r.size()
97 << h.client_cap_idx();
101 case Rm_::Attach_area:
108 ios >> start >> size >> flags >> align;
109 start = rm->attach_area(start, size, flags, align);
117 case Rm_::Detach_area:
121 if (!rm->detach_area(start))
128 if (!Rm_server::Have_find)
132 unsigned flag_area = 0;
136 typename RM::Node r = rm->find(Region(addr, addr + size -1));
139 r = rm->area_find(Region(addr, addr + size - 1));
145 addr = r->first.start();
146 size = r->first.end() + 1 - addr;
148 unsigned flags = r->second.flags() | flag_area;
150 ios << addr << size << flags << r->second.offset()
151 << Rm_server::find_res(r->second.memory());
155 case Rm_::Get_regions:
161 while ((r = rm->lower_bound(Region(addr, addr +1))))
164 x.start = r->first.start();
165 x.end = r->first.end();
166 x.offset = r->second.offset();
172 if (x.end >= rm->max_addr())
185 while ((r = rm->lower_bound_area(Region(addr, addr +1))))
188 x.start = r->first.start();
189 x.end = r->first.end();
195 if (x.end >= rm->max_addr())
207 template<
typename Dbg,
typename RM,
typename IOS>
208 int region_pf_handler(RM *rm, IOS &ios)
211 ios >> addr >> pc >> sp;
212 Dbg(Dbg::Server).printf(
"page fault: %lx pc=%lx\n", addr, pc);
214 unsigned writable = addr & 2;
217 typename RM::Node n = rm->find(addr);
219 if (!n || !n->second.memory())
221 Dbg(Dbg::Warn,
"rm").printf(
"unhandled %s page fault at 0x%lx pc=0x%lx\n",
222 writable ?
"write" :
"read", addr, pc);
229 if (n->second.is_ro() && writable)
231 Dbg(Dbg::Warn,
"rm").printf(
"write page fault in readonly region at 0x%lx pc=0x%lx\n",
238 typename RM::Region_handler::Ops::Map_result result;
239 if (
int err = n->second.map(addr, n->first, writable, &result))
241 Dbg(Dbg::Warn,
"rm").printf(
"mapping for page fault failed with error %d at 0x%lx pc=0x%lx\n",
Invalid capability selector.
l4_addr_t l4_round_page(l4_addr_t address) L4_NOTHROW
Round address up to the next page.
Common L4 ABI Data Types.
Region mapper protocol definitions.
l4_addr_t l4_trunc_page(l4_addr_t address) L4_NOTHROW
Round an address down to the next lower page boundary.
unsigned long l4_cap_idx_t
L4 Capability selector Type.
#define L4_PAGESIZE
Minimal page size (in bytes).
int Opcode
Data type for RPC opcodes.
unsigned long l4_umword_t
Unsigned machine word.
Attach_flags
Flags for attach operation.
Region is reserved (blocked)
Region_flags
Flags for regions.
unsigned long l4_addr_t
Address type.
Search only in area, or map into area.
Generic RPC wrapper for L4 flex-pages.