faf_syscall/
lib.rs

1#![no_std]
2
3use core::arch::asm;
4
5#[macro_export]
6macro_rules! sys_call {
7    ($num:ident) => {
8        $crate::sys_call0($num)
9    };
10    ($num:expr, $arg1:expr) => {
11        $crate::sys_call1($num, $arg1)
12    };
13    ($num:expr, $arg1:expr, $arg2:expr) => {
14        $crate::sys_call2($num, $arg1, $arg2)
15    };
16    ($num:expr, $arg1:expr, $arg2:expr, $arg3:expr) => {
17        $crate::sys_call3($num, $arg1, $arg2, $arg3)
18    };
19    ($num:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr) => {
20        $crate::sys_call4($num, $arg1, $arg2, $arg3, $arg4)
21    };
22    ($num:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $arg5:expr) => {
23        $crate::sys_call5($num, $arg1, $arg2, $arg3, $arg4, $arg5)
24    };
25    ($num:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $arg5:expr, $arg6:expr) => {
26        $crate::sys_call6($num, $arg1, $arg2, $arg3, $arg4, $arg5, $arg6)
27    };
28}
29
30#[inline(always)]
31pub fn sys_call0(mut num: isize) -> isize {
32    unsafe {
33        asm!(
34         "syscall",
35         in("rax") num,
36         out("rcx") _,
37         out("r11") _,
38         lateout("rax") num,
39         options(nostack));
40
41        num
42    }
43}
44
45#[inline(always)]
46pub fn sys_call1(mut num: isize, arg1: isize) -> isize {
47    unsafe {
48        asm!(
49         "syscall",
50         in("rax") num,
51         in("rdi") arg1,
52         out("rcx") _,
53         out("r11") _,
54         lateout("rax") num,
55         options(nostack));
56        num
57    }
58}
59
60#[inline(always)]
61pub fn sys_call2(mut num: isize, arg1: isize, arg2: isize) -> isize {
62    unsafe {
63        asm!(
64         "syscall",
65         in("rax") num,
66         in("rdi") arg1,
67         in("rsi") arg2,
68         out("rcx") _,
69         out("r11") _,
70         lateout("rax") num,
71         options(nostack));
72        num
73    }
74}
75
76#[inline(always)]
77pub fn sys_call3(mut num: isize, arg1: isize, arg2: isize, arg3: isize) -> isize {
78    unsafe {
79        asm!(
80         "syscall",
81         in("rax") num,
82         in("rdi") arg1,
83         in("rsi") arg2,
84         in("rdx") arg3,
85         out("rcx") _,
86         out("r11") _,
87         lateout("rax") num,
88         options(nostack));
89        num
90    }
91}
92
93#[inline(always)]
94pub fn sys_call4(mut num: isize, arg1: isize, arg2: isize, arg3: isize, arg4: isize) -> isize {
95    unsafe {
96        asm!(
97         "syscall",
98         in("rax") num,
99         in("rdi") arg1,
100         in("rsi") arg2,
101         in("rdx") arg3,
102         in("r10") arg4,
103         out("rcx") _,
104         out("r11") _,
105         lateout("rax") num,
106         options(nostack));
107        num
108    }
109}
110
111#[inline(always)]
112pub fn sys_call5(
113    mut num: isize,
114    arg1: isize,
115    arg2: isize,
116    arg3: isize,
117    arg4: isize,
118    arg5: isize,
119) -> isize {
120    unsafe {
121        asm!(
122         "syscall",
123         in("rax") num,
124         in("rdi") arg1,
125         in("rsi") arg2,
126         in("rdx") arg3,
127         in("r10") arg4,
128         in("r8") arg5,
129         out("rcx") _,
130         out("r11") _,
131         lateout("rax") num,
132         options(nostack));
133        num
134    }
135}
136
137#[inline(always)]
138pub fn sys_call6(
139    mut num: isize,
140    arg1: isize,
141    arg2: isize,
142    arg3: isize,
143    arg4: isize,
144    arg5: isize,
145    arg6: isize,
146) -> isize {
147    unsafe {
148        asm!(
149         "syscall",
150         in("rax") num,
151         in("rdi") arg1,
152         in("rsi") arg2,
153         in("rdx") arg3,
154         in("r10") arg4,
155         in("r8") arg5,
156         in("r9") arg6,
157         out("rcx") _,
158         out("r11") _,
159         lateout("rax") num,
160         options(nostack));
161        num
162    }
163}