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