forked from M-Labs/artiq
runtime: add an option to reboot after a panic.
This commit is contained in:
parent
80c75ed505
commit
c586035caa
|
@ -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#"
|
|
@ -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;
|
||||
|
|
|
@ -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 {}
|
||||
}
|
||||
|
|
|
@ -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)]
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue