1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- // NOTE: Adapted from cortex-m/src/lang_items.rs
- use riscv::asm;
- /// Default panic handler
- #[panic_handler]
- fn panic(_info: &core::panic::PanicInfo) -> ! {
- asm::ebreak();
- loop {}
- }
- /// Lang item required to make the normal `main` work in applications
- // This is how the `start` lang item works:
- // When `rustc` compiles a binary crate, it creates a `main` function that looks
- // like this:
- //
- // ```
- // #[export_name = "main"]
- // pub extern "C" fn rustc_main(argc: isize, argv: *const *const u8) -> isize {
- // start(main)
- // }
- // ```
- //
- // Where `start` is this function and `main` is the binary crate's `main`
- // function.
- //
- // The final piece is that the entry point of our program, the reset handler,
- // has to call `rustc_main`. That's covered by the `reset_handler` function in
- // root of this crate.
- #[lang = "start"]
- extern "C" fn lang_start<T>(
- main: fn(),
- _argc: isize,
- _argv: *const *const u8,
- ) -> isize
- where
- T: Termination,
- {
- main();
- 0
- }
- #[lang = "termination"]
- pub trait Termination {
- fn report(self) -> i32;
- }
- impl Termination for () {
- fn report(self) -> i32 {
- 0
- }
- }
|