Skip to main content

os/
main.rs

1#![no_std]
2#![no_main]
3
4macro_rules! linker_symbol_addr {
5    ($symbol:path) => {
6        ($symbol as *const ()).addr()
7    };
8}
9
10//use crate::drivers::{GPU_DEVICE, KEYBOARD_DEVICE, MOUSE_DEVICE, INPUT_CONDVAR};
11use 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}