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