1#![doc = include_str!("../README.md")]
2#![no_std]
3#![cfg_attr(
4 target_arch = "riscv32",
5 feature(alloc_error_handler, allocator_api, str_from_raw_parts)
6)]
7
8extern crate alloc;
9
10#[cfg(feature = "std")]
11extern crate std;
12
13#[cfg(all(test, not(feature = "std")))]
14extern crate std;
15
16pub mod allocator;
17pub mod boot;
18pub mod getrandom;
19pub mod sys;
20pub mod uart;
21
22#[cfg(all(feature = "std", target_arch = "riscv32"))]
23mod glue;
24
25#[cfg(not(feature = "allocator-custom"))]
26pub use boot::start;
27pub use boot::start_with_allocator_init;
28
29#[cfg(all(not(feature = "std"), target_arch = "riscv32"))]
30#[panic_handler]
31fn panic(info: &core::panic::PanicInfo) -> ! {
32 use core::fmt::Write as _;
33 let mut uart = uart::QuasiUart::new();
34 let _ = uart.write_str("PANIC: ");
35 let _ = write!(uart, "{info}");
36 sys::exit_error();
37}
38
39#[cfg(all(not(feature = "std"), target_arch = "riscv32"))]
40#[alloc_error_handler]
41fn alloc_error(layout: core::alloc::Layout) -> ! {
42 use core::fmt::Write as _;
43 let mut uart = uart::QuasiUart::new();
44 let _ = write!(
45 uart,
46 "ALLOC_ERROR: size={} align={}",
47 layout.size(),
48 layout.align()
49 );
50 sys::exit_error();
51}