diff --git a/src/call.rs b/src/call.rs index ae6a184..399537d 100644 --- a/src/call.rs +++ b/src/call.rs @@ -129,6 +129,11 @@ pub unsafe fn funmap(addr: usize) -> Result { syscall1(SYS_FUNMAP, addr) } +/// Unmap whole (or partial) continous memory-mapped files +pub unsafe fn funmap2(addr: usize, len: usize) -> Result { + syscall2(SYS_FUNMAP2, addr, len) +} + /// Retrieve the canonical path of a file pub fn fpath(fd: usize, buf: &mut [u8]) -> Result { unsafe { syscall3(SYS_FPATH, fd, buf.as_mut_ptr() as usize, buf.len()) } diff --git a/src/number.rs b/src/number.rs index 49c19be..2e69098 100644 --- a/src/number.rs +++ b/src/number.rs @@ -30,6 +30,7 @@ pub const SYS_FEXEC: usize = SYS_CLASS_FILE | 11; pub const SYS_FMAP: usize = SYS_CLASS_FILE | SYS_ARG_SLICE | 90; pub const SYS_FMAP2: usize = SYS_CLASS_FILE | SYS_ARG_SLICE | 900; pub const SYS_FUNMAP: usize = SYS_CLASS_FILE | 91; +pub const SYS_FUNMAP2: usize = SYS_CLASS_FILE | 92; pub const SYS_FPATH: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 928; pub const SYS_FRENAME: usize = SYS_CLASS_FILE | SYS_ARG_PATH | 38; pub const SYS_FSTAT: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 28; diff --git a/src/scheme/generate.sh b/src/scheme/generate.sh index 36a651e..a877cda 100755 --- a/src/scheme/generate.sh +++ b/src/scheme/generate.sh @@ -13,6 +13,7 @@ sed 's/trait Scheme/trait SchemeBlock/' scheme.rs \ | sed 's/packet.a = Error::mux(res);/res.transpose().map(Error::mux)/' \ | sed 's/\.map(|f| f\.bits())/\.map(|f| f.map(|f| f.bits()))/' \ | sed 's/\.map(|o| o as usize)/.map(|o| o.map(|o| o as usize))/' \ +| sed 's/Ok(0)/Ok(Some(0))/g' \ | sed 's/Result<\([^>]\+\)>/Result>/g' \ > scheme_block.rs diff --git a/src/scheme/scheme.rs b/src/scheme/scheme.rs index 0af8bb5..bc2476d 100644 --- a/src/scheme/scheme.rs +++ b/src/scheme/scheme.rs @@ -32,6 +32,7 @@ pub trait Scheme { Err(Error::new(EFAULT)) }, SYS_FUNMAP => self.funmap(packet.b), + SYS_FUNMAP2 => self.funmap2(packet.b, packet.c), SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), SYS_FRENAME => self.frename(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }, packet.uid, packet.gid), SYS_FSTAT => if packet.d >= mem::size_of::() { @@ -139,7 +140,12 @@ pub trait Scheme { #[allow(unused_variables)] fn funmap(&self, address: usize) -> Result { - Err(Error::new(EBADF)) + Ok(0) + } + + #[allow(unused_variables)] + fn funmap2(&self, address: usize, length: usize) -> Result { + Ok(0) } #[allow(unused_variables)] diff --git a/src/scheme/scheme_block.rs b/src/scheme/scheme_block.rs index 5b51e22..772a74c 100644 --- a/src/scheme/scheme_block.rs +++ b/src/scheme/scheme_block.rs @@ -32,6 +32,7 @@ pub trait SchemeBlock { Err(Error::new(EFAULT)) }, SYS_FUNMAP => self.funmap(packet.b), + SYS_FUNMAP2 => self.funmap2(packet.b, packet.c), SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), SYS_FRENAME => self.frename(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }, packet.uid, packet.gid), SYS_FSTAT => if packet.d >= mem::size_of::() { @@ -139,7 +140,12 @@ pub trait SchemeBlock { #[allow(unused_variables)] fn funmap(&self, address: usize) -> Result> { - Err(Error::new(EBADF)) + Ok(Some(0)) + } + + #[allow(unused_variables)] + fn funmap2(&self, address: usize, length: usize) -> Result> { + Ok(Some(0)) } #[allow(unused_variables)] diff --git a/src/scheme/scheme_block_mut.rs b/src/scheme/scheme_block_mut.rs index a006318..e2f9040 100644 --- a/src/scheme/scheme_block_mut.rs +++ b/src/scheme/scheme_block_mut.rs @@ -32,6 +32,7 @@ pub trait SchemeBlockMut { Err(Error::new(EFAULT)) }, SYS_FUNMAP => self.funmap(packet.b), + SYS_FUNMAP2 => self.funmap2(packet.b, packet.c), SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), SYS_FRENAME => self.frename(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }, packet.uid, packet.gid), SYS_FSTAT => if packet.d >= mem::size_of::() { @@ -139,7 +140,12 @@ pub trait SchemeBlockMut { #[allow(unused_variables)] fn funmap(&mut self, address: usize) -> Result> { - Err(Error::new(EBADF)) + Ok(Some(0)) + } + + #[allow(unused_variables)] + fn funmap2(&mut self, address: usize, length: usize) -> Result> { + Ok(Some(0)) } #[allow(unused_variables)] diff --git a/src/scheme/scheme_mut.rs b/src/scheme/scheme_mut.rs index 1672067..8cfe110 100644 --- a/src/scheme/scheme_mut.rs +++ b/src/scheme/scheme_mut.rs @@ -32,6 +32,7 @@ pub trait SchemeMut { Err(Error::new(EFAULT)) }, SYS_FUNMAP => self.funmap(packet.b), + SYS_FUNMAP2 => self.funmap2(packet.b, packet.c), SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), SYS_FRENAME => self.frename(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }, packet.uid, packet.gid), SYS_FSTAT => if packet.d >= mem::size_of::() { @@ -139,7 +140,12 @@ pub trait SchemeMut { #[allow(unused_variables)] fn funmap(&mut self, address: usize) -> Result { - Err(Error::new(EBADF)) + Ok(0) + } + + #[allow(unused_variables)] + fn funmap2(&mut self, address: usize, length: usize) -> Result { + Ok(0) } #[allow(unused_variables)]