From ecd2d00f47ce69ff20699e4a4e0677edc75d5ef3 Mon Sep 17 00:00:00 2001 From: Sean Cross Date: Wed, 14 Oct 2020 10:54:23 +0800 Subject: [PATCH] kernel: fix return_scalar2 This call did not work, because it wasn't properly returning control to the parent process. Signed-off-by: Sean Cross --- kernel/src/syscall.rs | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/kernel/src/syscall.rs b/kernel/src/syscall.rs index 7f9a3e9d3..4b506bd29 100644 --- a/kernel/src/syscall.rs +++ b/kernel/src/syscall.rs @@ -345,8 +345,8 @@ fn return_scalar(pid: PID, _tid: TID, sender: MessageSender, arg: usize) -> SysC } fn return_scalar2( - pid: PID, - _tid: TID, + server_pid: PID, + server_tid: TID, sender: MessageSender, arg1: usize, arg2: usize, @@ -360,7 +360,7 @@ fn return_scalar2( let server = ss .server_from_sidx_mut(sidx) .ok_or(xous_kernel::Error::ServerNotFound)?; - if server.pid != pid { + if server.pid != server_pid { return Err(xous_kernel::Error::ServerNotFound); } let result = server.take_waiting_message(sender.idx, None)?; @@ -387,14 +387,23 @@ fn return_scalar2( return Err(xous_kernel::Error::ProcessNotFound); } }; + + // Handle the server's return value + ss.switch_from_thread(server_pid, server_tid)?; + ss.ready_thread(server_pid, server_tid)?; + ss.set_thread_result( + server_pid, + server_tid, + xous_kernel::Result::Ok, + )?; + + // Switch to the client ss.ready_thread(client_pid, client_tid)?; ss.switch_to_thread(client_pid, Some(client_tid))?; - ss.set_thread_result( - client_pid, - client_tid, - xous_kernel::Result::Scalar2(arg1, arg2), - )?; - Ok(xous_kernel::Result::Ok) + #[cfg(not(baremetal))] + ss.set_thread_result(client_pid, client_tid, xous_kernel::Result::Scalar2(arg1, arg2))?; + + Ok(xous_kernel::Result::Scalar2(arg1, arg2)) }) } @@ -457,7 +466,12 @@ pub fn handle(pid: PID, tid: TID, call: SysCall) -> SysCallResult { print!("KERNEL({}:{}): Syscall {:?}", pid, tid, call); let result = handle_inner(pid, tid, call); #[cfg(feature = "debug-print")] - println!(" -> {:?}", result); + println!( + " -> ({}:{}) {:?}", + crate::arch::current_pid(), + crate::arch::process::Process::current().current_tid(), + result + ); result } @@ -680,7 +694,7 @@ pub fn handle_inner(pid: PID, tid: TID, call: SysCall) -> SysCallResult { Err(xous_kernel::Error::ServerQueueFull) => { arch::process::Process::with_current_mut(|p| p.retry_instruction(tid))?; do_yield(pid, tid) - }, + } Err(e) => Err(e), } }