1#![deny(missing_docs)]
19#![deny(warnings)]
20#![no_std]
21#![no_main]
22
23macro_rules! linker_symbol_addr {
24 ($symbol:path) => {
25 ($symbol as *const ()).addr()
26 };
27}
28
29use core::arch::global_asm;
30use log::*;
31#[macro_use]
32mod console;
33mod config;
34mod lang_items;
35mod loader;
36mod logging;
37mod sbi;
38mod sync;
39pub mod syscall;
40pub mod task;
41pub mod trap;
42
43global_asm!(include_str!("entry.asm"));
44global_asm!(include_str!("link_app.S"));
45
46fn clear_bss() {
48 unsafe extern "C" {
49 safe fn sbss();
50 safe fn ebss();
51 }
52 unsafe {
53 core::slice::from_raw_parts_mut(
54 linker_symbol_addr!(sbss) as *mut u8,
55 linker_symbol_addr!(ebss) - linker_symbol_addr!(sbss),
56 )
57 .fill(0);
58 }
59}
60
61#[unsafe(no_mangle)]
63pub fn rust_main() -> ! {
64 clear_bss();
65 logging::init();
66 info!("[kernel] Hello, world!");
67 trap::init();
68 loader::load_apps();
69 task::run_first_task();
70 panic!("Unreachable in rust_main!");
71}