mirror of
https://github.com/saymrwulf/xous-core.git
synced 2026-11-04 04:27:34 +00:00
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:
parent
61fdd5be15
commit
ecd2d00f47
1 changed files with 25 additions and 11 deletions
|
|
@ -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),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue