forked from M-Labs/artiq
1
0
Fork 0

runtime: add an option to reboot after a panic.

This commit is contained in:
whitequark 2017-03-14 09:02:28 +00:00
parent 80c75ed505
commit c586035caa
5 changed files with 27 additions and 11 deletions

View File

@ -1,6 +1,16 @@
use irq;
pub unsafe fn run(new_code: &[u8]) -> ! {
pub unsafe fn reboot() -> ! {
irq::set_ie(false);
#[cfg(target_arch="or1k")]
asm!(r#"
l.j _ftext
l.nop
"# : : : : "volatile");
loop {}
}
pub unsafe fn hotswap(new_code: &[u8]) -> ! {
irq::set_ie(false);
#[cfg(target_arch="or1k")]
asm!(r#"

View File

@ -35,7 +35,7 @@ mod ad9154_reg;
#[cfg(has_ad9154)]
pub mod ad9154;
pub mod hotswap;
pub mod boot;
#[cfg(feature = "uart_console")]
pub use uart_console::Console;

View File

@ -28,10 +28,3 @@ macro_rules! println {
($fmt:expr) => (print!(concat!($fmt, "\n")));
($fmt:expr, $($arg:tt)*) => (print!(concat!($fmt, "\n"), $($arg)*));
}
#[no_mangle]
#[lang = "panic_fmt"]
pub extern fn panic_fmt(args: fmt::Arguments, file: &'static str, line: u32) -> ! {
println!("panic at {}:{}: {}", file, line, args);
loop {}
}

View File

@ -1,5 +1,5 @@
#![no_std]
#![feature(compiler_builtins_lib, repr_simd, const_fn)]
#![feature(compiler_builtins_lib, repr_simd, lang_items, const_fn)]
extern crate compiler_builtins;
extern crate cslice;
@ -169,6 +169,19 @@ pub extern fn abort() {
panic!("aborted")
}
#[no_mangle]
#[lang = "panic_fmt"]
pub extern fn panic_fmt(args: core::fmt::Arguments, file: &'static str, line: u32) -> ! {
println!("panic at {}:{}: {}", file, line, args);
if config::read_str("panic_reboot", |r| r == Ok("1")) {
println!("rebooting...");
unsafe { board::boot::reboot() }
} else {
loop {}
}
}
// Allow linking with crates that are built as -Cpanic=unwind even if we use -Cpanic=abort.
// This is never called.
#[allow(non_snake_case)]

View File

@ -274,7 +274,7 @@ fn process_host_message(io: &Io,
host_write(stream, host::Reply::HotswapImminent)?;
stream.close()?;
warn!("hotswapping firmware");
unsafe { board::hotswap::run(&binary) }
unsafe { board::boot::hotswap(&binary) }
}
// artiq_run/artiq_master