x86_64_linux_nolibc/syscall/x86_64/linux/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2
3//! This library was built for x86-64 Linux.
4
5pub mod macros;
6pub mod nr;
7
8use core::arch::asm;
9
10#[inline(always)]
11pub unsafe fn syscall0(nr: isize) -> isize {
12    let ret: isize;
13
14    asm!(
15    "syscall",
16    inlateout("rax") nr => ret,
17    lateout("rcx") _, // clobbered
18    lateout("r11") _, // clobbered
19    );
20
21    ret
22}
23
24pub unsafe fn syscall1(nr: isize, a1: usize) -> isize {
25    let ret: isize;
26
27    asm!(
28    "syscall",
29    inlateout("rax") nr => ret,
30    in("rdi") a1,
31    lateout("rcx") _, // clobbered
32    lateout("r11") _, // clobbered
33    );
34
35    ret
36}
37
38pub unsafe fn syscall2(nr: isize, a1: usize, a2: usize) -> isize {
39    let ret: isize;
40
41    asm!(
42    "syscall",
43    inlateout("rax") nr => ret,
44    in("rdi") a1,
45    in("rsi") a2,
46    lateout("rcx") _, // clobbered
47    lateout("r11") _, // clobbered
48    );
49
50    ret
51}
52
53pub unsafe fn syscall3(nr: isize, a1: usize, a2: usize, a3: usize) -> isize {
54    let ret: isize;
55
56    asm!(
57    "syscall",
58    inlateout("rax") nr => ret,
59    in("rdi") a1,
60    in("rsi") a2,
61    in("rdx") a3,
62    lateout("rcx") _, // clobbered
63    lateout("r11") _, // clobbered
64    );
65
66    ret
67}
68
69pub unsafe fn syscall4(nr: isize, a1: usize, a2: usize, a3: usize, a4: usize) -> isize {
70    let ret: isize;
71
72    asm!(
73    "syscall",
74    inlateout("rax") nr => ret,
75    in("rdi") a1,
76    in("rsi") a2,
77    in("rdx") a3,
78    in("r10") a4,
79    lateout("rcx") _, // clobbered
80    lateout("r11") _, // clobbered
81    );
82
83    ret
84}
85
86pub unsafe fn syscall5(nr: isize, a1: usize, a2: usize, a3: usize, a4: usize, a5: usize) -> isize {
87    let ret: isize;
88
89    asm!(
90    "syscall",
91    inlateout("rax") nr => ret,
92    in("rdi") a1,
93    in("rsi") a2,
94    in("rdx") a3,
95    in("r10") a4,
96    in("r8") a5,
97    lateout("rcx") _, // clobbered
98    lateout("r11") _, // clobbered
99    );
100
101    ret
102}
103
104pub unsafe fn syscall6(
105    nr: isize,
106    a1: usize,
107    a2: usize,
108    a3: usize,
109    a4: usize,
110    a5: usize,
111    a6: usize,
112) -> isize {
113    let ret: isize;
114
115    asm!(
116    "syscall",
117    inlateout("rax") nr => ret,
118    in("rdi") a1,
119    in("rsi") a2,
120    in("rdx") a3,
121    in("r10") a4,
122    in("r8") a5,
123    in("r9") a6,
124    lateout("rcx") _, // clobbered
125    lateout("r11") _, // clobbered
126    );
127
128    ret
129}