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

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