sparreal_kernel/boot/
mod.rs1#![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"#;