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