diff --git a/scheme/debug.rs b/scheme/debug.rs index 52b88e52c886f91e740f5ac70efd5c1944d6c187..eed44ede96005fca72466ea1fbb882c9f9360105 100644 --- a/scheme/debug.rs +++ b/scheme/debug.rs @@ -72,7 +72,7 @@ impl Scheme for DebugScheme { Ok(buffer.len()) } - fn fevent(&self, _file: usize, flags: usize) -> Result<usize> { + fn fevent(&self, _file: usize, _flags: usize) -> Result<usize> { Ok(0) } diff --git a/syscall/mod.rs b/syscall/mod.rs index 1bb5a56e7ab755ef344488bb5ad23946de813bfc..2815091d57268da90301ecc20dab4caa8da9d36e 100644 --- a/syscall/mod.rs +++ b/syscall/mod.rs @@ -47,8 +47,11 @@ pub extern fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize SYS_GETCWD => getcwd(validate_slice_mut(b as *mut u8, c)?), SYS_FEVENT => fevent(b, c), SYS_FPATH => fpath(b, validate_slice_mut(c as *mut u8, d)?), + SYS_PHYSALLOC => physalloc(b), + SYS_PHYSFREE => physfree(b, c), SYS_PHYSMAP => physmap(b, c, d), SYS_PHYSUNMAP => physunmap(b), + SYS_VIRTTOPHYS => virttophys(b), _ => { println!("Unknown syscall {}", a); Err(Error::new(ENOSYS)) diff --git a/syscall/process.rs b/syscall/process.rs index 5150b95d88f911e8c431d1caedeaf8a784979466..d953e42bd688ce3e5d05b33d45be3648ba6babaf 100644 --- a/syscall/process.rs +++ b/syscall/process.rs @@ -8,7 +8,7 @@ use spin::Mutex; use arch; use arch::externs::memcpy; -use arch::memory::allocate_frame; +use arch::memory::{allocate_frame, allocate_frames, deallocate_frames, Frame}; use arch::paging::{ActivePageTable, InactivePageTable, Page, PhysicalAddress, VirtualAddress, entry}; use arch::paging::temporary_page::TemporaryPage; use arch::start::usermode; @@ -535,6 +535,16 @@ pub fn iopl(_level: usize) -> Result<usize> { Ok(0) } +pub fn physalloc(size: usize) -> Result<usize> { + allocate_frames((size + 4095)/4096).ok_or(Error::new(ENOMEM)).map(|frame| frame.start_address().get()) +} + +pub fn physfree(physical_address: usize, size: usize) -> Result<usize> { + deallocate_frames(Frame::containing_address(PhysicalAddress::new(physical_address)), (size + 4095)/4096); + //TODO: Check that no double free occured + Ok(0) +} + //TODO: verify exlusive access to physical memory pub fn physmap(physical_address: usize, size: usize, flags: usize) -> Result<usize> { if size == 0 { @@ -617,6 +627,14 @@ pub fn sched_yield() -> Result<usize> { Ok(0) } +pub fn virttophys(virtual_address: usize) -> Result<usize> { + let active_table = unsafe { ActivePageTable::new() }; + match active_table.translate(VirtualAddress::new(virtual_address)) { + Some(physical_address) => Ok(physical_address.get()), + None => Err(Error::new(EFAULT)) + } +} + pub fn waitpid(pid: usize, status_ptr: usize, flags: usize) -> Result<usize> { loop { {