1 /**
2 * (c) 2015 Alexander Warg <alexander.warg@kernkonzept.com>
3 *
4 * This file is part of TUD:OS and distributed under the terms of the
5 * GNU General Public License 2.
6 * Please see the COPYING-GPL-2 file for details.
7 *
8 * As a special exception, you may use this file as part of a free software
9 * library without restriction. Specifically, if other files instantiate
10 * templates or use macros or inline functions from this file, or you compile
11 * this file and link it with other files to produce an executable, this
12 * file does not by itself cause the resulting executable to be covered by
13 * the GNU General Public License. This exception does not however
14 * invalidate any other reasons why the executable file might be covered by
15 * the GNU General Public License.
16 */
17
18 #pragma once
19
20 #include <l4/sys/irq.h>
21
22 enum L4_semaphore_op
23 {
24 L4_SEMAPHORE_OP_DOWN = 0,
25 // semaphore up is IRQ_OP_TRIGGER with IRQ/Triggerable protocol
26 };
27
28 L4_INLINE l4_msgtag_t
l4_semaphore_up(l4_cap_idx_t sem)29 l4_semaphore_up(l4_cap_idx_t sem) L4_NOTHROW
30 {
31 return l4_irq_trigger(sem);
32 }
33
34 L4_INLINE l4_msgtag_t
l4_semaphore_up_u(l4_cap_idx_t sem,l4_utcb_t * utcb)35 l4_semaphore_up_u(l4_cap_idx_t sem, l4_utcb_t *utcb) L4_NOTHROW
36 {
37 return l4_irq_trigger_u(sem, utcb);
38 }
39
40 L4_INLINE l4_msgtag_t
41 l4_semaphore_down(l4_cap_idx_t sem, l4_timeout_t to) L4_NOTHROW;
42
43 /**
44 * \internal
45 */
46 L4_INLINE l4_msgtag_t
47 l4_semaphore_down_u(l4_cap_idx_t sem, l4_timeout_t to,
48 l4_utcb_t *utcb) L4_NOTHROW;
49
50
51 L4_INLINE l4_msgtag_t
l4_semaphore_down_u(l4_cap_idx_t sem,l4_timeout_t to,l4_utcb_t * utcb)52 l4_semaphore_down_u(l4_cap_idx_t sem, l4_timeout_t to,
53 l4_utcb_t *utcb) L4_NOTHROW
54 {
55 l4_msg_regs_t *m = l4_utcb_mr_u(utcb);
56 m->mr[0] = L4_SEMAPHORE_OP_DOWN;
57 return l4_ipc_call(sem, utcb, l4_msgtag(L4_PROTO_SEMAPHORE, 1, 0, 0), to);
58 }
59
60
61 L4_INLINE l4_msgtag_t
l4_semaphore_down(l4_cap_idx_t sem,l4_timeout_t to)62 l4_semaphore_down(l4_cap_idx_t sem, l4_timeout_t to) L4_NOTHROW
63 {
64 return l4_semaphore_down_u(sem, to, l4_utcb());
65 }
66
67