sparreal_kernel/boot/
mod.rs

1#![allow(unused)]
2
3use ansi_rgb::{Foreground, orange};
4use log::LevelFilter;
5
6use crate::{
7    driver,
8    globals::{self, global_val},
9    io::{self, print::*},
10    irq,
11    logger::KLogger,
12    mem::{self, VirtAddr, region, va_offset},
13    platform::{self, app_main, module_registers, platform_name, shutdown},
14    platform_if::*,
15    println, task, time,
16};
17
18pub mod debug;
19
20#[cfg(feature = "mmu")]
21mod mmu;
22
23#[cfg(feature = "mmu")]
24pub use mmu::start;
25
26#[repr(align(0x10))]
27pub extern "C" fn __start() -> ! {
28    early_dbgln("Relocate success.");
29
30    io::print::stdout_use_debug();
31
32    mem::init_heap();
33
34    print_start_msg();
35
36    let _ = log::set_logger(&KLogger);
37    log::set_max_level(LevelFilter::Trace);
38
39    PlatformImpl::on_boot_success();
40
41    mem::init_page_and_memory();
42
43    unsafe { globals::setup_percpu() };
44
45    driver::init();
46
47    irq::enable_all();
48
49    task::init();
50
51    driver::probe();
52
53    app_main();
54
55    shutdown()
56}
57
58fn print_info() {
59    early_dbg("va: ");
60    early_dbg_hexln(va_offset() as _);
61
62    let regions = crate::platform_if::PlatformImpl::kernel_regions();
63
64    early_dbg_mem("kernel.text", regions.text.as_slice());
65    early_dbg_mem("kernel.data", regions.data.as_slice());
66    early_dbg_mem("kernel.bss ", regions.bss.as_slice());
67}
68
69macro_rules! print_pair {
70    ($name:expr, $($arg:tt)*) => {
71        $crate::print!("{:<30}: {}\r\n", $name, format_args!($($arg)*));
72    };
73}
74
75fn print_start_msg() {
76    println!("{}", LOGO.fg(orange()));
77
78    print_pair!("Version", env!("CARGO_PKG_VERSION"));
79    print_pair!("Platfrom", "{}", platform_name());
80    print_pair!("Kernel Base", "{:p}", region::text().as_ptr());
81
82    let size =
83        region::bss().as_ptr_range().end as usize - region::text().as_ptr_range().start as usize;
84
85    print_pair!("Kernel Size", "{:#}", byte_unit::Byte::from_u64(size as _));
86    print_pair!(
87        "Kernel Stack Top",
88        "{}",
89        VirtAddr::from(global_val().kstack_top)
90    );
91
92    print_pair!("Start CPU", "{:?}", platform::cpu_id());
93
94    if let Some(debug) = global_val().platform_info.debugcon() {
95        if let Some(c) = debug.compatibles().next() {
96            print_pair!("Debug Serial", "{}", c);
97        }
98    }
99}
100
101static LOGO: &str = r#"
102     _____                                         __
103    / ___/ ____   ____ _ _____ _____ ___   ____ _ / /
104    \__ \ / __ \ / __ `// ___// ___// _ \ / __ `// / 
105   ___/ // /_/ // /_/ // /   / /   /  __// /_/ // /  
106  /____// .___/ \__,_//_/   /_/    \___/ \__,_//_/   
107       /_/                                           
108"#;