linux_syscalls/macros/
mod.rs

1/// Make a syscall and returns a `Result<usize, Errno>`
2///
3/// Accept a [`Sysno`] as the first parameter and a variable number of arguments (0 to 6).
4/// It calls syscallN under the hood where N is the number of arguments.
5///
6/// The are two variations:
7/// - `[ro]`: use the `_readonly` version of `syscallN`.
8/// - `[!]`: use the `_noreturn` version of `syscall1` (useful for [`exit`]).
9///
10/// Use the previous tags if you what are you doing, otherwise you can omit them.
11///
12/// # Example
13///
14/// ```
15/// use linux_syscalls::{Errno, Sysno, syscall};
16///
17/// let mut buf: [u8; 1024] = [0; 1024];
18/// let buf = loop {
19///     match unsafe { syscall!(Sysno::read, 0, buf.as_mut_ptr(), buf.len()) } {
20///         Ok(n) => break &buf[..n],
21///         Err(Errno::EINTR) => (),
22///         Err(err) => return Err(err),
23///     }
24/// };
25///
26/// // [ro] because write do not change the memory.
27/// unsafe { syscall!([ro] Sysno::write, 1, buf.as_ptr(), buf.len())? };
28///
29/// // [!] because exit do not return.
30/// unsafe { syscall!([!] Sysno::exit, 0) };
31/// ```
32///
33/// [`Sysno`]: crate::Sysno
34/// [`exit`]: crate::Sysno::exit
35#[macro_export]
36macro_rules! syscall {
37    ([ro] $sysno:expr, $arg0:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $arg5:expr $(,)?) => {
38        $crate::syscall6_readonly(
39            $sysno,
40            ($arg0) as usize,
41            ($arg1) as usize,
42            ($arg2) as usize,
43            ($arg3) as usize,
44            ($arg4) as usize,
45            ($arg5) as usize,
46        )
47    };
48    ([ro] $sysno:expr, $arg0:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr $(,)?) => {
49        $crate::syscall5_readonly(
50            $sysno,
51            ($arg0) as usize,
52            ($arg1) as usize,
53            ($arg2) as usize,
54            ($arg3) as usize,
55            ($arg4) as usize,
56        )
57    };
58    ([ro] $sysno:expr, $arg0:expr, $arg1:expr, $arg2:expr, $arg3:expr $(,)?) => {
59        $crate::syscall4_readonly(
60            $sysno,
61            ($arg0) as usize,
62            ($arg1) as usize,
63            ($arg2) as usize,
64            ($arg3) as usize,
65        )
66    };
67    ([ro] $sysno:expr, $arg0:expr, $arg1:expr, $arg2:expr $(,)?) => {
68        $crate::syscall3_readonly($sysno, ($arg0) as usize, ($arg1) as usize, ($arg2) as usize)
69    };
70    ([ro] $sysno:expr, $arg0:expr, $arg1:expr $(,)?) => {
71        $crate::syscall2_readonly($sysno, ($arg0) as usize, ($arg1) as usize)
72    };
73    ([!] $sysno:expr, $arg0:expr $(,)?) => {
74        $crate::syscall1_noreturn($sysno, ($arg0) as usize)
75    };
76    ([ro] $sysno:expr, $arg0:expr $(,)?) => {
77        $crate::syscall1_readonly($sysno, ($arg0) as usize)
78    };
79    ([ro] $sysno:expr $(,)?) => {
80        $crate::syscall0_readonly($sysno)
81    };
82    ($sysno:expr, $arg0:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $arg5:expr $(,)?) => {
83        $crate::syscall6(
84            $sysno,
85            ($arg0) as usize,
86            ($arg1) as usize,
87            ($arg2) as usize,
88            ($arg3) as usize,
89            ($arg4) as usize,
90            ($arg5) as usize,
91        )
92    };
93    ($sysno:expr, $arg0:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr $(,)?) => {
94        $crate::syscall5(
95            $sysno,
96            ($arg0) as usize,
97            ($arg1) as usize,
98            ($arg2) as usize,
99            ($arg3) as usize,
100            ($arg4) as usize,
101        )
102    };
103    ($sysno:expr, $arg0:expr, $arg1:expr, $arg2:expr, $arg3:expr $(,)?) => {
104        $crate::syscall4(
105            $sysno,
106            ($arg0) as usize,
107            ($arg1) as usize,
108            ($arg2) as usize,
109            ($arg3) as usize,
110        )
111    };
112    ($sysno:expr, $arg0:expr, $arg1:expr, $arg2:expr $(,)?) => {
113        $crate::syscall3($sysno, ($arg0) as usize, ($arg1) as usize, ($arg2) as usize)
114    };
115    ($sysno:expr, $arg0:expr, $arg1:expr $(,)?) => {
116        $crate::syscall2($sysno, ($arg0) as usize, ($arg1) as usize)
117    };
118    ($sysno:expr, $arg0:expr $(,)?) => {
119        $crate::syscall1($sysno, ($arg0) as usize)
120    };
121    ($sysno:expr $(,)?) => {
122        $crate::syscall0($sysno)
123    };
124}
125
126/// Make a syscall and returns a `usize`
127///
128/// Accept a [`Sysno`] as the first parameter and a variable number of arguments (0 to 6).
129/// It calls syscallN under the hood where N is the number of arguments.
130///
131/// The are two variations:
132/// - `[ro]`: use the `_readonly` version of `raw_syscallN`.
133/// - `[!]`: use the `_noreturn` version of `syscall1` (useful for [`exit`]).
134///
135/// Use the previous tags if you what are you doing, otherwise you can omit them.
136///
137/// # Example
138///
139/// ```
140/// use linux_syscalls::{Sysno, raw_syscall};
141///
142/// println!("{}", raw_syscall!([ro] Sysno::brk, 0));
143///
144/// // [!] because exit do not return.
145/// unsafe { raw_syscall!([!] Sysno::exit, 0) };
146/// ```
147///
148/// [`Sysno`]: crate::Sysno
149/// [`exit`]: crate::Sysno::exit
150#[macro_export]
151macro_rules! raw_syscall {
152    ([ro] $sysno:expr, $arg0:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $arg5:expr $(,)?) => {
153        $crate::raw_syscall6_readonly(
154            $sysno,
155            ($arg0) as usize,
156            ($arg1) as usize,
157            ($arg2) as usize,
158            ($arg3) as usize,
159            ($arg4) as usize,
160            ($arg5) as usize,
161        )
162    };
163    ([ro] $sysno:expr, $arg0:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr $(,)?) => {
164        $crate::raw_syscall5_readonly(
165            $sysno,
166            ($arg0) as usize,
167            ($arg1) as usize,
168            ($arg2) as usize,
169            ($arg3) as usize,
170            ($arg4) as usize,
171        )
172    };
173    ([ro] $sysno:expr, $arg0:expr, $arg1:expr, $arg2:expr, $arg3:expr $(,)?) => {
174        $crate::raw_syscall4_readonly(
175            $sysno,
176            ($arg0) as usize,
177            ($arg1) as usize,
178            ($arg2) as usize,
179            ($arg3) as usize,
180        )
181    };
182    ([ro] $sysno:expr, $arg0:expr, $arg1:expr, $arg2:expr $(,)?) => {
183        $crate::raw_syscall3_readonly($sysno, ($arg0) as usize, ($arg1) as usize, ($arg2) as usize)
184    };
185    ([ro] $sysno:expr, $arg0:expr, $arg1:expr $(,)?) => {
186        $crate::raw_syscall2_readonly($sysno, ($arg0) as usize, ($arg1) as usize)
187    };
188    ([!] $sysno:expr, $arg0:expr $(,)?) => {
189        $crate::syscall1_noreturn($sysno, ($arg0) as usize)
190    };
191    ([ro] $sysno:expr, $arg0:expr $(,)?) => {
192        $crate::raw_syscall1_readonly($sysno, ($arg0) as usize)
193    };
194    ([ro] $sysno:expr $(,)?) => {
195        $crate::raw_syscall0_readonly($sysno)
196    };
197    ($sysno:expr, $arg0:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $arg5:expr $(,)?) => {
198        $crate::raw_syscall6(
199            $sysno,
200            ($arg0) as usize,
201            ($arg1) as usize,
202            ($arg2) as usize,
203            ($arg3) as usize,
204            ($arg4) as usize,
205            ($arg5) as usize,
206        )
207    };
208    ($sysno:expr, $arg0:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr $(,)?) => {
209        $crate::raw_syscall5(
210            $sysno,
211            ($arg0) as usize,
212            ($arg1) as usize,
213            ($arg2) as usize,
214            ($arg3) as usize,
215            ($arg4) as usize,
216        )
217    };
218    ($sysno:expr, $arg0:expr, $arg1:expr, $arg2:expr, $arg3:expr $(,)?) => {
219        $crate::raw_syscall4(
220            $sysno,
221            ($arg0) as usize,
222            ($arg1) as usize,
223            ($arg2) as usize,
224            ($arg3) as usize,
225        )
226    };
227    ($sysno:expr, $arg0:expr, $arg1:expr, $arg2:expr $(,)?) => {
228        $crate::raw_syscall3($sysno, ($arg0) as usize, ($arg1) as usize, ($arg2) as usize)
229    };
230    ($sysno:expr, $arg0:expr, $arg1:expr $(,)?) => {
231        $crate::raw_syscall2($sysno, ($arg0) as usize, ($arg1) as usize)
232    };
233    ($sysno:expr, $arg0:expr $(,)?) => {
234        $crate::raw_syscall1($sysno, ($arg0) as usize)
235    };
236    ($sysno:expr $(,)?) => {
237        $crate::raw_syscall0($sysno)
238    };
239}