From 78e5c711035e14a4292c9ce9da6cd438a1fee237 Mon Sep 17 00:00:00 2001 From: jD91mZM2 <me@krake.one> Date: Fri, 14 Aug 2020 15:18:47 +0200 Subject: [PATCH] Deprecate the original fmap/funmap The cool thing here is that we're temporarily binary compatible with the old stuff, so if anyone would use an old version of redox_syscall we can easily find them with these prints. --- src/scheme/memory.rs | 8 ++++---- src/scheme/user.rs | 26 +++++++++++++------------- src/syscall/debug.rs | 26 +++++++++++++------------- src/syscall/fs.rs | 8 ++++---- src/syscall/mod.rs | 23 +++++++++++++++++++++-- syscall | 2 +- 6 files changed, 56 insertions(+), 37 deletions(-) diff --git a/src/scheme/memory.rs b/src/scheme/memory.rs index 75686e2..4e82a1e 100644 --- a/src/scheme/memory.rs +++ b/src/scheme/memory.rs @@ -2,7 +2,7 @@ use crate::context; use crate::context::memory::{entry_flags, Grant}; use crate::memory::{free_frames, used_frames, PAGE_SIZE}; use crate::paging::{ActivePageTable, VirtualAddress}; -use crate::syscall::data::{Map, Map2, StatVfs}; +use crate::syscall::data::{Map, OldMap, StatVfs}; use crate::syscall::error::*; use crate::syscall::flag::MapFlags; use crate::syscall::scheme::Scheme; @@ -31,7 +31,7 @@ impl Scheme for MemoryScheme { Ok(0) } - fn fmap2(&self, _id: usize, map: &Map2) -> Result<usize> { + fn fmap(&self, _id: usize, map: &Map) -> Result<usize> { //TODO: Abstract with other grant creation if map.size == 0 { Ok(0) @@ -63,12 +63,12 @@ impl Scheme for MemoryScheme { Ok(region.start_address().get()) } } - fn fmap(&self, id: usize, map: &Map) -> Result<usize> { + fn fmap_old(&self, id: usize, map: &OldMap) -> Result<usize> { if map.flags.contains(MapFlags::MAP_FIXED) { // not supported for fmap, which lacks the address argument. return Err(Error::new(EINVAL)); } - self.fmap2(id, &Map2 { + self.fmap(id, &Map { offset: map.offset, size: map.size, flags: map.flags, diff --git a/src/scheme/user.rs b/src/scheme/user.rs index df6c436..576d2a3 100644 --- a/src/scheme/user.rs +++ b/src/scheme/user.rs @@ -14,7 +14,7 @@ use crate::paging::{PAGE_SIZE, InactivePageTable, Page, VirtualAddress}; use crate::paging::temporary_page::TemporaryPage; use crate::scheme::{AtomicSchemeId, SchemeId}; use crate::sync::{WaitQueue, WaitMap}; -use crate::syscall::data::{Map, Map2, Packet, Stat, StatVfs, TimeSpec}; +use crate::syscall::data::{Map, OldMap, Packet, Stat, StatVfs, TimeSpec}; use crate::syscall::error::*; use crate::syscall::flag::{EventFlags, EVENT_READ, O_NONBLOCK, MapFlags, PROT_READ, PROT_WRITE}; use crate::syscall::number::*; @@ -29,7 +29,7 @@ pub struct UserInner { next_id: AtomicU64, context: Weak<RwLock<Context>>, todo: WaitQueue<Packet>, - fmap: Mutex<BTreeMap<u64, (Weak<RwLock<Context>>, FileDescriptor, Map2)>>, + fmap: Mutex<BTreeMap<u64, (Weak<RwLock<Context>>, FileDescriptor, Map)>>, funmap: Mutex<BTreeMap<Region, VirtualAddress>>, done: WaitMap<u64, usize>, unmounting: AtomicBool, @@ -339,7 +339,7 @@ impl Scheme for UserScheme { inner.call(SYS_FEVENT, file, flags.bits(), 0).map(EventFlags::from_bits_truncate) } - fn fmap(&self, file: usize, map: &Map) -> Result<usize> { + fn fmap_old(&self, file: usize, map: &OldMap) -> Result<usize> { let inner = self.inner.upgrade().ok_or(Error::new(ENODEV))?; let (pid, uid, gid, context_lock, desc) = { @@ -369,7 +369,7 @@ impl Scheme for UserScheme { let id = inner.next_id.fetch_add(1, Ordering::SeqCst); - inner.fmap.lock().insert(id, (context_lock, desc, Map2 { + inner.fmap.lock().insert(id, (context_lock, desc, Map { offset: map.offset, size: map.size, flags: map.flags, @@ -381,10 +381,10 @@ impl Scheme for UserScheme { pid: pid.into(), uid, gid, - a: SYS_FMAP, + a: SYS_FMAP_OLD, b: file, c: address, - d: mem::size_of::<Map>() + d: mem::size_of::<OldMap>() }); let _ = inner.release(address); @@ -392,7 +392,7 @@ impl Scheme for UserScheme { result } - fn fmap2(&self, file: usize, map: &Map2) -> Result<usize> { + fn fmap(&self, file: usize, map: &Map) -> Result<usize> { let inner = self.inner.upgrade().ok_or(Error::new(ENODEV))?; let (pid, uid, gid, context_lock, desc) = { @@ -429,10 +429,10 @@ impl Scheme for UserScheme { pid: pid.into(), uid, gid, - a: SYS_FMAP2, + a: SYS_FMAP, b: file, c: address, - d: mem::size_of::<Map2>() + d: mem::size_of::<Map>() }); let _ = inner.release(address); @@ -440,7 +440,7 @@ impl Scheme for UserScheme { result } - fn funmap(&self, grant_address: usize) -> Result<usize> { + fn funmap_old(&self, grant_address: usize) -> Result<usize> { let inner = self.inner.upgrade().ok_or(Error::new(ENODEV))?; let address_opt = { let mut funmap = inner.funmap.lock(); @@ -460,13 +460,13 @@ impl Scheme for UserScheme { } }; if let Some(user_address) = address_opt { - inner.call(SYS_FUNMAP, user_address, 0, 0) + inner.call(SYS_FUNMAP_OLD, user_address, 0, 0) } else { Err(Error::new(EINVAL)) } } - fn funmap2(&self, grant_address: usize, size: usize) -> Result<usize> { + fn funmap(&self, grant_address: usize, size: usize) -> Result<usize> { let inner = self.inner.upgrade().ok_or(Error::new(ENODEV))?; let address_opt = { let mut funmap = inner.funmap.lock(); @@ -499,7 +499,7 @@ impl Scheme for UserScheme { }; if let Some(user_address) = address_opt { - inner.call(SYS_FUNMAP2, user_address, size, 0) + inner.call(SYS_FUNMAP, user_address, size, 0) } else { Err(Error::new(EINVAL)) } diff --git a/src/syscall/debug.rs b/src/syscall/debug.rs index e18181e..ee7653b 100644 --- a/src/syscall/debug.rs +++ b/src/syscall/debug.rs @@ -2,7 +2,7 @@ use core::{ascii, mem}; use alloc::string::String; use alloc::vec::Vec; -use super::data::{Map, Map2, Stat, TimeSpec}; +use super::data::{OldMap, Map, Stat, TimeSpec}; use super::flag::*; use super::number::*; use super::validate::*; @@ -106,28 +106,28 @@ pub fn format_call(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize) - c, d ), - SYS_FMAP => format!( - "fmap({}, {:?})", + SYS_FMAP_OLD => format!( + "fmap_old({}, {:?})", b, validate_slice( - c as *const Map, - d/mem::size_of::<Map>() + c as *const OldMap, + d/mem::size_of::<OldMap>() ), ), - SYS_FMAP2 => format!( - "fmap2({}, {:?})", + SYS_FMAP => format!( + "fmap({}, {:?})", b, validate_slice( - c as *const Map2, - d/mem::size_of::<Map2>() + c as *const Map, + d/mem::size_of::<Map>() ), ), - SYS_FUNMAP => format!( - "funmap({:#X})", + SYS_FUNMAP_OLD => format!( + "funmap_old({:#X})", b ), - SYS_FUNMAP2 => format!( - "funmap2({:#X}, {:#X})", + SYS_FUNMAP => format!( + "funmap({:#X}, {:#X})", b, c, ), diff --git a/src/syscall/fs.rs b/src/syscall/fs.rs index 3ae8e06..2376669 100644 --- a/src/syscall/fs.rs +++ b/src/syscall/fs.rs @@ -444,7 +444,7 @@ pub fn frename(fd: FileHandle, path: &[u8]) -> Result<usize> { } } -pub fn funmap(virtual_address: usize) -> Result<usize> { +pub fn funmap_old(virtual_address: usize) -> Result<usize> { if virtual_address == 0 { Ok(0) } else { @@ -475,7 +475,7 @@ pub fn funmap(virtual_address: usize) -> Result<usize> { let scheme = schemes.get(scheme_id).ok_or(Error::new(EBADF))?; scheme.clone() }; - let res = scheme.funmap(virtual_address); + let res = scheme.funmap_old(virtual_address); let _ = desc.close(); @@ -486,7 +486,7 @@ pub fn funmap(virtual_address: usize) -> Result<usize> { } } -pub fn funmap2(virtual_address: usize, length: usize) -> Result<usize> { +pub fn funmap(virtual_address: usize, length: usize) -> Result<usize> { if virtual_address == 0 || length == 0 { return Ok(0); } else if virtual_address % PAGE_SIZE != 0 { @@ -541,7 +541,7 @@ pub fn funmap2(virtual_address: usize, length: usize) -> Result<usize> { let scheme = schemes.get(scheme_id).ok_or(Error::new(EBADF))?; scheme.clone() }; - let res = scheme.funmap2(intersection.start_address().get(), intersection.size()); + let res = scheme.funmap(intersection.start_address().get(), intersection.size()); let _ = desc.close(); diff --git a/src/syscall/mod.rs b/src/syscall/mod.rs index a441567..a6c75b9 100644 --- a/src/syscall/mod.rs +++ b/src/syscall/mod.rs @@ -66,8 +66,27 @@ pub fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize, bp: u SYS_FCNTL => fcntl(fd, c, d), SYS_FEXEC => fexec(fd, validate_slice(c as *const [usize; 2], d)?, validate_slice(e as *const [usize; 2], f)?), SYS_FRENAME => frename(fd, validate_slice(c as *const u8, d)?), - SYS_FUNMAP => funmap(b), - SYS_FUNMAP2 => funmap2(b, c), + SYS_FUNMAP => funmap(b, c), + SYS_FMAP_OLD => { + { + let contexts = crate::context::contexts(); + let current = contexts.current().unwrap(); + let current = current.read(); + let name = current.name.lock(); + println!("{:?} using deprecated fmap(...) call", name); + } + file_op(a, fd, c, d) + }, + SYS_FUNMAP_OLD => { + { + let contexts = crate::context::contexts(); + let current = contexts.current().unwrap(); + let current = current.read(); + let name = current.name.lock(); + println!("{:?} using deprecated funmap(...) call", name); + } + funmap_old(b) + }, _ => file_op(a, fd, c, d) } } diff --git a/syscall b/syscall index a7d066a..2bc9acc 160000 --- a/syscall +++ b/syscall @@ -1 +1 @@ -Subproject commit a7d066a3a2afec2e8e6b3e681ad2938eecc9d1d0 +Subproject commit 2bc9acc5c2e8c24dd150c2247a40922e6f3ba6c2 -- GitLab