1#![no_std]
2#![no_main]
3
4macro_rules! linker_symbol_addr {
5 ($symbol:path) => {
6 ($symbol as *const ()).addr()
7 };
8}
9
10use crate::drivers::{GPU_DEVICE, KEYBOARD_DEVICE, MOUSE_DEVICE};
12extern crate alloc;
13
14#[macro_use]
15extern crate bitflags;
16
17use log::*;
18
19#[path = "boards/qemu.rs"]
20mod board;
21
22#[macro_use]
23mod console;
24mod config;
25mod device_tree;
26mod drivers;
27mod fs;
28mod lang_items;
29mod logging;
30mod mm;
31mod net;
32mod sbi;
33mod sync;
34mod syscall;
35mod task;
36mod timer;
37mod trap;
38
39use crate::drivers::chardev::CharDevice;
40use crate::drivers::chardev::UART;
41
42core::arch::global_asm!(include_str!("entry.asm"));
43
44fn clear_bss() {
45 unsafe extern "C" {
46 safe fn sbss();
47 safe fn ebss();
48 }
49 unsafe {
50 core::slice::from_raw_parts_mut(
51 linker_symbol_addr!(sbss) as *mut u8,
52 linker_symbol_addr!(ebss) - linker_symbol_addr!(sbss),
53 )
54 .fill(0);
55 }
56}
57
58use lazy_static::*;
59use sync::UPIntrFreeCell;
60
61lazy_static! {
62 pub static ref DEV_NON_BLOCKING_ACCESS: UPIntrFreeCell<bool> =
63 unsafe { UPIntrFreeCell::new(false) };
64}
65
66#[unsafe(no_mangle)]
67pub fn rust_main(_hart_id: usize, dtb_pa: usize) -> ! {
68 clear_bss();
69 mm::init();
70 UART.init();
71 logging::init();
72 device_tree::init(dtb_pa);
73 info!("KERN: init gpu");
74 let _gpu = GPU_DEVICE.clone();
75 info!("KERN: init keyboard");
76 let _keyboard = KEYBOARD_DEVICE.clone();
77 info!("KERN: init mouse");
78 let _mouse = MOUSE_DEVICE.clone();
79 info!("KERN: init trap");
80 trap::init();
81 trap::enable_timer_interrupt();
82 timer::set_next_trigger();
83 board::device_init();
84 fs::list_apps();
85 task::add_initproc();
86 *DEV_NON_BLOCKING_ACCESS.exclusive_access() = true;
87 task::run_tasks();
88 panic!("Unreachable in rust_main!");
89}