report async errors upon kernel termination

Port of 4a6bea479a

Co-authored-by: Steve Fan <sf@m-labs.hk>
Reviewed-on: M-Labs/artiq-zynq#156
Co-authored-by: stevefan1999 <sf@m-labs.hk>
Co-committed-by: stevefan1999 <sf@m-labs.hk>
This commit is contained in:
stevefan1999 2021-12-06 17:38:55 +08:00 committed by sb10q
parent a4fbb96296
commit 84becfe2c0
4 changed files with 19 additions and 7 deletions

View File

@ -224,13 +224,14 @@ async fn handle_run_kernel(stream: Option<&TcpStream>, control: &Rc<RefCell<kern
} }
} }
}, },
kernel::Message::KernelFinished => { kernel::Message::KernelFinished(async_errors) => {
if let Some(stream) = stream { if let Some(stream) = stream {
write_header(stream, Reply::KernelFinished).await?; write_header(stream, Reply::KernelFinished).await?;
write_i8(stream, async_errors as i8).await?;
} }
break; break;
}, },
kernel::Message::KernelException(exception, backtrace) => { kernel::Message::KernelException(exception, backtrace, async_errors) => {
match stream { match stream {
Some(stream) => { Some(stream) => {
// only send the exception data to host if there is host, // 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<RefCell<kern
for &addr in backtrace { for &addr in backtrace {
write_i32(stream, addr as i32).await?; write_i32(stream, addr as i32).await?;
} }
write_i8(stream, async_errors as i8).await?;
}, },
None => { None => {
error!("Uncaught kernel exception: {:?}", exception); error!("Uncaught kernel exception: {:?}", exception);

View File

@ -14,7 +14,7 @@ use libcortex_a9::{
use libboard_zynq::{mpcore, gic}; use libboard_zynq::{mpcore, gic};
use libsupport_zynq::ram; use libsupport_zynq::ram;
use dyld::{self, Library}; use dyld::{self, Library};
use crate::{eh_artiq, rtio}; use crate::{eh_artiq, get_async_errors, rtio};
use super::{ use super::{
api::resolve, api::resolve,
rpc::rpc_send_async, rpc::rpc_send_async,
@ -192,7 +192,8 @@ pub extern "C" fn main_core1() {
} }
} }
info!("kernel finished"); 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), _ => 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() }; 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 {} loop {}
} }

View File

@ -30,8 +30,8 @@ pub enum Message {
LoadCompleted, LoadCompleted,
LoadFailed, LoadFailed,
StartRequest, StartRequest,
KernelFinished, KernelFinished(u8),
KernelException(&'static eh_artiq::Exception<'static>, &'static [usize]), KernelException(&'static eh_artiq::Exception<'static>, &'static [usize], u8),
RpcSend { is_async: bool, data: Vec<u8> }, RpcSend { is_async: bool, data: Vec<u8> },
RpcRecvRequest(*mut ()), RpcRecvRequest(*mut ()),
RpcRecvReply(Result<usize, RPCException>), RpcRecvReply(Result<usize, RPCException>),

View File

@ -42,6 +42,13 @@ mod analyzer;
mod irq; mod irq;
mod i2c; 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> { fn wait_for_async_rtio_error() -> nb::Result<(), Void> {
unsafe { unsafe {
@ -70,6 +77,7 @@ async fn report_async_rtio_errors() {
error!("RTIO sequence error involving channel {}", error!("RTIO sequence error involving channel {}",
pl::csr::rtio_core::sequence_error_channel_read()); pl::csr::rtio_core::sequence_error_channel_read());
} }
SEEN_ASYNC_ERRORS = errors;
pl::csr::rtio_core::async_error_write(errors); pl::csr::rtio_core::async_error_write(errors);
} }
} }