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}