3 * \brief Common constants.
7 * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
8 * Alexander Warg <warg@os.inf.tu-dresden.de>,
9 * Björn Döbel <doebel@os.inf.tu-dresden.de>,
10 * Torsten Frenzel <frenzel@os.inf.tu-dresden.de>
11 * economic rights: Technische Universität Dresden (Germany)
13 * This file is part of TUD:OS and distributed under the terms of the
14 * GNU General Public License 2.
15 * Please see the COPYING-GPL-2 file for details.
17 * As a special exception, you may use this file as part of a free software
18 * library without restriction. Specifically, if other files instantiate
19 * templates or use macros or inline functions from this file, or you compile
20 * this file and link it with other files to produce an executable, this
21 * file does not by itself cause the resulting executable to be covered by
22 * the GNU General Public License. This exception does not however
23 * invalidate any other reasons why the executable file might be covered by
24 * the GNU General Public License.
26 #ifndef __L4_SYS__INCLUDE__CONSTS_H__
27 #define __L4_SYS__INCLUDE__CONSTS_H__
29 #include <l4/sys/compiler.h>
30 #include <l4/sys/l4int.h>
33 * \addtogroup l4_cap_api
35 * <c>\#include <l4/sys/consts.h></c>
39 * \brief Capability selector flags.
42 * These flags determine the concrete operation when a kernel object
45 enum l4_syscall_flags_t
48 * \brief Default flags (call to a kernel object).
51 * Using this value as flags in the capability selector for an
52 * invocation indicates a call (send and wait for a reply).
57 * \brief Send-phase flag.
60 * Setting this flag in a capability selector induces a send phase,
61 * this means a message is send to the object denoted by the capability.
62 * For receive phase see #L4_SYSF_RECV.
67 * \brief Receive-phase flag.
70 * Setting this flag in a capability selector induces a receive phase,
71 * this means the invoking thread waits for a message from the object
72 * denoted by the capability.
73 * For a send phase see #L4_SYSF_SEND.
78 * \brief Open-wait flag.
81 * This flag indicates that the receive operation (see #L4_SYSF_RECV)
82 * shall be an \em open \em wait. \em Open \em wait means that the invoking
83 * thread shall wait for a message from any possible sender and \em not from
84 * the sender denoted by the capability.
86 L4_SYSF_OPEN_WAIT = 0x04,
92 * This flag indicates that the send phase shall use the in-kernel reply
93 * capability instead of the capability denoted by the selector index.
98 * \brief Call flags (combines send and receive).
101 * Combines #L4_SYSF_SEND and L4_SYSF_RECV.
103 L4_SYSF_CALL = L4_SYSF_SEND | L4_SYSF_RECV,
106 * \brief Wait flags (combines receive and open wait).
109 * Combines #L4_SYSF_RECV and #L4_SYSF_OPEN_WAIT.
111 L4_SYSF_WAIT = L4_SYSF_OPEN_WAIT | L4_SYSF_RECV,
114 * \brief Send-and-wait flags.
117 * Combines #L4_SYSF_SEND and #L4_SYSF_WAIT.
119 L4_SYSF_SEND_AND_WAIT = L4_SYSF_OPEN_WAIT | L4_SYSF_CALL,
122 * \brief Reply-and-wait flags.
125 * Combines #L4_SYSF_SEND, #L4_SYSF_REPLY, and #L4_SYSF_WAIT.
127 L4_SYSF_REPLY_AND_WAIT = L4_SYSF_WAIT | L4_SYSF_SEND | L4_SYSF_REPLY
131 * \brief Constants related to capability selectors.
132 * \ingroup l4_cap_api
136 /** \brief Capability index shift. \hideinitializer */
138 /** \brief Offset of two consecutive capability selectors. \hideinitializer */
139 L4_CAP_SIZE = 1UL << L4_CAP_SHIFT,
140 L4_CAP_OFFSET = 1UL << L4_CAP_SHIFT,
142 * \brief Mask to get only the relevant bits of an l4_cap_idx_t.
145 L4_CAP_MASK = ~0UL << (L4_CAP_SHIFT -1),
146 /** \brief Invalid capability selector. \hideinitializer */
147 L4_INVALID_CAP = ~0UL << (L4_CAP_SHIFT -1),
149 L4_INVALID_CAP_BIT = 1UL << (L4_CAP_SHIFT -1),
152 enum l4_sched_consts_t
154 L4_SCHED_MIN_PRIO = 0,
155 L4_SCHED_MAX_PRIO = 255,
159 * \brief Flags for the unmap operation.
160 * \ingroup l4_task_api
161 * \see L4::Task::unmap() and l4_task_unmap()
163 enum l4_unmap_flags_t
166 * \brief Flag to tell the unmap operation to unmap all child mappings
167 * including the mapping in the invoked task.
169 * \see L4::Task::unmap() l4_task_unmap()
171 L4_FP_ALL_SPACES = 0x80000000UL,
174 * \brief Flag that indicates that the unmap operation on a capability
175 * shall try to delete the corresponding objects immediately.
177 * \see L4::Task::unmap() l4_task_unmap()
179 L4_FP_DELETE_OBJ = 0xc0000000UL,
182 * \brief Counterpart to #L4_FP_ALL_SPACES, unmap only child mappings.
184 * \see L4::Task::unmap() l4_task_unmap()
186 L4_FP_OTHER_SPACES = 0x0UL
190 * \brief Constants for message items.
191 * \ingroup l4_msgitem_api
193 enum l4_msg_item_consts_t
195 L4_ITEM_MAP = 8, ///< Identify a message item as \em map \em item.
198 * \brief Donote that the following item shall be put into the same receive
204 L4_MAP_ITEM_GRANT = 2, ///< Flag as \em grant instead of \em map operation.
205 L4_MAP_ITEM_MAP = 0, ///< Flag as usual \em map operation.
209 * \brief Mark the receive buffer to be a small receive item that describes
210 * a buffer for a single capability.
212 L4_RCV_ITEM_SINGLE_CAP = L4_ITEM_MAP | 2,
215 * \brief The receiver requests to receive a local ID instead of a mapping
218 L4_RCV_ITEM_LOCAL_ID = 4,
222 * \brief Constants for buffer descriptors.
223 * \ingroup l4_utcb_br_api
225 enum l4_buffer_desc_consts_t
227 L4_BDR_MEM_SHIFT = 0, ///< Bit offset for the memory-buffer index
228 L4_BDR_IO_SHIFT = 5, ///< Bit offset for the IO-buffer index
229 L4_BDR_OBJ_SHIFT = 10, ///< Bit offset for the capability-buffer index
230 L4_BDR_OFFSET_MASK = (1UL << 20) - 1,
234 * \brief Default capabilities setup for the initial tasks.
235 * \ingroup l4_cap_api
237 * <c>\#include <l4/sys/consts.h></c>
239 * These capability selectors are setup per default by the micro kernel
240 * for the two initial tasks, the Root-Pager (Sigma0) and the Root-Task
243 * \attention This constants do not have any particular meaning for
244 * applications started by Moe, see \ref api_l4re_env for
245 * this kind of information.
246 * \see \ref api_l4re_env for information useful for normal user applications.
248 enum l4_default_caps_t
250 /// Capability selector for the current task. \hideinitializer
251 L4_BASE_TASK_CAP = 1UL << L4_CAP_SHIFT,
252 /// Capability selector for the factory. \hideinitializer
253 L4_BASE_FACTORY_CAP = 2UL << L4_CAP_SHIFT,
254 /// Capability selector for the first thread. \hideinitializer
255 L4_BASE_THREAD_CAP = 3UL << L4_CAP_SHIFT,
256 /// Capability selector for the pager gate. \hideinitializer
257 L4_BASE_PAGER_CAP = 4UL << L4_CAP_SHIFT,
258 /// Capability selector for the log object. \hideinitializer
259 L4_BASE_LOG_CAP = 5UL << L4_CAP_SHIFT,
260 /// Capability selector for the base icu object. \hideinitializer
261 L4_BASE_ICU_CAP = 6UL << L4_CAP_SHIFT,
262 /// Capability selector for the scheduler cap. \hideinitializer
263 L4_BASE_SCHEDULER_CAP = 7UL << L4_CAP_SHIFT,
267 * \defgroup l4_memory_api Memory related
268 * \brief Memory related constants, data types and functions.
272 * \brief Minimal page size (in bytes).
273 * \ingroup l4_memory_api
276 #define L4_PAGESIZE (1UL << L4_PAGESHIFT)
279 * \brief Mask for the page number.
280 * \ingroup l4_memory_api
283 * \note The most significant bits are set.
285 #define L4_PAGEMASK (~(L4_PAGESIZE - 1))
288 * \brief Number of bits used for page offset.
289 * \ingroup l4_memory_api
292 * Size of page in log2.
294 #define L4_LOG2_PAGESIZE L4_PAGESHIFT
297 * \brief Size of a large page.
298 * \ingroup l4_memory_api
301 * A large page is a \em super \em page on IA32 or a \em section on ARM.
303 #define L4_SUPERPAGESIZE (1UL << L4_SUPERPAGESHIFT)
306 * \brief Mask for the number of a large page.
307 * \ingroup l4_memory_api
310 * \note The most significant bits are set.
312 #define L4_SUPERPAGEMASK (~(L4_SUPERPAGESIZE - 1))
315 * \brief Number of bits used as offset for a large page.
316 * \ingroup l4_memory_api
318 * Size of large page in log2
320 #define L4_LOG2_SUPERPAGESIZE L4_SUPERPAGESHIFT
323 * \brief Round an address down to the next lower page boundary.
324 * \ingroup l4_memory_api
326 * \param address The address to round.
328 L4_INLINE l4_addr_t l4_trunc_page(l4_addr_t address) L4_NOTHROW;
329 L4_INLINE l4_addr_t l4_trunc_page(l4_addr_t x) L4_NOTHROW
330 { return x & L4_PAGEMASK; }
333 * \brief Round an address down to the next lower flex page with size \a bits.
334 * \ingroup l4_memory_api
336 * \param address The address to round.
337 * \param bits The size of the flex page (log2).
339 L4_INLINE l4_addr_t l4_trunc_size(l4_addr_t address, unsigned char bits) L4_NOTHROW;
340 L4_INLINE l4_addr_t l4_trunc_size(l4_addr_t x, unsigned char bits) L4_NOTHROW
341 { return x & (~0UL << bits); }
344 * \brief Round address up to the next page.
345 * \ingroup l4_memory_api
347 * \param address The address to round up.
349 L4_INLINE l4_addr_t l4_round_page(l4_addr_t address) L4_NOTHROW;
350 L4_INLINE l4_addr_t l4_round_page(l4_addr_t x) L4_NOTHROW
351 { return (x + L4_PAGESIZE-1) & L4_PAGEMASK; }
354 * \brief Round address up to the next flex page with \a bits size.
355 * \ingroup l4_memory_api
357 * \param address The address to round up to the next flex page.
358 * \param bits The size of the flex page (log2).
360 L4_INLINE l4_addr_t l4_round_size(l4_addr_t address, unsigned char bits) L4_NOTHROW;
361 L4_INLINE l4_addr_t l4_round_size(l4_addr_t x, unsigned char bits) L4_NOTHROW
362 { return (x + (1UL << bits) - 1) & (~0UL << bits); }
365 * \brief Address related constants.
366 * \ingroup l4_memory_api
368 enum l4_addr_consts_t {
370 L4_INVALID_ADDR = ~0UL
374 * \brief Invalid address as pointer type.
375 * \ingroup l4_memory_api
377 #define L4_INVALID_PTR ((void*)L4_INVALID_ADDR)
381 # define NULL ((void *)0) /**< \ingroup l4sys_defines
390 #endif /* ! __L4_SYS__INCLUDE__CONSTS_H__ */