From bc4f29d3c8760a4fd7ead16c96987aceed959227 Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jackpot51@gmail.com> Date: Mon, 26 Sep 2016 17:00:06 -0600 Subject: [PATCH] WIP: AHCI drivers and more memory syscalls --- scheme/debug.rs | 2 +- syscall/mod.rs | 3 +++ syscall/process.rs | 20 +++++++++++++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/scheme/debug.rs b/scheme/debug.rs index 52b88e52..eed44ede 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 1bb5a56e..2815091d 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 5150b95d..d953e42b 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 { { -- GitLab