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