userspace/target/architecture/x86_64/syscall/
syscall0.rs1use 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}