userspace/target/architecture/x86_64/syscall/
syscall5.rs

1use super::result::*;
2
3#[inline(always)]
4pub fn syscall5(n: usize, a1: usize, a2: usize, a3: usize, a4: usize, a5: usize) -> crate::Result {
5    let syscall_return: usize;
6
7    unsafe {
8        core::arch::asm!(
9            "syscall",
10            inlateout("rax") n => syscall_return ,
11            in("rdi") a1,
12            in("rsi") a2,
13            in("rdx") a3,
14            in("r10") a4,
15            in("r8") a5,
16            out("rcx") _,
17            out("r11") _,
18        );
19    }
20    handle_result(syscall_return)
21}
22
23pub mod ok {
24    ample::result!(
25        Ok;
26        "Human Ok";
27        usize;
28        [
29            [0; X86_64_SYSCALL1_OK; Default; usize; "ZE"; "Entry to ze"],
30        ]
31    );
32
33    impl Ok {
34        pub fn from_no(no: usize) -> Self {
35            Ok::Default(no)
36        }
37    }
38}
39
40pub mod error {
41    ample::result!(
42        Error;
43        "Human error";
44        usize;
45        [
46            [0; X86_64_SYSCALL1_ERROR; Default; usize; "ZE"; "Entry to ze"],
47        ]
48    );
49
50    impl Error {
51        pub fn from_no(no: usize) -> Self {
52            Error::Default(no)
53        }
54    }
55}
56
57pub use error::Error;
58pub use ok::Ok;
59
60pub type Result = core::result::Result<Ok, Error>;
61
62pub fn handle_result(result: usize) -> crate::Result {
63    if (result as isize) < 0 {
64        core::result::Result::Err(crate::Error::Target(crate::target::Error::Arch(
65            crate::target::arch::Error::X86_64Syscall(
66                crate::target::arch::syscall::Error::X86_64Syscall5(Error::Default(result)),
67            ),
68        )))
69    } else {
70        core::result::Result::Ok(crate::Ok::Target(crate::target::Ok::Arch(
71            crate::target::arch::Ok::X86_64Syscall(
72                crate::target::arch::syscall::Ok::X86_64Syscall5(Ok::Default(result)),
73            ),
74        )))
75    }
76}