L4Re - L4 Runtime Environment
rm_impl.h
Go to the documentation of this file.
1 
5 /*
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)
9  *
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.
13  *
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.
22  */
23 #include <l4/re/rm>
24 #include <l4/re/dataspace>
25 
26 #include <l4/sys/cxx/ipc_client>
27 
28 #include <l4/sys/task>
29 #include <l4/sys/err.h>
30 
38 
39 namespace L4Re
40 {
41 
42 long
43 Rm::attach(l4_addr_t *start, unsigned long size, Rm::Flags flags,
44  L4::Ipc::Cap<Dataspace> mem, Rm::Offset offs,
45  unsigned char align) const noexcept
46 {
47  if (((flags & F::Rights_mask) == Flags(0)) || (flags & F::Reserved))
49 
50  long e = attach_t::call(c(), start, size, flags, mem, offs, align, mem.cap().cap());
51  if (e < 0)
52  return e;
53 
54  if (flags & F::Eager_map)
55  e = mem.cap()->map_region(offs, map_flags(flags), *start, *start + size);
56 
57  return e;
58 }
59 
60 int
61 Rm::detach(l4_addr_t start, unsigned long size, L4::Cap<Dataspace> *mem,
62  L4::Cap<L4::Task> task, unsigned flags) const noexcept
63 {
64  l4_addr_t rstart = 0, rsize = 0;
65  l4_cap_idx_t mem_cap = L4_INVALID_CAP;
66  long e = detach_t::call(c(), start, size, flags, rstart, rsize, mem_cap);
67  if (L4_UNLIKELY(e < 0))
68  return e;
69 
70  if (mem)
71  *mem = L4::Cap<L4Re::Dataspace>(mem_cap);
72 
73  if (!task.is_valid())
74  return e;
75 
76  rsize = l4_round_page(rsize);
77  unsigned order = L4_LOG2_PAGESIZE;
78  unsigned long sz = (1UL << order);
79  for (unsigned long p = rstart; rsize; p += sz, rsize -= sz)
80  {
81  while (sz > rsize)
82  {
83  --order;
84  sz >>= 1;
85  }
86 
87  for (;;)
88  {
89  unsigned long m = sz << 1;
90  if (m > rsize)
91  break;
92 
93  if (p & (m - 1))
94  break;
95 
96  ++order;
97  sz <<= 1;
98  }
99 
100  task->unmap(l4_fpage(p, order, L4_FPAGE_RWX),
102  }
103 
104  return e;
105 }
106 }
long reserve_area(l4_addr_t *start, unsigned long size, Flags flags=Flags(0), unsigned char align=L4_PAGESHIFT) const noexcept
Reserve the given area in the region map.
Definition: rm:259
Capability type for RPC interfaces (see L4::Cap<T>).
Definition: ipc_types:541
int find(l4_addr_t *addr, unsigned long *size, Offset *offset, L4Re::Rm::Flags *flags, L4::Cap< Dataspace > *m) noexcept
Find a region given an address and size.
Definition: rm:560
Invalid capability selector.
Definition: consts.h:141
long free_area(l4_addr_t addr)
Free an area from the region map.
l4_addr_t l4_round_page(l4_addr_t address) L4_NOTHROW
Round address up to the next page.
Definition: consts.h:389
Read-write-execute flex page.
Definition: __l4_fpage.h:116
unsigned long l4_cap_idx_t
L4 Capability selector Type.
Definition: types.h:342
L4Re C++ Interfaces.
Definition: cmd_control:15
int detach(l4_addr_t addr, L4::Cap< Dataspace > *mem, L4::Cap< L4::Task > const &task=This_task) const noexcept
Detach a region from the address space.
Definition: rm:639
Common task related definitions.
long attach(l4_addr_t *start, unsigned long size, Flags flags, L4::Ipc::Cap< Dataspace > mem, Offset offs=0, unsigned char align=L4_PAGESHIFT) const noexcept
Attach a data space to a region.
Definition: rm_impl.h:43
Region mapper interface.
Flag to tell the unmap operation to unmap all child mappings including the mapping in the invoked tas...
Definition: consts.h:165
l4_fpage_t l4_fpage(l4_addr_t address, unsigned int size, unsigned char rights) L4_NOTHROW
Create a memory flex page.
Definition: __l4_fpage.h:635
#define L4_LOG2_PAGESIZE
Number of bits used for page offset.
Definition: consts.h:325
#define L4_UNLIKELY(x)
Expression is unlikely to execute.
Definition: compiler.h:238
long map_region(Offset offset, Flags flags, Map_addr min_addr, Map_addr max_addr) const noexcept
Map a part of a dataspace into a local memory area.
L4::Cap< T > cap() const noexcept
Return the L4::Cap<T> of this Cap.
Definition: ipc_types:601
Error codes.
long get_areas(l4_addr_t start, L4::Ipc::Ret_array< Area > areas)
Return the list of areas whose starting addresses are higher or equal to start in the address space m...
bool is_valid() const noexcept
Test whether the capability is a valid capability index (i.e., not L4_INVALID_CAP).
Definition: capability.h:60
l4_msgtag_t unmap(l4_fpage_t const &fpage, l4_umword_t map_mask, l4_utcb_t *utcb=l4_utcb()) noexcept
Revoke rights from the task.
Definition: task:90
#define L4_RPC_DEF(name)
Generate the definition of an RPC stub.
Definition: ipc_client:43
Dataspace interface.
C++ interface for capabilities.
Definition: capability.h:13
unsigned long l4_addr_t
Address type.
Definition: l4int.h:45
long get_regions(l4_addr_t start, L4::Ipc::Ret_array< Region > regions)
Return the list of regions whose starting addresses are higher or equal to start in the address space...