diff --git a/src/scheme/event.rs b/src/scheme/event.rs index fd9f4e5188..feafa628e9 100644 --- a/src/scheme/event.rs +++ b/src/scheme/event.rs @@ -87,7 +87,7 @@ impl KernelScheme for EventScheme { } fn kfpath(&self, _id: usize, buf: UserSliceWo, _token: &mut CleanLockToken) -> Result { - buf.copy_common_bytes_from_slice(b"event:") + buf.copy_common_bytes_from_slice(b"/scheme/event/") } fn fevent( diff --git a/src/scheme/memory.rs b/src/scheme/memory.rs index edd8f78807..ec00306b8c 100644 --- a/src/scheme/memory.rs +++ b/src/scheme/memory.rs @@ -295,6 +295,10 @@ impl KernelScheme for MemoryScheme { HandleTy::Translation => Err(Error::new(EOPNOTSUPP)), } } + fn kfpath(&self, id: usize, buf: UserSliceWo, token: &mut CleanLockToken) -> Result { + //TODO: construct useful path? + buf.copy_common_bytes_from_slice("/scheme/memory/".as_bytes()) + } fn kfstatvfs(&self, _file: usize, dst: UserSliceWo, _token: &mut CleanLockToken) -> Result<()> { let used = used_frames() as u64; let free = free_frames() as u64; diff --git a/src/scheme/pipe.rs b/src/scheme/pipe.rs index ba1cbab3bd..42feecf2e2 100644 --- a/src/scheme/pipe.rs +++ b/src/scheme/pipe.rs @@ -19,7 +19,7 @@ use super::{CallerCtx, GlobalSchemes, KernelScheme, OpenResult, StrOrBytes}; // TODO: Preallocate a number of scheme IDs, since there can only be *one* root namespace, and // therefore only *one* pipe scheme. -static PIPE_NEXT_ID: AtomicUsize = AtomicUsize::new(1); +static PIPE_NEXT_ID: AtomicUsize = AtomicUsize::new(0); // TODO: SLOB? static PIPES: RwLock>> = @@ -29,14 +29,15 @@ const MAX_QUEUE_SIZE: usize = 65536; // In almost all places where Rust (and LLVM) uses pointers, they are limited to nonnegative isize, // so this is fine. -const WRITE_NOT_READ_BIT: usize = 1 << (usize::BITS - 1); +const WRITE_NOT_READ_BIT: usize = 1; fn from_raw_id(id: usize) -> (bool, usize) { (id & WRITE_NOT_READ_BIT != 0, id & !WRITE_NOT_READ_BIT) } pub fn pipe(token: &mut CleanLockToken) -> Result<(usize, usize)> { - let id = PIPE_NEXT_ID.fetch_add(1, Ordering::Relaxed); + // Bit 0 is used for WRITE_NOT_READ_BIT + let id = PIPE_NEXT_ID.fetch_add(2, Ordering::Relaxed); PIPES.write(token.token()).insert( id, @@ -334,6 +335,10 @@ impl KernelScheme for PipeScheme { } } } + fn kfpath(&self, id: usize, buf: UserSliceWo, token: &mut CleanLockToken) -> Result { + //TODO: construct useful path? + buf.copy_common_bytes_from_slice("/scheme/pipe/".as_bytes()) + } fn kfstat(&self, _id: usize, buf: UserSliceWo, _token: &mut CleanLockToken) -> Result<()> { buf.copy_exactly(&Stat { st_mode: MODE_FIFO | 0o666, diff --git a/src/scheme/proc.rs b/src/scheme/proc.rs index a9076e53a0..ddb7edbd19 100644 --- a/src/scheme/proc.rs +++ b/src/scheme/proc.rs @@ -630,6 +630,12 @@ impl KernelScheme for ProcScheme { let Handle { context, kind } = handle; kind.kwriteoff(id, context, buf, token) } + + fn kfpath(&self, id: usize, buf: UserSliceWo, token: &mut CleanLockToken) -> Result { + //TODO: construct useful path? + buf.copy_common_bytes_from_slice("/scheme/kernel.proc/".as_bytes()) + } + fn kfstat(&self, id: usize, buffer: UserSliceWo, token: &mut CleanLockToken) -> Result<()> { let handles = HANDLES.read(token.token()); let handle = handles.get(&id).ok_or(Error::new(EBADF))?; diff --git a/src/scheme/time.rs b/src/scheme/time.rs index 2ab94d0811..b7b4d0084c 100644 --- a/src/scheme/time.rs +++ b/src/scheme/time.rs @@ -148,7 +148,7 @@ impl KernelScheme for TimeScheme { .get(&id) .ok_or(Error::new(EBADF))?; - let scheme_path = format!("time:{}", clock).into_bytes(); + let scheme_path = format!("/scheme/time/{}", clock).into_bytes(); buf.copy_common_bytes_from_slice(&scheme_path) } }