diff --git a/crates/init/build.sh b/crates/init/build.sh
index 352645fc..2cc5376d 100755
--- a/crates/init/build.sh
+++ b/crates/init/build.sh
@@ -12,6 +12,9 @@ mkdir -p fs
# cp shell.elf fs/
# ./ls.rs
# cp ls.elf fs/
+./sharedMemTest.rs
+cp sharedMemTest.elf fs/
+
cargo run -q -p initfs --bin util \
-- create --compress --out fs.arc --root fs fs --verbose
diff --git a/crates/init/fs/test2.txt b/crates/init/fs/test2.txt
new file mode 100644
index 00000000..b205596a
--- /dev/null
+++ b/crates/init/fs/test2.txt
@@ -0,0 +1 @@
+hello worldaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahello world
\ No newline at end of file
diff --git a/crates/init/sharedMemTest.rs b/crates/init/sharedMemTest.rs
new file mode 100755
index 00000000..62d952a1
--- /dev/null
+++ b/crates/init/sharedMemTest.rs
@@ -0,0 +1,158 @@
+#!/usr/bin/env bash
+#![doc = r##""##]
+#![no_std]
+#![no_main]
+
+#[macro_use]
+extern crate ulib;
+
+use ulib::sys::{openat, close, mmap, munmap, wait, exit, MAP_PRIVATE, MAP_SHARED, MAP_FILE};
+
+#[no_mangle]
+fn main() {
+
+ let root_fd = 3;
+
+ let test_file_path = b"test.txt";
+ let mut test_text_file = openat(root_fd, test_file_path, 0, 0).unwrap();
+
+ static HELLO_CHARS: [u8; 5] = *b"hello";
+ static WORLD_CHARS: [u8; 5] = *b"world";
+
+ let mut mmap_addr: *mut u8 =
+ unsafe { mmap(0, 4096, 0, MAP_PRIVATE | MAP_FILE, test_text_file, 0).unwrap() } as *mut u8;
+ println!("Memory range is mmaped!");
+
+ for i in 0..5 {
+ let curr_char: u8 = unsafe { *(mmap_addr.wrapping_add(i)) };
+ if curr_char != HELLO_CHARS[i] {
+ panic!(
+ "mmap filed file has an error at index {}! Expected {} got {}",
+ i, HELLO_CHARS[i] as char, curr_char as char
+ );
+ }
+ }
+
+ println!("mmap of test file succeeded!");
+ unsafe { munmap(mmap_addr as *mut ()).unwrap() };
+ _ = close(test_text_file);
+
+ println!("starting mmap with offset test 1");
+ let test_file_path2 = b"test2.txt";
+ test_text_file = openat(root_fd, test_file_path2, 0, 0).unwrap();
+ mmap_addr =
+ unsafe { mmap(0, 4096 * 2, 0, MAP_PRIVATE | MAP_FILE, test_text_file, 6).unwrap() } as *mut u8;
+ println!("mmap addr: {:x}", mmap_addr as usize);
+
+ for i in 0..5 {
+ let curr_char: u8 = unsafe { *(mmap_addr.wrapping_add(i)) };
+ if curr_char != WORLD_CHARS[i] {
+ panic!(
+ "mmap filed file has an error at index {}! Expected {} got {}",
+ i, WORLD_CHARS[i] as char, curr_char as char
+ );
+ }
+ }
+
+ println!("done with mmap with offset test 1");
+
+ println!("starting mmap with offset test 2");
+ for i in 0..5 {
+ let curr_char: u8 = unsafe { *(mmap_addr.wrapping_add(i + 4096)) };
+ if curr_char != WORLD_CHARS[i] {
+ panic!(
+ "mmap filed file has an error at index {}! Expected {} got {}",
+ i, WORLD_CHARS[i] as char, curr_char as char
+ );
+ }
+ }
+
+ println!("done with mmap with offset test 2");
+ unsafe { munmap(mmap_addr as *mut ()).unwrap() };
+ _ = close(test_text_file);
+
+ println!("Starting shared memory test");
+
+ let shared_mem_fd = unsafe { ulib::sys::sys_memfd_create() as u32 };
+ let shared_frame =
+ unsafe { ulib::sys::mmap(0, 4096, 0, MAP_SHARED, shared_mem_fd, 0) }.unwrap() as *mut u8;
+ let end_ptr: *mut u8 = shared_frame.wrapping_add(6);
+ unsafe { end_ptr.write_volatile('.' as u8) };
+ assert_eq!(unsafe { end_ptr.read_volatile() }, '.' as u8);
+
+ println!("Calling fork");
+ let wait_fd = unsafe { ulib::sys::sys_fork() } as u32;
+
+ if wait_fd == 0 {
+ for _i in 0..1000000 {
+ if unsafe { end_ptr.read_volatile() } == ('!' as u8) {
+ break;
+ }
+ }
+
+ let end_val: u8 = unsafe { end_ptr.read_volatile() };
+ if end_val != ('!' as u8) {
+ println!(
+ "Error: child expected to see '!' with val {} and instead found {}",
+ ('!' as u8),
+ end_val
+ );
+ ulib::sys::exit(5);
+ }
+
+ for i in 0..5 {
+ let curr_char = unsafe { *shared_frame.wrapping_add(i) } as char;
+ if curr_char != (HELLO_CHARS[i] as char) {
+ println!(
+ "Child found wrong char at index {}. Expected {} found {}",
+ i,
+ (HELLO_CHARS[i] as char),
+ curr_char
+ );
+ ulib::sys::exit(5);
+ }
+ }
+
+ println!("Child is done");
+ ulib::sys::exit(0);
+ } else {
+ unsafe {
+ core::ptr::copy_nonoverlapping(
+ &raw const HELLO_CHARS[0],
+ shared_frame,
+ HELLO_CHARS.len(),
+ );
+ shared_frame.wrapping_add(6).write('!' as u8);
+ }
+
+ let child_exit_val = wait(wait_fd).unwrap();
+ assert_eq!(child_exit_val, 0);
+ println!("done with shared memory test, parent received exit code 0 from child");
+ }
+
+ _ = unsafe { munmap(shared_frame as *mut ()) };
+
+ exit(15);
+}
diff --git a/crates/kernel/src/fs/initfs.rs b/crates/kernel/src/fs/initfs.rs
index c27bbb5d..7441bfbd 100644
--- a/crates/kernel/src/fs/initfs.rs
+++ b/crates/kernel/src/fs/initfs.rs
@@ -3,6 +3,7 @@ use alloc::sync::{Arc, Weak};
use alloc::vec::Vec;
use initfs::{Archive, ArchiveError};
+use crate::arch::memory::palloc::{Size4KiB, PAGE_ALLOCATOR};
use crate::process::fd::{
boxed_future, ArcFd, DirEntry, FileDescResult, FileDescriptor, FileKind, SmallFuture,
};
@@ -252,8 +253,27 @@ impl FileDescriptor for InitFsFile {
boxed_future(async move { Err(()) })
}
}
- fn mmap_page(&self, _offset: u64) -> SmallFuture