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 <sean@xobs.io>
This commit is contained in:
Sean Cross 2020-10-14 10:54:23 +08:00
parent 61fdd5be15
commit ecd2d00f47

View file

@ -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),
}
}