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