]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/l4re-core/l4sys/include/ARCH-amd64/L4API-l4f/ipc.h
Update
[l4.git] / l4 / pkg / l4re-core / l4sys / include / ARCH-amd64 / L4API-l4f / ipc.h
1 /**
2  * \internal
3  * \file
4  * \brief   L4 IPC System Calls, amd64
5  * \ingroup api_calls
6  */
7 /*
8  * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
9  *               Alexander Warg <warg@os.inf.tu-dresden.de>,
10  *               Frank Mehnert <fm3@os.inf.tu-dresden.de>,
11  *               Torsten Frenzel <frenzel@os.inf.tu-dresden.de>
12  *     economic rights: Technische Universität Dresden (Germany)
13  *
14  * This file is part of TUD:OS and distributed under the terms of the
15  * GNU General Public License 2.
16  * Please see the COPYING-GPL-2 file for details.
17  *
18  * As a special exception, you may use this file as part of a free software
19  * library without restriction.  Specifically, if other files instantiate
20  * templates or use macros or inline functions from this file, or you compile
21  * this file and link it with other files to produce an executable, this
22  * file does not by itself cause the resulting executable to be covered by
23  * the GNU General Public License.  This exception does not however
24  * invalidate any other reasons why the executable file might be covered by
25  * the GNU General Public License.
26  */
27 #ifndef __L4SYS__INCLUDE__ARCH_AMD64__L4API_L4F__IPC_H__
28 #define __L4SYS__INCLUDE__ARCH_AMD64__L4API_L4F__IPC_H__
29
30 #include_next <l4/sys/ipc.h>
31
32 L4_INLINE l4_msgtag_t
33 l4_ipc(l4_cap_idx_t dest, l4_utcb_t *utcb,
34        l4_umword_t flags,
35        l4_umword_t slabel,
36        l4_msgtag_t tag,
37        l4_umword_t *rlabel,
38        l4_timeout_t timeout) L4_NOTHROW
39 {
40   l4_umword_t dummy, dummy2;
41   register l4_umword_t to __asm__("r8") = timeout.raw;
42
43   (void)utcb;
44
45   __asm__ __volatile__
46     ("syscall"
47      :
48      "=d" (dummy2),
49      "=S" (slabel),
50      "=D" (dummy),
51      "=a" (tag.raw)
52      :
53      "S" (slabel),
54      "r" (to),
55      "a" (tag.raw),
56      "d" (dest | flags)
57      :
58      "memory", "cc", "rcx", "r11", "r15"
59      );
60
61   if (rlabel)
62     *rlabel = slabel;
63
64   return tag;
65 }
66
67 #endif /* ! __L4SYS__INCLUDE__ARCH_AMD64__L4API_L4F__IPC_H__ */