From 30fef020f241d43fdbab8aec95532b8ff058a02e Mon Sep 17 00:00:00 2001 From: Sean Cross Date: Sun, 9 Aug 2020 19:27:43 +0800 Subject: [PATCH] baremetal: just one more build error for this phase Signed-off-by: Sean Cross --- kernel/src/arch/riscv/process.rs | 29 ++++++- kernel/src/services.rs | 126 +++++++++++++++++-------------- 2 files changed, 96 insertions(+), 59 deletions(-) diff --git a/kernel/src/arch/riscv/process.rs b/kernel/src/arch/riscv/process.rs index 201949b59..d88f45b54 100644 --- a/kernel/src/arch/riscv/process.rs +++ b/kernel/src/arch/riscv/process.rs @@ -1,5 +1,5 @@ -use core::mem; use core::cell::RefCell; +use core::mem; static mut PROCESS: *mut ProcessImpl = 0xff80_1000 as *mut ProcessImpl; pub const MAX_THREAD: TID = 31; pub const INITIAL_TID: TID = 1; @@ -93,7 +93,9 @@ pub struct Thread { impl Process { pub fn current() -> Process { - Process { pid: unsafe { PROCESS_TABLE.borrow().current } } + Process { + pid: unsafe { PROCESS_TABLE.borrow().current }, + } } /// Mark this process as running on the current core @@ -171,7 +173,7 @@ impl Process { &mut process.threads[thread - 1] } - pub fn find_free_thread_nr(&self) -> Option { + pub fn find_free_thread(&self) -> Option { let mut process = unsafe { &mut *PROCESS }; for (index, thread) in process.threads.iter().enumerate() { if index != 0 && thread.sepc == 0 { @@ -224,6 +226,27 @@ impl Process { process.inner = Default::default(); } + + pub fn setup_thread(&mut self, thread: TID, _setup: ThreadInit) -> Result<(), xous::Error> { + todo!(); + } + + pub fn create(pid: PID, init_data: ProcessInit) -> PID { + todo!(); + } + + pub fn destroy(pid: PID) -> Result<(), xous::Error> { + todo!(); + // let mut process_table = unsafe { &mut *PROCESS }; + // let pid_idx = pid.get() as usize - 1; + // if pid_idx >= process_table.table.len() { + // panic!("attempted to destroy PID that exceeds table index: {}", pid); + // } + // let process = process_table.table[pid_idx].as_mut().unwrap(); + // process_table.table[pid_idx] = None; + // process_table.total -= 1; + // Ok(()) + } } impl Thread { diff --git a/kernel/src/services.rs b/kernel/src/services.rs index 59bcbb3c1..2cc33f9ed 100644 --- a/kernel/src/services.rs +++ b/kernel/src/services.rs @@ -3,6 +3,7 @@ use crate::arch::mem::MemoryMapping; pub use crate::arch::process::Process as ArchProcess; pub use crate::arch::process::Thread; use xous::MemoryRange; +use crate::mem::MemoryManager; use core::cell::RefCell; @@ -287,7 +288,12 @@ impl SystemServices { init_count += 1; } } - unsafe { core::slice::from_raw_parts(base as *const crate::arch::process::InitialProcess, init_count) } + unsafe { + core::slice::from_raw_parts( + base as *const crate::arch::process::InitialProcess, + init_count, + ) + } }; // Copy over the initial process list. The pid is encoded in the SATP @@ -312,7 +318,11 @@ impl SystemServices { if pid == 1 { process.state = ProcessState::Running(0); } else { - process.state = ProcessState::Setup(init.entrypoint, init.sp, crate::arch::process::DEFAULT_STACK_SIZE); + process.state = ProcessState::Setup( + init.entrypoint, + init.sp, + crate::arch::process::DEFAULT_STACK_SIZE, + ); } } @@ -987,7 +997,6 @@ impl SystemServices { let src_mapping = self.get_process(current_pid)?.mapping; let dest_mapping = self.get_process(dest_pid)?.mapping; crate::mem::MemoryManager::with_mut(|mm| { - // Locate an address to fit the new memory. dest_mapping.activate()?; let dest_virt = mm @@ -1003,8 +1012,8 @@ impl SystemServices { let mut error = None; // Lend each subsequent page. - for offset in - (0..(len / core::mem::size_of::())).step_by(crate::mem::PAGE_SIZE / core::mem::size_of::()) + for offset in (0..(len / core::mem::size_of::())) + .step_by(crate::mem::PAGE_SIZE / core::mem::size_of::()) { mm.move_page( &src_mapping, @@ -1080,38 +1089,39 @@ impl SystemServices { let current_pid = self.current_pid(); let src_mapping = self.get_process(current_pid)?.mapping; let dest_mapping = self.get_process(dest_pid)?.mapping; - let mut mm = MemoryManagerHandle::get(); + MemoryManager::with_mut(|mm| { - // Locate an address to fit the new memory. - dest_mapping.activate(); - let dest_virt = mm - .find_virtual_address(dest_virt, len, xous::MemoryType::Messages) - .or_else(|e| { - src_mapping.activate(); - Err(e) - })?; - src_mapping.activate(); + // Locate an address to fit the new memory. + dest_mapping.activate(); + let dest_virt = mm + .find_virtual_address(dest_virt, len, xous::MemoryType::Messages) + .or_else(|e| { + src_mapping.activate(); + Err(e) + })?; + src_mapping.activate(); - let mut error = None; + let mut error = None; - // Lend each subsequent page. - for offset in - (0..(len / core::mem::size_of::())).step_by(crate::mem::PAGE_SIZE / core::mem::size_of::()) - { - mm.lend_page( - &src_mapping, - src_virt.wrapping_add(offset), - dest_pid, - &dest_mapping, - dest_virt.wrapping_add(offset), - mutable, - ) - .unwrap_or_else(|e| { - error = Some(e); - 0 - }); - } - error.map_or_else(|| Ok(dest_virt), |e| panic!("unable to lend: {:?}", e)) + // Lend each subsequent page. + for offset in (0..(len / core::mem::size_of::())) + .step_by(crate::mem::PAGE_SIZE / core::mem::size_of::()) + { + mm.lend_page( + &src_mapping, + src_virt.wrapping_add(offset), + dest_pid, + &dest_mapping, + dest_virt.wrapping_add(offset), + mutable, + ) + .unwrap_or_else(|e| { + error = Some(e); + 0 + }); + } + error.map_or_else(|| Ok(dest_virt), |e| panic!("unable to lend: {:?}", e)) + }) } #[cfg(not(baremetal))] @@ -1161,26 +1171,27 @@ impl SystemServices { let current_pid = self.current_pid(); let src_mapping = self.get_process(current_pid)?.mapping; let dest_mapping = self.get_process(dest_pid)?.mapping; - let mut mm = MemoryManagerHandle::get(); - let mut error = None; + MemoryManager::with_mut(|mm| { + let mut error = None; - // Lend each subsequent page. - for offset in - (0..(len / core::mem::size_of::())).step_by(crate::mem::PAGE_SIZE / core::mem::size_of::()) - { - mm.unlend_page( - &src_mapping, - src_virt.wrapping_add(offset), - dest_pid, - &dest_mapping, - dest_virt.wrapping_add(offset), - ) - .unwrap_or_else(|e| { - error = Some(e); - 0 - }); - } - error.map_or_else(|| Ok(dest_virt), |e| Err(e)) + // Lend each subsequent page. + for offset in (0..(len / core::mem::size_of::())) + .step_by(crate::mem::PAGE_SIZE / core::mem::size_of::()) + { + mm.unlend_page( + &src_mapping, + src_virt.wrapping_add(offset), + dest_pid, + &dest_mapping, + dest_virt.wrapping_add(offset), + ) + .unwrap_or_else(|e| { + error = Some(e); + 0 + }); + } + error.map_or_else(|| Ok(dest_virt), |e| Err(e)) + }) } #[cfg(not(baremetal))] @@ -1281,8 +1292,12 @@ impl SystemServices { if entry == &None { #[cfg(baremetal)] // Allocate a single page for the server queue - let backing = crate::mem::MemoryManager::with_mut(|mm| - MemoryRange::new(mm.map_zeroed_page(pid, false)? as _, crate::arch::mem::PAGE_SIZE))?; + let backing = crate::mem::MemoryManager::with_mut(|mm| { + MemoryRange::new( + mm.map_zeroed_page(pid, false)? as _, + crate::arch::mem::PAGE_SIZE, + ) + })?; #[cfg(not(baremetal))] let backing = MemoryRange::new(4096, 4096).unwrap(); @@ -1291,7 +1306,6 @@ impl SystemServices { // self.pid.get() // ); - // Initialize the server with the given memory page. Server::init(entry, pid, sid, backing).map_err(|x| x)?; return Ok(sid);