From 84becfe2c00451d114f84370f7b6b12c6594041e Mon Sep 17 00:00:00 2001 From: stevefan1999 Date: Mon, 6 Dec 2021 17:38:55 +0800 Subject: [PATCH] report async errors upon kernel termination Port of https://github.com/m-labs/artiq/commit/4a6bea479af03bca5a3583977bbdebf4c7f6b14e Co-authored-by: Steve Fan Reviewed-on: https://git.m-labs.hk/M-Labs/artiq-zynq/pulls/156 Co-authored-by: stevefan1999 Co-committed-by: stevefan1999 --- src/runtime/src/comms.rs | 6 ++++-- src/runtime/src/kernel/core1.rs | 8 +++++--- src/runtime/src/kernel/mod.rs | 4 ++-- src/runtime/src/main.rs | 8 ++++++++ 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/runtime/src/comms.rs b/src/runtime/src/comms.rs index f90b6de..55cfc18 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..9084260 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..58bebf2 100644 --- a/src/runtime/src/kernel/mod.rs +++ b/src/runtime/src/kernel/mod.rs @@ -30,8 +30,8 @@ pub enum Message { LoadCompleted, LoadFailed, StartRequest, - KernelFinished, - KernelException(&'static eh_artiq::Exception<'static>, &'static [usize]), + KernelFinished(u8), + KernelException(&'static eh_artiq::Exception<'static>, &'static [usize], u8), RpcSend { is_async: bool, data: Vec }, RpcRecvRequest(*mut ()), RpcRecvReply(Result), diff --git a/src/runtime/src/main.rs b/src/runtime/src/main.rs index da93f3f..1a30357 100644 --- a/src/runtime/src/main.rs +++ b/src/runtime/src/main.rs @@ -42,6 +42,13 @@ mod analyzer; mod irq; mod i2c; +static mut SEEN_ASYNC_ERRORS: u8 = 0; + +pub unsafe fn get_async_errors() -> u8 { + let errors = SEEN_ASYNC_ERRORS; + SEEN_ASYNC_ERRORS = 0; + errors +} fn wait_for_async_rtio_error() -> nb::Result<(), Void> { unsafe { @@ -70,6 +77,7 @@ async fn report_async_rtio_errors() { error!("RTIO sequence error involving channel {}", pl::csr::rtio_core::sequence_error_channel_read()); } + SEEN_ASYNC_ERRORS = errors; pl::csr::rtio_core::async_error_write(errors); } }