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

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