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

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