Update fmap support

This commit is contained in:
Jeremy Soller
2018-12-28 15:46:38 -07:00
parent 51b093b598
commit 5cb92284f2
3 changed files with 43 additions and 53 deletions
+6 -6
View File
@@ -1,11 +1,11 @@
use platform::types::*;
pub const PROT_READ: c_int = 0;
pub const PROT_WRITE: c_int = 0;
pub const PROT_EXEC: c_int = 0;
pub const PROT_NONE: c_int = 0;
pub const PROT_EXEC: c_int = 1;
pub const PROT_WRITE: c_int = 2;
pub const PROT_READ: c_int = 4;
pub const MAP_SHARED: c_int = 0;
pub const MAP_PRIVATE: c_int = 0;
pub const MAP_ANON: c_int = 1;
pub const MAP_SHARED: c_int = 1;
pub const MAP_PRIVATE: c_int = 2;
pub const MAP_ANON: c_int = 4;
pub const MAP_ANONYMOUS: c_int = MAP_ANON;
+14 -24
View File
@@ -1,10 +1,9 @@
//! sys/socket implementation, following http://pubs.opengroup.org/onlinepubs/009696699/basedefs/sys/socket.h.html
use alloc::collections::BTreeMap;
use cbitset::BitSet;
use core::result::Result as CoreResult;
use core::{mem, ptr, slice};
use spin::{Mutex, MutexGuard, Once};
use syscall::data::Map;
use syscall::data::Stat as redox_stat;
use syscall::data::StatVfs as redox_statvfs;
use syscall::data::TimeSpec as redox_timespec;
@@ -16,6 +15,7 @@ use header::dirent::dirent;
use header::errno::{EINVAL, EIO, EPERM};
use header::fcntl;
use header::poll::{self, nfds_t, pollfd};
use header::sys_mman::MAP_ANON;
use header::sys_select::fd_set;
use header::sys_stat::stat;
use header::sys_statvfs::statvfs;
@@ -35,16 +35,6 @@ mod pte;
mod signal;
mod socket;
const MAP_ANON: c_int = 1;
static ANONYMOUS_MAPS: Once<Mutex<BTreeMap<usize, usize>>> = Once::new();
fn anonymous_maps() -> MutexGuard<'static, BTreeMap<usize, usize>> {
ANONYMOUS_MAPS
.call_once(|| Mutex::new(BTreeMap::new()))
.lock()
}
fn e(sys: Result<usize>) -> usize {
match sys {
Ok(ok) => ok,
@@ -625,27 +615,30 @@ impl Pal for Sys {
unsafe fn mmap(
_addr: *mut c_void,
len: usize,
_prot: c_int,
prot: c_int,
flags: c_int,
fildes: c_int,
off: off_t,
) -> *mut c_void {
let map = Map {
offset: off as usize,
size: len,
flags: ((prot as usize) << 16) | ((flags as usize) & 0xFFFF)
};
if flags & MAP_ANON == MAP_ANON {
let fd = e(syscall::open("memory:", syscall::O_STAT | syscall::O_CLOEXEC)); // flags don't matter currently
if fd == !0 {
return !0 as *mut c_void;
}
let addr = e(syscall::fmap(fd, off as usize, len as usize));
if addr == !0 {
let _ = syscall::close(fd);
return !0 as *mut c_void;
}
let addr = e(syscall::fmap(fd, &map)) as *mut c_void;
anonymous_maps().insert(addr as usize, fd);
addr as *mut c_void
let _ = syscall::close(fd);
addr
} else {
e(syscall::fmap(fildes as usize, off as usize, len as usize)) as *mut c_void
e(syscall::fmap(fildes as usize, &map)) as *mut c_void
}
}
@@ -653,9 +646,6 @@ impl Pal for Sys {
if e(syscall::funmap(addr as usize)) == !0 {
return !0;
}
if let Some(fd) = anonymous_maps().remove(&(addr as usize)) {
let _ = syscall::close(fd);
}
0
}