     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73

    #![no_std]
    #![no_main]
    #![feature(panic_info_message)]
    #![feature(alloc_error_handler)]

    extern crate alloc;

    #[macro_use]
    extern crate bitflags;

    // #[cfg(feature = "board_k210")]
    // #[path = "boards/k210.rs"]
    // mod board;
    // #[cfg(not(any(feature = "board_k210")))]
    // #[path = "boards/qemu.rs"]

    #[macro_use]
    mod console;
    mod config;
    mod drivers;
    mod fs;
    mod lang_items;
    mod mm;
    mod sbi;
    mod sync;
    mod syscall;
    mod task;
    mod timer;
    mod trap;
    mod board;
    // use board::*;

    core::arch::global_asm!(include_str!("entry.asm"));

    fn clear_bss() {
        extern "C" {
            fn sbss();
            fn ebss();
        }
        kprintln!("[KERN] clear_bss() begin");
        unsafe {
            core::slice::from_raw_parts_mut(sbss as usize as *mut u8, ebss as usize - sbss as usize)
                .fill(0);
        }
        kprintln!("[KERN] clear_bss() end");
    }

    use lazy_static::*;
    use sync::UPIntrFreeCell;

    lazy_static! {
        pub static ref DEV_NON_BLOCKING_ACCESS: UPIntrFreeCell<bool> = {
            kprintln!("[KERN] main::lazy_static!DEV_NON_BLOCKING_ACCESS begin");
            unsafe { UPIntrFreeCell::new(false) }
        };
    }

    #[no_mangle]
    pub fn rust_main() -> ! {
        kprintln!("[KERN] rust_main() begin");
        clear_bss();
        mm::init();
        trap::init();
        trap::enable_timer_interrupt();
        timer::set_next_trigger();
        board::device_init();
        fs::list_apps();
        task::add_initproc();
        *DEV_NON_BLOCKING_ACCESS.exclusive_access() = true;
        task::run_tasks();
        panic!("[KERN] Unreachable in rust_main!");
    }