Skip to main content

nc/syscalls/
syscall_x86_64.rs

1// Copyright (c) 2020 Xu Shaohua <shaohua@biofan.org>. All rights reserved.
2// Use of this source is governed by Apache-2.0 License that can be found
3// in the LICENSE file.
4
5#![allow(clippy::missing_errors_doc)]
6#![allow(clippy::missing_safety_doc)]
7#![allow(clippy::module_name_repetitions)]
8
9use core::arch::asm;
10
11use super::types::{check_errno, Errno, Sysno};
12
13#[inline]
14pub unsafe fn syscall0(n: Sysno) -> Result<usize, Errno> {
15    let ret: usize;
16    unsafe {
17        asm!("syscall",
18            in("rax") n,
19            out("rcx") _,  // clobbered by syscalls
20            out("r11") _,  // clobbered by syscalls
21            lateout("rax") ret,
22        );
23    }
24    check_errno(ret)
25}
26
27#[inline]
28pub unsafe fn syscall1(n: Sysno, a1: usize) -> Result<usize, Errno> {
29    let ret: usize;
30    unsafe {
31        asm!("syscall",
32            in("rax") n,
33            in("rdi") a1,
34            out("rcx") _,
35            out("r11") _,
36            lateout("rax") ret,
37        );
38    }
39    check_errno(ret)
40}
41
42#[inline]
43pub unsafe fn syscall2(n: Sysno, a1: usize, a2: usize) -> Result<usize, Errno> {
44    let ret: usize;
45    unsafe {
46        asm!("syscall",
47            in("rax") n,
48            in("rdi") a1,
49            in("rsi") a2,
50            out("rcx") _,
51            out("r11") _,
52            lateout("rax") ret,
53        );
54    }
55    check_errno(ret)
56}
57
58#[inline]
59pub unsafe fn syscall3(n: Sysno, a1: usize, a2: usize, a3: usize) -> Result<usize, Errno> {
60    let ret: usize;
61    unsafe {
62        asm!("syscall",
63            in("rax") n,
64            in("rdi") a1,
65            in("rsi") a2,
66            in("rdx") a3,
67            out("rcx") _,
68            out("r11") _,
69            lateout("rax") ret,
70        );
71    }
72    check_errno(ret)
73}
74
75#[inline]
76pub unsafe fn syscall4(
77    n: Sysno,
78    a1: usize,
79    a2: usize,
80    a3: usize,
81    a4: usize,
82) -> Result<usize, Errno> {
83    let ret: usize;
84    unsafe {
85        asm!("syscall",
86            in("rax") n,
87            in("rdi") a1,
88            in("rsi") a2,
89            in("rdx") a3,
90            in("r10") a4,
91            out("rcx") _,
92            out("r11") _,
93            lateout("rax") ret,
94        );
95    }
96    check_errno(ret)
97}
98
99#[inline]
100pub unsafe fn syscall5(
101    n: Sysno,
102    a1: usize,
103    a2: usize,
104    a3: usize,
105    a4: usize,
106    a5: usize,
107) -> Result<usize, Errno> {
108    let ret: usize;
109    unsafe {
110        asm!("syscall",
111            in("rax") n,
112            in("rdi") a1,
113            in("rsi") a2,
114            in("rdx") a3,
115            in("r10") a4,
116            in("r8") a5,
117            out("rcx") _,
118            out("r11") _,
119            lateout("rax") ret,
120        );
121    }
122    check_errno(ret)
123}
124
125#[inline]
126pub unsafe fn syscall6(
127    n: Sysno,
128    a1: usize,
129    a2: usize,
130    a3: usize,
131    a4: usize,
132    a5: usize,
133    a6: usize,
134) -> Result<usize, Errno> {
135    let ret: usize;
136    unsafe {
137        asm!("syscall",
138            in("rax") n,
139            in("rdi") a1,
140            in("rsi") a2,
141            in("rdx") a3,
142            in("r10") a4,
143            in("r8") a5,
144            in("r9") a6,
145            out("rcx") _,
146            out("r11") _,
147            lateout("rax") ret,
148        );
149    }
150    check_errno(ret)
151}