backporting "Host report for async error upon kernel termination" #156

Merged
sb10q merged 4 commits from stevefan1999/artiq-zynq:master into master 2021-12-06 17:38:55 +08:00
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),
stevefan1999 marked this conversation as resolved Outdated
Outdated
Review

Keep it on one line like the others. It's not special.

Keep it on one line like the others. It's not special.
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);
} }
} }