rawsys_linux/
macros.rs

1//! Macros: ergonomic syscall invocation helpers
2//!
3//! - `syscall!`: returns `Result<SyscallWord, Errno>` and is suitable for
4//!   general use.
5//! - `raw_syscall!`: returns the raw machine word for cases where the call is
6//!   guaranteed to succeed and you do not want `Errno` conversion.
7//! - `syscall_args!`: builds a `SyscallArgs` value from up to 6 expressions.
8//!
9//! Safety
10//! - All macros expand to `unsafe` calls because invoking a syscall is unsafe.
11//!   You are responsible for pointer validity, buffer sizes, and respecting the
12//!   kernel ABI for the selected architecture.
13//!
14//! Example
15//! ```no_run
16//! use rawsys_linux::{Sysno, syscall};
17//!
18//! match unsafe { syscall!(Sysno::getpid) } {
19//!     Ok(pid) => println!("pid={pid}"),
20//!     Err(err) => eprintln!("getpid failed: {err}"),
21//! }
22//! ```
23/// Performs a syscall and returns a `Result<SyscallWord, Errno>`.
24///
25/// Accepts a syscall number and a variable number of arguments (0 to 6).
26#[macro_export]
27macro_rules! syscall {
28    ($nr:expr) => {
29        $crate::syscall0($nr)
30    };
31
32    ($nr:expr, $a1:expr) => {
33        $crate::syscall1($nr, $a1 as $crate::SyscallWord)
34    };
35
36    ($nr:expr, $a1:expr, $a2:expr) => {
37        $crate::syscall2(
38            $nr,
39            $a1 as $crate::SyscallWord,
40            $a2 as $crate::SyscallWord,
41        )
42    };
43
44    ($nr:expr, $a1:expr, $a2:expr, $a3:expr) => {
45        $crate::syscall3(
46            $nr,
47            $a1 as $crate::SyscallWord,
48            $a2 as $crate::SyscallWord,
49            $a3 as $crate::SyscallWord,
50        )
51    };
52
53    ($nr:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr) => {
54        $crate::syscall4(
55            $nr,
56            $a1 as $crate::SyscallWord,
57            $a2 as $crate::SyscallWord,
58            $a3 as $crate::SyscallWord,
59            $a4 as $crate::SyscallWord,
60        )
61    };
62
63    ($nr:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr) => {
64        $crate::syscall5(
65            $nr,
66            $a1 as $crate::SyscallWord,
67            $a2 as $crate::SyscallWord,
68            $a3 as $crate::SyscallWord,
69            $a4 as $crate::SyscallWord,
70            $a5 as $crate::SyscallWord,
71        )
72    };
73
74    ($nr:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr, $a6:expr) => {
75        $crate::syscall6(
76            $nr,
77            $a1 as $crate::SyscallWord,
78            $a2 as $crate::SyscallWord,
79            $a3 as $crate::SyscallWord,
80            $a4 as $crate::SyscallWord,
81            $a5 as $crate::SyscallWord,
82            $a6 as $crate::SyscallWord,
83        )
84    };
85}
86
87/// Performs a raw syscall and returns a `SyscallWord`.
88///
89/// Prefer [`syscall!`] unless you are certain the syscall cannot fail (e.g.,
90/// `gettid`).
91///
92/// Accepts a syscall number and a variable number of arguments (0 to 6).
93///
94/// # Example
95/// ```no_run
96/// use rawsys_linux::{Sysno, raw_syscall};
97/// let tid = unsafe { raw_syscall!(Sysno::gettid) };
98/// println!("tid={tid}");
99/// ```
100#[macro_export]
101macro_rules! raw_syscall {
102    ($nr:expr) => {
103        $crate::raw::syscall0($nr as $crate::SyscallWord)
104    };
105
106    ($nr:expr, $a1:expr) => {
107        $crate::raw::syscall1(
108            $nr as $crate::SyscallWord,
109            $a1 as $crate::SyscallWord,
110        )
111    };
112
113    ($nr:expr, $a1:expr, $a2:expr) => {
114        $crate::raw::syscall2(
115            $nr as $crate::SyscallWord,
116            $a1 as $crate::SyscallWord,
117            $a2 as $crate::SyscallWord,
118        )
119    };
120
121    ($nr:expr, $a1:expr, $a2:expr, $a3:expr) => {
122        $crate::raw::syscall3(
123            $nr as $crate::SyscallWord,
124            $a1 as $crate::SyscallWord,
125            $a2 as $crate::SyscallWord,
126            $a3 as $crate::SyscallWord,
127        )
128    };
129
130    ($nr:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr) => {
131        $crate::raw::syscall4(
132            $nr as $crate::SyscallWord,
133            $a1 as $crate::SyscallWord,
134            $a2 as $crate::SyscallWord,
135            $a3 as $crate::SyscallWord,
136            $a4 as $crate::SyscallWord,
137        )
138    };
139
140    ($nr:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr) => {
141        $crate::raw::syscall5(
142            $nr as $crate::SyscallWord,
143            $a1 as $crate::SyscallWord,
144            $a2 as $crate::SyscallWord,
145            $a3 as $crate::SyscallWord,
146            $a4 as $crate::SyscallWord,
147            $a5 as $crate::SyscallWord,
148        )
149    };
150
151    ($nr:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr, $a6:expr) => {
152        $crate::raw::syscall6(
153            $nr as $crate::SyscallWord,
154            $a1 as $crate::SyscallWord,
155            $a2 as $crate::SyscallWord,
156            $a3 as $crate::SyscallWord,
157            $a4 as $crate::SyscallWord,
158            $a5 as $crate::SyscallWord,
159            $a6 as $crate::SyscallWord,
160        )
161    };
162}