userspace/target/operating_system/linux/syscall/
mmap.rs

1use crate::target::arch::{Arch, traits::Callable};
2
3pub mod flags;
4pub mod prot;
5
6pub use flags::Flag;
7pub use prot::Prot;
8
9hooking!(MMAP);
10
11#[inline(always)]
12#[rustfmt::skip]
13pub fn mmap(addr: *mut u8, length: usize, prot: i32, flags: i32, fd: i32, offset: i64) -> crate::Result {
14    let arch_result = Arch::syscall6(
15        9,
16        addr as usize,
17        length,
18        prot as usize,
19        flags as usize,
20        fd as usize,
21        offset as usize,
22    );
23
24    handle_result(arch_result)
25}
26
27pub mod ok {
28    r#struct!(OkSyscallMUnMap { value: usize });
29
30    result!( Ok; "MUnMap Ok"; usize; [
31        [0; OK; Default; usize; "Ok"; "All good"],
32    ]);
33
34    impl Ok {
35        pub fn from_no(no: usize) -> Self {
36            Ok::Default(no)
37        }
38    }
39}
40
41pub mod error {
42    result!(Error; "MUnMap error"; usize; [
43        [1; ERROR; Default; usize; "Error"; "Something wicked this way comes"],
44    ]);
45
46    impl Error {
47        pub fn from_no(no: usize) -> Self {
48            Error::Default(no)
49        }
50    }
51}
52
53pub use error::Error;
54pub use ok::Ok;
55
56pub type Result = core::result::Result<Ok, Error>;
57
58pub fn handle_result(result: crate::Result) -> crate::Result {
59    // Err(crate::Error::Default(1))
60    match result {
61        crate::Result::Ok(crate::Ok::Target(crate::target::Ok::Arch(
62            crate::target::arch::Ok::X86_64Syscall(
63                crate::target::arch::syscall::Ok::X86_64Syscall6(
64                    crate::target::arch::syscall::syscall6::Ok::Default(m),
65                ),
66            ),
67        ))) => core::result::Result::Ok(crate::Ok::Target(crate::target::Ok::Os(
68            crate::target::os::Ok::Syscall(crate::target::os::syscall::Ok::MMap(
69                crate::target::os::syscall::mmap::Ok::Default(m),
70            )),
71        ))),
72        _ => core::result::Result::Err(crate::Error::Target(crate::target::Error::Os(
73            crate::target::os::Error::Syscall(crate::target::os::syscall::Error::MMap(
74                Error::Default(3),
75            )),
76        ))),
77    }
78}