1#![no_std]
2#![no_main]
3
4macro_rules! linker_symbol_addr {
5 ($symbol:path) => {
6 ($symbol as *const ()).addr()
7 };
8}
9
10extern crate alloc;
11
12#[macro_use]
13extern crate bitflags;
14
15use log::*;
16
17#[path = "boards/qemu.rs"]
18mod board;
19
20#[macro_use]
21mod console;
22mod config;
23mod device_tree;
24mod drivers;
25mod fs;
26mod lang_items;
27mod logging;
28mod mm;
29mod sbi;
30mod sync;
31mod syscall;
32mod task;
33mod timer;
34mod trap;
35
36use core::arch::global_asm;
37
38global_asm!(include_str!("entry.asm"));
39
40fn clear_bss() {
41 unsafe extern "C" {
42 safe fn sbss();
43 safe fn ebss();
44 }
45 unsafe {
46 core::slice::from_raw_parts_mut(
47 linker_symbol_addr!(sbss) as *mut u8,
48 linker_symbol_addr!(ebss) - linker_symbol_addr!(sbss),
49 )
50 .fill(0);
51 }
52}
53
54#[unsafe(no_mangle)]
56pub fn rust_main(_hart_id: usize, dtb_pa: usize) -> ! {
57 clear_bss();
58 logging::init();
59 device_tree::init(dtb_pa);
60 info!("[kernel] Hello, world!");
61 mm::init();
62 mm::remap_test();
63 trap::init();
64 trap::enable_timer_interrupt();
65 timer::set_next_trigger();
66 fs::list_apps();
67 task::add_initproc();
68 task::run_tasks();
69 panic!("Unreachable in rust_main!");
70}