1#![deny(missing_docs)]
11#![deny(warnings)]
12#![no_std]
13#![no_main]
14
15macro_rules! linker_symbol_addr {
16 ($symbol:path) => {
17 ($symbol as *const ()).addr()
18 };
19}
20
21use core::arch::global_asm;
22use log::*;
23
24#[macro_use]
25mod console;
26mod lang_items;
27mod logging;
28mod sbi;
29
30global_asm!(include_str!("entry.asm"));
31
32pub fn clear_bss() {
34 unsafe extern "C" {
35 safe fn sbss();
36 safe fn ebss();
37 }
38 (linker_symbol_addr!(sbss)..linker_symbol_addr!(ebss))
39 .for_each(|a| unsafe { (a as *mut u8).write_volatile(0) });
40}
41
42#[unsafe(no_mangle)]
44pub fn rust_main() -> ! {
45 unsafe extern "C" {
46 safe fn stext(); safe fn etext(); safe fn srodata(); safe fn erodata(); safe fn sdata(); safe fn edata(); safe fn sbss(); safe fn ebss(); safe fn boot_stack_lower_bound(); safe fn boot_stack_top(); }
57 clear_bss();
58 logging::init();
59 println!("[kernel] Hello, world!");
60 trace!(
61 "[kernel] .text [{:#x}, {:#x})",
62 linker_symbol_addr!(stext),
63 linker_symbol_addr!(etext)
64 );
65 debug!(
66 "[kernel] .rodata [{:#x}, {:#x})",
67 linker_symbol_addr!(srodata),
68 linker_symbol_addr!(erodata)
69 );
70 info!(
71 "[kernel] .data [{:#x}, {:#x})",
72 linker_symbol_addr!(sdata),
73 linker_symbol_addr!(edata)
74 );
75 warn!(
76 "[kernel] boot_stack top=bottom={:#x}, lower_bound={:#x}",
77 linker_symbol_addr!(boot_stack_top),
78 linker_symbol_addr!(boot_stack_lower_bound)
79 );
80 error!(
81 "[kernel] .bss [{:#x}, {:#x})",
82 linker_symbol_addr!(sbss),
83 linker_symbol_addr!(ebss)
84 );
85
86 sbi::shutdown(false)
89}