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

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