blob: 9b22fb88c998da71a2755c9611867bfd82cfa87e [file]
#![forbid(unsafe_op_in_unsafe_fn)]
pub mod os;
pub mod params;
#[path = "../unsupported/common.rs"]
mod common;
pub use common::*;
#[cfg(not(test))]
#[cfg(feature = "panic-unwind")]
mod eh_unwinding {
pub(crate) struct EhFrameFinder;
pub(crate) static mut EH_FRAME_ADDRESS: usize = 0;
pub(crate) static EH_FRAME_SETTINGS: EhFrameFinder = EhFrameFinder;
unsafe impl unwind::EhFrameFinder for EhFrameFinder {
fn find(&self, _pc: usize) -> Option<unwind::FrameInfo> {
if unsafe { EH_FRAME_ADDRESS == 0 } {
None
} else {
Some(unwind::FrameInfo {
text_base: None,
kind: unwind::FrameInfoKind::EhFrame(unsafe { EH_FRAME_ADDRESS }),
})
}
}
}
}
#[cfg(not(test))]
mod c_compat {
use crate::os::xous::ffi::exit;
unsafe extern "C" {
fn main() -> u32;
}
#[unsafe(no_mangle)]
pub extern "C" fn abort() {
exit(1);
}
#[unsafe(no_mangle)]
pub extern "C" fn _start(eh_frame: usize, params: *mut u8) {
#[cfg(feature = "panic-unwind")]
{
unsafe { super::eh_unwinding::EH_FRAME_ADDRESS = eh_frame };
unwind::set_custom_eh_frame_finder(&super::eh_unwinding::EH_FRAME_SETTINGS).ok();
}
unsafe { super::params::set(params) };
exit(unsafe { main() });
}
}