3 * \brief Region map client stub implementation
6 * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
7 * Alexander Warg <warg@os.inf.tu-dresden.de>
8 * economic rights: Technische Universität Dresden (Germany)
10 * This file is part of TUD:OS and distributed under the terms of the
11 * GNU General Public License 2.
12 * Please see the COPYING-GPL-2 file for details.
14 * As a special exception, you may use this file as part of a free software
15 * library without restriction. Specifically, if other files instantiate
16 * templates or use macros or inline functions from this file, or you compile
17 * this file and link it with other files to produce an executable, this
18 * file does not by itself cause the resulting executable to be covered by
19 * the GNU General Public License. This exception does not however
20 * invalidate any other reasons why the executable file might be covered by
21 * the GNU General Public License.
24 #include <l4/re/dataspace>
26 #include <l4/sys/cxx/ipc_client>
28 #include <l4/sys/task>
29 #include <l4/sys/err.h>
31 L4_RPC_DEF(L4Re::Rm::reserve_area);
32 L4_RPC_DEF(L4Re::Rm::free_area);
33 L4_RPC_DEF(L4Re::Rm::attach);
34 L4_RPC_DEF(L4Re::Rm::detach);
35 L4_RPC_DEF(L4Re::Rm::get_regions);
36 L4_RPC_DEF(L4Re::Rm::get_areas);
37 L4_RPC_DEF(L4Re::Rm::find);
43 Rm::attach(l4_addr_t *start, unsigned long size, unsigned long flags,
44 L4::Ipc::Cap<Dataspace> mem, l4_addr_t offs,
45 unsigned char align) const throw()
48 mem = L4::Ipc::Cap<L4Re::Dataspace>();
50 long e = attach_t::call(c(), start, size, flags, mem, offs, align, mem.cap().cap());
54 if (flags & Eager_map)
56 unsigned long fl = (flags & Read_only)
59 e = mem.cap()->map_region(offs, fl, *start, *start + size);
65 Rm::detach(l4_addr_t start, unsigned long size, L4::Cap<Dataspace> *mem,
66 L4::Cap<L4::Task> task, unsigned flags) const throw()
68 l4_addr_t rstart = 0, rsize = 0;
69 l4_cap_idx_t mem_cap = L4_INVALID_CAP;
70 long e = detach_t::call(c(), start, size, flags, rstart, rsize, mem_cap);
71 if (L4_UNLIKELY(e < 0))
75 *mem = L4::Cap<L4Re::Dataspace>(mem_cap);
80 rsize = l4_round_page(rsize);
81 unsigned order = L4_LOG2_PAGESIZE;
82 unsigned long sz = (1UL << order);
83 for (unsigned long p = rstart; rsize; p += sz, rsize -= sz)
93 unsigned long m = sz << 1;
104 task->unmap(l4_fpage(p, order, L4_FPAGE_RWX),