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