38 lines
989 B
Rust
38 lines
989 B
Rust
use core::fmt::Write;
|
|
|
|
#[unsafe(no_mangle)]
|
|
pub extern "C" fn relibc_panic(pi: &::core::panic::PanicInfo) -> ! {
|
|
use core::fmt::Write;
|
|
|
|
let mut w = PanicWriter::new();
|
|
let _ = w.write_fmt(format_args!("RELIBC PANIC: {}\n", pi));
|
|
|
|
core::intrinsics::abort();
|
|
}
|
|
|
|
struct PanicWriter;
|
|
|
|
impl PanicWriter {
|
|
pub fn new() -> Self {
|
|
Self
|
|
}
|
|
}
|
|
|
|
impl Write for PanicWriter {
|
|
fn write_str(&mut self, s: &str) -> core::fmt::Result {
|
|
// Cannot use Sys::write, Tcb might not be available
|
|
#[cfg(target_os = "redox")]
|
|
{
|
|
// TODO: init stderr ourself if it not ready.
|
|
// Workaround: If stderr is not being prepared,
|
|
// add debugging log at kernel write() syscall
|
|
let _ = syscall::write(2, s.as_bytes());
|
|
return Ok(());
|
|
}
|
|
|
|
// Non-redox platforms can directly write to stderr
|
|
let mut w = crate::platform::FileWriter::new(2);
|
|
w.write_str(s)
|
|
}
|
|
}
|