diff --git a/src/runtime/src/comms.rs b/src/runtime/src/comms.rs index f90b6de..00a2b6f 100644 --- a/src/runtime/src/comms.rs +++ b/src/runtime/src/comms.rs @@ -224,13 +224,14 @@ async fn handle_run_kernel(stream: Option<&TcpStream>, control: &Rc { + kernel::Message::KernelFinished { async_errors } => { if let Some(stream) = stream { write_header(stream, Reply::KernelFinished).await?; + write_i8(stream, async_errors as i8).await?; } break; }, - kernel::Message::KernelException(exception, backtrace) => { + kernel::Message::KernelException(exception, backtrace, async_errors) => { match stream { Some(stream) => { // only send the exception data to host if there is host, @@ -249,6 +250,7 @@ async fn handle_run_kernel(stream: Option<&TcpStream>, control: &Rc { error!("Uncaught kernel exception: {:?}", exception); diff --git a/src/runtime/src/kernel/core1.rs b/src/runtime/src/kernel/core1.rs index 91a8dd9..ab6a428 100644 --- a/src/runtime/src/kernel/core1.rs +++ b/src/runtime/src/kernel/core1.rs @@ -14,7 +14,7 @@ use libcortex_a9::{ use libboard_zynq::{mpcore, gic}; use libsupport_zynq::ram; use dyld::{self, Library}; -use crate::{eh_artiq, rtio}; +use crate::{eh_artiq, get_async_errors, rtio}; use super::{ api::resolve, rpc::rpc_send_async, @@ -192,7 +192,8 @@ pub extern "C" fn main_core1() { } } info!("kernel finished"); - core1_tx.send(Message::KernelFinished); + let async_errors = unsafe { get_async_errors() }; + core1_tx.send(Message::KernelFinished { async_errors }); } _ => error!("Core1 received unexpected message: {:?}", message), } @@ -216,7 +217,8 @@ pub fn terminate(exception: &'static eh_artiq::Exception<'static>, backtrace: &' { let core1_tx = unsafe { KERNEL_CHANNEL_1TO0.as_mut().unwrap() }; - core1_tx.send(Message::KernelException(exception, &backtrace[..cursor])); + let errors = unsafe { get_async_errors() }; + core1_tx.send(Message::KernelException(exception, &backtrace[..cursor], errors)); } loop {} } diff --git a/src/runtime/src/kernel/mod.rs b/src/runtime/src/kernel/mod.rs index c3bb1fb..3ca8bf6 100644 --- a/src/runtime/src/kernel/mod.rs +++ b/src/runtime/src/kernel/mod.rs @@ -30,8 +30,10 @@ pub enum Message { LoadCompleted, LoadFailed, StartRequest, - KernelFinished, - KernelException(&'static eh_artiq::Exception<'static>, &'static [usize]), + KernelFinished { + async_errors: u8 + }, + KernelException(&'static eh_artiq::Exception<'static>, &'static [usize], u8), RpcSend { is_async: bool, data: Vec }, RpcRecvRequest(*mut ()), RpcRecvReply(Result),