Skip to content

Commit

Permalink
Enable mman feature of Nix crate
Browse files Browse the repository at this point in the history
  • Loading branch information
KaminariOS committed Nov 5, 2023
1 parent b44c778 commit 16da268
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 14 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion kernel-hal/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ smoltcp = { git = "https://github.com/smoltcp-rs/smoltcp", rev = "35e833e3", def
"socket-icmp",
"async",
] }
nix = { version = "0.27", optional = true, features = ["fs"]}
nix = { version = "0.27", optional = true, features = ["fs", "mman"]}
tempfile = { version = "3", optional = true }
async-std = { version = "1.10", optional = true }
bitmap-allocator = { git = "https://github.com/rcore-os/bitmap-allocator.git", rev = "88e871a5", optional = true }
Expand Down
38 changes: 25 additions & 13 deletions kernel-hal/src/libos/mock_mem.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
use std::os::unix::io::RawFd;

use core::convert::TryInto;
use core::mem;
use nix::fcntl::{self, OFlag};
use nix::sys::mman::{self, MapFlags, ProtFlags};
use nix::{sys::stat::Mode, unistd};
use std::os::fd::FromRawFd;
use std::os::unix::io::RawFd;

use super::mem::PMEM_MAP_VADDR;
use crate::{MMUFlags, PhysAddr, VirtAddr};
Expand All @@ -23,8 +25,9 @@ impl MockMemory {
Mode::S_IRWXU,
)
.expect("faild to open");
unistd::ftruncate(fd, size as _).expect("failed to set size of shared memory!");

let mut f = unsafe { std::fs::File::from_raw_fd(fd) };
unistd::ftruncate(&mut f, size as _).expect("failed to set size of shared memory!");
core::mem::forget(f);
let mem = Self { size, fd };
mem.mmap(PMEM_MAP_VADDR, size, 0, MMUFlags::READ | MMUFlags::WRITE);
mem
Expand Down Expand Up @@ -55,15 +58,24 @@ impl MockMemory {
vaddr,
prot,
);

unsafe { mman::mmap(vaddr as _, len, prot_noexec, flags, fd, offset) }.unwrap_or_else(
|err| {
panic!(
"failed to mmap: fd={}, offset={:#x}, len={:#x}, vaddr={:#x}, prot={:?}: {:?}",
fd, offset, len, vaddr, prot, err
)
},
);
let mut f = unsafe { std::fs::File::from_raw_fd(fd) };
unsafe {
mman::mmap(
vaddr.try_into().ok(),
len.try_into().unwrap(),
prot_noexec,
flags,
Some(&mut f),
offset,
)
}
.unwrap_or_else(|err| {
panic!(
"failed to mmap: fd={}, offset={:#x}, len={:#x}, vaddr={:#x}, prot={:?}: {:?}",
fd, offset, len, vaddr, prot, err
)
});
mem::forget(f);
if prot.contains(MMUFlags::EXECUTE) {
self.mprotect(vaddr, len, prot);
}
Expand Down

0 comments on commit 16da268

Please sign in to comment.