L4Re Operating System Framework
Interface and Usage Documentation
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
dataspace_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 * License: see LICENSE.spdx (in this directory or the directories above)
11 */
12#include <l4/re/dataspace>
13#include <l4/sys/cxx/ipc_client>
14#include <l4/sys/cxx/consts>
15
21
22namespace L4Re {
23
24
25long
26Dataspace::__map(Dataspace::Offset offset, unsigned char *size,
27 Dataspace::Flags flags,
28 Dataspace::Map_addr local_addr,
29 L4::Cap<L4::Task> dst) const noexcept
30{
31 Map_addr spot = local_addr & ~(~0ULL << l4_umword_t(*size));
32 Map_addr base = local_addr & (~0ULL << l4_umword_t(*size));
33 L4::Ipc::Rcv_fpage r = L4::Ipc::Rcv_fpage::mem(base, *size, 0, dst);
34
36 long err = map_t::call(c(), offset, spot, flags, r, fp, l4_utcb());
37 if (L4_UNLIKELY(err < 0))
38 return err;
39
40 *size = fp.rcv_order();
41 return err;
42}
43
44long
45Dataspace::map_region(Dataspace::Offset offset, Dataspace::Flags flags,
46 Dataspace::Map_addr min_addr,
47 Dataspace::Map_addr max_addr,
48 L4::Cap<L4::Task> dst) const noexcept
49{
50 min_addr = L4::trunc_page(min_addr);
51 max_addr = L4::round_page(max_addr);
52 unsigned char order = L4_LOG2_PAGESIZE;
53
54 long err = 0;
55
56 while (min_addr < max_addr)
57 {
58 unsigned char order_mapped;
59 order_mapped = order
60 = L4::max_order(order, min_addr, min_addr, max_addr, min_addr);
61
62 err = __map(offset, &order_mapped, flags, min_addr, dst);
63 if (L4_UNLIKELY(err < 0))
64 return err;
65
66 if (order > order_mapped)
67 order = order_mapped;
68
69 min_addr += Map_addr(1) << order;
70 offset += Map_addr(1) << order;
71
72 if (min_addr >= max_addr)
73 return 0;
74
75 while (min_addr != L4::trunc_order(min_addr, order)
76 || max_addr < L4::round_order(min_addr + 1, order))
77 --order;
78 }
79
80 return 0;
81}
82
83
84long
85Dataspace::map(Dataspace::Offset offset, Dataspace::Flags flags,
86 Dataspace::Map_addr local_addr,
87 Dataspace::Map_addr min_addr,
88 Dataspace::Map_addr max_addr,
89 L4::Cap<L4::Task> dst) const noexcept
90{
91 min_addr = L4::trunc_page(min_addr);
92 max_addr = L4::round_page(max_addr);
93 local_addr = L4::trunc_page(local_addr);
94 unsigned char order
95 = L4::max_order(L4_LOG2_PAGESIZE, local_addr, min_addr, max_addr, local_addr);
96
97 return __map(offset, &order, flags, local_addr, dst);
98}
99
100Dataspace::Size
101Dataspace::size() const noexcept
102{
103 Stats stats = Stats();
104 int err = info(&stats);
105 if (err < 0)
106 return 0;
107 return stats.size;
108}
109
110Dataspace::Flags
111Dataspace::flags() const noexcept
112{
113 Stats stats = Stats();
114 int err = info(&stats);
115 if (err < 0)
116 return Flags(0);
117 return stats.flags;
118}
119
120};
long copy_in(Offset dst_offs, L4::Ipc::Cap< Dataspace > src, Offset src_offs, Size size)
Copy contents from another dataspace.
Size size() const noexcept
Get size of a dataspace.
Flags flags() const noexcept
Get flags of the dataspace.
long map_region(Offset offset, Flags flags, Map_addr min_addr, Map_addr max_addr, L4::Cap< L4::Task > dst=L4::Cap< L4::Task >::Invalid) const noexcept
Map a part of a dataspace into a local memory area.
long info(Stats *stats)
Get information on the dataspace.
long map_info(l4_addr_t *start_addr, l4_addr_t *end_addr)
Get mapping range of dataspace.
Definition dataspace:304
long clear(Offset offset, Size size)
Clear parts of a dataspace.
long allocate(Offset offset, Size size)
Allocate a range in the dataspace.
long map(Offset offset, Flags flags, Map_addr local_addr, Map_addr min_addr, Map_addr max_addr, L4::Cap< L4::Task > dst=L4::Cap< L4::Task >::Invalid) const noexcept
Request a flexpage mapping from the dataspace.
C++ interface for capabilities.
Definition capability.h:219
Non-small receive item.
Definition ipc_types:545
static Rcv_fpage mem(l4_addr_t base, int order, l4_addr_t snd_base=0, L4::Cap< void > rcv_task=L4::Cap< void >::Invalid) noexcept
Construct a receive item for the memory space.
Definition ipc_types:594
Send item or return item.
Definition ipc_types:324
unsigned rcv_order() const noexcept
*(Defined for return items only.)* Get log₂ size.
Definition ipc_types:465
Dataspace interface.
unsigned long l4_umword_t
Unsigned machine word.
Definition l4int.h:40
#define L4_LOG2_PAGESIZE
Number of bits used for page offset.
Definition consts.h:413
l4_utcb_t * l4_utcb(void) L4_NOTHROW L4_PURE
Get the UTCB address.
Definition utcb.h:346
#define L4_UNLIKELY(x)
Expression is unlikely to execute.
Definition compiler.h:275
#define L4_RPC_DEF(name)
Generate the definition of an RPC stub.
Definition ipc_client:32
L4Re C++ Interfaces.
Definition cmd_control:14
constexpr T round_order(T val, unsigned char order)
Round a value up so the given number of lsb is zero.
Definition consts:32
constexpr T trunc_order(T val, unsigned char order)
Round a value down so the given number of lsb is zero.
Definition consts:18
Information about the dataspace.
Definition dataspace:126