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