1/*
2 * Copyright 2017, Data61
3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
4 * ABN 41 687 119 230.
5 *
6 * This software may be distributed and modified according to the terms of
7 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
8 * See "LICENSE_BSD2.txt" for details.
9 *
10 * @TAG(DATA61_BSD)
11 */
12
13#ifndef __LIBSEL4_SEL4_SEL4_ARCH_SYSCALLS_SYSCALL_H_
14#define __LIBSEL4_SEL4_SEL4_ARCH_SYSCALLS_SYSCALL_H_
15
16#include <autoconf.h>
17#include <sel4/arch/functions.h>
18#include <sel4/types.h>
19
20static inline void
21x64_sys_send(seL4_Word sys, seL4_Word dest, seL4_Word info, seL4_Word msg0, seL4_Word msg1, seL4_Word msg2, seL4_Word msg3)
22{
23    register seL4_Word mr0 asm("r10") = msg0;
24    register seL4_Word mr1 asm("r8") = msg1;
25    register seL4_Word mr2 asm("r9") = msg2;
26    register seL4_Word mr3 asm("r15") = msg3;
27
28    asm volatile (
29        "movq   %%rsp, %%rbx        \n"
30        "syscall                    \n"
31        "movq   %%rbx, %%rsp        \n"
32        :
33        : "d" (sys),
34        "D" (dest),
35        "S" (info),
36        "r" (mr0),
37        "r" (mr1),
38        "r" (mr2),
39        "r" (mr3)
40        : "%rcx", "%rbx", "r11"
41    );
42}
43
44static inline void
45x64_sys_send_null(seL4_Word sys, seL4_Word dest, seL4_Word info)
46{
47    asm volatile (
48        "movq   %%rsp, %%rbx        \n"
49        "syscall                    \n"
50        "movq   %%rbx, %%rsp        \n"
51        :
52        : "d" (sys),
53        "D" (dest),
54        "S" (info)
55        : "%rcx", "%rbx", "%r11"
56    );
57}
58
59static inline void
60x64_sys_recv(seL4_Word sys, seL4_Word src, seL4_Word *out_badge, seL4_Word *out_info, seL4_Word *out_mr0, seL4_Word *out_mr1, seL4_Word *out_mr2, seL4_Word *out_mr3, seL4_Word reply)
61{
62    register seL4_Word mr0 asm("r10");
63    register seL4_Word mr1 asm("r8");
64    register seL4_Word mr2 asm("r9");
65    register seL4_Word mr3 asm("r15");
66    register seL4_Word reply_reg asm("r12") = reply;
67
68    asm volatile (
69        "movq   %%rsp, %%rbx    \n"
70        "syscall                \n"
71        "movq   %%rbx, %%rsp    \n"
72        : "=D" (*out_badge),
73        "=S" (*out_info),
74        "=r" (mr0),
75        "=r" (mr1),
76        "=r" (mr2),
77        "=r" (mr3)
78        : "d" (sys),
79        "D" (src),
80        "r" (reply_reg)
81        : "%rcx", "%rbx", "r11", "memory"
82    );
83    *out_mr0 = mr0;
84    *out_mr1 = mr1;
85    *out_mr2 = mr2;
86    *out_mr3 = mr3;
87}
88
89static inline void
90x64_sys_send_recv(seL4_Word sys, seL4_Word dest, seL4_Word *out_dest, seL4_Word info, seL4_Word *out_info, seL4_Word *in_out_mr0, seL4_Word *in_out_mr1, seL4_Word *in_out_mr2, seL4_Word *in_out_mr3, seL4_Word reply)
91{
92    register seL4_Word mr0 asm("r10") = *in_out_mr0;
93    register seL4_Word mr1 asm("r8") = *in_out_mr1;
94    register seL4_Word mr2 asm("r9") = *in_out_mr2;
95    register seL4_Word mr3 asm("r15") = *in_out_mr3;
96    register seL4_Word reply_reg asm("r12") = reply;
97
98    asm volatile (
99        "movq   %%rsp, %%rbx    \n"
100        "syscall                \n"
101        "movq   %%rbx, %%rsp    \n"
102        : "=S" (*out_info),
103        "=r" (mr0),
104        "=r" (mr1),
105        "=r" (mr2),
106        "=r" (mr3),
107        "=D" (*out_dest)
108        : "d" (sys),
109        "D" (dest),
110        "S" (info),
111        "r" (mr0),
112        "r" (mr1),
113        "r" (mr2),
114        "r" (mr3),
115        "r" (reply_reg)
116        : "%rcx", "%rbx", "r11", "memory"
117    );
118    *in_out_mr0 = mr0;
119    *in_out_mr1 = mr1;
120    *in_out_mr2 = mr2;
121    *in_out_mr3 = mr3;
122}
123
124static inline void
125x64_sys_nbsend_recv(seL4_Word sys, seL4_Word dest, seL4_Word src, seL4_Word *out_dest, seL4_Word info, seL4_Word *out_info, seL4_Word *in_out_mr0, seL4_Word *in_out_mr1, seL4_Word *in_out_mr2, seL4_Word *in_out_mr3, seL4_Word reply)
126{
127    register seL4_Word mr0 asm("r10") = *in_out_mr0;
128    register seL4_Word mr1 asm("r8") = *in_out_mr1;
129    register seL4_Word mr2 asm("r9") = *in_out_mr2;
130    register seL4_Word mr3 asm("r15") = *in_out_mr3;
131    register seL4_Word reply_reg asm("r12") = reply;
132    register seL4_Word dest_reg asm("r13") = dest;
133
134    asm volatile (
135        "movq   %%rsp, %%rbx    \n"
136        "syscall                \n"
137        "movq   %%rbx, %%rsp    \n"
138        : "=S" (*out_info),
139        "=r" (mr0),
140        "=r" (mr1),
141        "=r" (mr2),
142        "=r" (mr3),
143        "=D" (*out_dest)
144        : "d" (sys),
145        "D" (src),
146        "S" (info),
147        "r" (mr0),
148        "r" (mr1),
149        "r" (mr2),
150        "r" (mr3),
151        "r" (reply_reg),
152        "r" (dest_reg)
153        : "%rcx", "%rbx", "r11", "memory"
154    );
155    *in_out_mr0 = mr0;
156    *in_out_mr1 = mr1;
157    *in_out_mr2 = mr2;
158    *in_out_mr3 = mr3;
159}
160static inline void
161x64_sys_null(seL4_Word sys)
162{
163    asm volatile (
164        "movq   %%rsp, %%rbx    \n"
165        "syscall                \n"
166        "movq   %%rbx, %%rsp    \n"
167        :
168        : "d" (sys)
169        : "%rbx", "%rcx", "%rsi", "%rdi", "%r11"
170    );
171}
172
173#endif /* __LIBSEL4_SEL4_SEL4_ARCH_SYSCALLS_SYSCALL_H_ */
174