linux_syscalls/inline/
x86_64.rs

1use crate::Sysno;
2
3use core::arch::asm;
4
5#[allow(clippy::missing_safety_doc)]
6#[inline(always)]
7pub unsafe fn raw_syscall0(sysno: Sysno) -> usize {
8    let ret;
9    asm!(
10        "syscall",
11        inlateout("rax") sysno as usize => ret,
12        lateout("rcx") _,
13        lateout("r11") _,
14        options(nostack, preserves_flags, readonly)
15    );
16    ret
17}
18
19pub use raw_syscall0 as raw_syscall0_readonly;
20
21#[allow(clippy::missing_safety_doc)]
22#[inline(always)]
23pub unsafe fn raw_syscall1(sysno: Sysno, arg0: usize) -> usize {
24    let ret;
25    asm!(
26        "syscall",
27        inlateout("rax") sysno as usize => ret,
28        in("rdi") arg0,
29        lateout("rcx") _,
30        lateout("r11") _,
31        options(nostack, preserves_flags)
32    );
33    ret
34}
35
36#[allow(clippy::missing_safety_doc)]
37#[inline(always)]
38pub unsafe fn raw_syscall1_readonly(sysno: Sysno, arg0: usize) -> usize {
39    let ret;
40    asm!(
41        "syscall",
42        inlateout("rax") sysno as usize => ret,
43        in("rdi") arg0,
44        lateout("rcx") _,
45        lateout("r11") _,
46        options(nostack, preserves_flags, readonly)
47    );
48    ret
49}
50
51#[allow(clippy::missing_safety_doc)]
52#[inline(always)]
53pub unsafe fn syscall1_noreturn(sysno: Sysno, arg0: usize) -> ! {
54    asm!(
55        "syscall",
56        "ud2",
57        in("rax") sysno as usize,
58        in("rdi") arg0,
59        options(noreturn)
60    )
61}
62
63#[allow(clippy::missing_safety_doc)]
64#[inline(always)]
65pub unsafe fn raw_syscall2(sysno: Sysno, arg0: usize, arg1: usize) -> usize {
66    let ret;
67    asm!(
68        "syscall",
69        inlateout("rax") sysno as usize => ret,
70        in("rdi") arg0,
71        in("rsi") arg1,
72        lateout("rcx") _,
73        lateout("r11") _,
74        options(nostack, preserves_flags)
75    );
76    ret
77}
78
79#[allow(clippy::missing_safety_doc)]
80#[inline(always)]
81pub unsafe fn raw_syscall2_readonly(sysno: Sysno, arg0: usize, arg1: usize) -> usize {
82    let ret;
83    asm!(
84        "syscall",
85        inlateout("rax") sysno as usize => ret,
86        in("rdi") arg0,
87        in("rsi") arg1,
88        lateout("rcx") _,
89        lateout("r11") _,
90        options(nostack, preserves_flags, readonly)
91    );
92    ret
93}
94
95#[allow(clippy::missing_safety_doc)]
96#[inline(always)]
97pub unsafe fn raw_syscall3(sysno: Sysno, arg0: usize, arg1: usize, arg2: usize) -> usize {
98    let ret;
99    asm!(
100        "syscall",
101        inlateout("rax") sysno as usize => ret,
102        in("rdi") arg0,
103        in("rsi") arg1,
104        in("rdx") arg2,
105        lateout("rcx") _,
106        lateout("r11") _,
107        options(nostack, preserves_flags)
108    );
109    ret
110}
111
112#[allow(clippy::missing_safety_doc)]
113#[inline(always)]
114pub unsafe fn raw_syscall3_readonly(sysno: Sysno, arg0: usize, arg1: usize, arg2: usize) -> usize {
115    let ret;
116    asm!(
117        "syscall",
118        inlateout("rax") sysno as usize => ret,
119        in("rdi") arg0,
120        in("rsi") arg1,
121        in("rdx") arg2,
122        lateout("rcx") _,
123        lateout("r11") _,
124        options(nostack, preserves_flags, readonly)
125    );
126    ret
127}
128
129#[allow(clippy::missing_safety_doc)]
130#[inline(always)]
131pub unsafe fn raw_syscall4(
132    sysno: Sysno,
133    arg0: usize,
134    arg1: usize,
135    arg2: usize,
136    arg3: usize,
137) -> usize {
138    let ret;
139    asm!(
140        "syscall",
141        inlateout("rax") sysno as usize => ret,
142        in("rdi") arg0,
143        in("rsi") arg1,
144        in("rdx") arg2,
145        in("r10") arg3,
146        lateout("rcx") _,
147        lateout("r11") _,
148        options(nostack, preserves_flags)
149    );
150    ret
151}
152
153#[allow(clippy::missing_safety_doc)]
154#[inline(always)]
155pub unsafe fn raw_syscall4_readonly(
156    sysno: Sysno,
157    arg0: usize,
158    arg1: usize,
159    arg2: usize,
160    arg3: usize,
161) -> usize {
162    let ret;
163    asm!(
164        "syscall",
165        inlateout("rax") sysno as usize => ret,
166        in("rdi") arg0,
167        in("rsi") arg1,
168        in("rdx") arg2,
169        in("r10") arg3,
170        lateout("rcx") _,
171        lateout("r11") _,
172        options(nostack, preserves_flags, readonly)
173    );
174    ret
175}
176
177#[allow(clippy::missing_safety_doc)]
178#[inline(always)]
179pub unsafe fn raw_syscall5(
180    sysno: Sysno,
181    arg0: usize,
182    arg1: usize,
183    arg2: usize,
184    arg3: usize,
185    arg4: usize,
186) -> usize {
187    let ret;
188    asm!(
189        "syscall",
190        inlateout("rax") sysno as usize => ret,
191        in("rdi") arg0,
192        in("rsi") arg1,
193        in("rdx") arg2,
194        in("r10") arg3,
195        in("r8") arg4,
196        lateout("rcx") _,
197        lateout("r11") _,
198        options(nostack, preserves_flags)
199    );
200    ret
201}
202
203#[allow(clippy::missing_safety_doc)]
204#[inline(always)]
205pub unsafe fn raw_syscall5_readonly(
206    sysno: Sysno,
207    arg0: usize,
208    arg1: usize,
209    arg2: usize,
210    arg3: usize,
211    arg4: usize,
212) -> usize {
213    let ret;
214    asm!(
215        "syscall",
216        inlateout("rax") sysno as usize => ret,
217        in("rdi") arg0,
218        in("rsi") arg1,
219        in("rdx") arg2,
220        in("r10") arg3,
221        in("r8") arg4,
222        lateout("rcx") _,
223        lateout("r11") _,
224        options(nostack, preserves_flags, readonly)
225    );
226    ret
227}
228
229#[allow(clippy::missing_safety_doc)]
230#[inline(always)]
231pub unsafe fn raw_syscall6(
232    sysno: Sysno,
233    arg0: usize,
234    arg1: usize,
235    arg2: usize,
236    arg3: usize,
237    arg4: usize,
238    arg5: usize,
239) -> usize {
240    let ret;
241    asm!(
242        "syscall",
243        inlateout("rax") sysno as usize => ret,
244        in("rdi") arg0,
245        in("rsi") arg1,
246        in("rdx") arg2,
247        in("r10") arg3,
248        in("r8") arg4,
249        in("r9") arg5,
250        lateout("rcx") _,
251        lateout("r11") _,
252        options(nostack, preserves_flags)
253    );
254    ret
255}
256
257#[allow(clippy::missing_safety_doc)]
258#[inline(always)]
259pub unsafe fn raw_syscall6_readonly(
260    sysno: Sysno,
261    arg0: usize,
262    arg1: usize,
263    arg2: usize,
264    arg3: usize,
265    arg4: usize,
266    arg5: usize,
267) -> usize {
268    let ret;
269    asm!(
270        "syscall",
271        inlateout("rax") sysno as usize => ret,
272        in("rdi") arg0,
273        in("rsi") arg1,
274        in("rdx") arg2,
275        in("r10") arg3,
276        in("r8") arg4,
277        in("r9") arg5,
278        lateout("rcx") _,
279        lateout("r11") _,
280        options(nostack, preserves_flags, readonly)
281    );
282    ret
283}
284
285include!("_syscalls.rs");
286
287#[inline(always)]
288pub(crate) fn init() {}