xref: /DragonOS/kernel/src/mm/init.rs (revision 453452cc02e2766a28d87dd47bdee37caddc4c44)
1 use core::{fmt::Write, sync::atomic::Ordering};
2 
3 use crate::{
4     arch::MMArch, driver::tty::serial::serial8250::send_to_default_serial8250_port,
5     filesystem::procfs::kmsg::kmsg_init, libs::printk::PrintkWriter, mm::mmio_buddy::mmio_init,
6 };
7 
8 use super::MemoryManagementArch;
9 
10 #[atomic_enum]
11 #[derive(PartialEq, Eq)]
12 pub enum MMInitStatus {
13     NotInit,
14     Initializing,
15     Initialized,
16 }
17 /// 内存管理的初始化状态
18 static MM_INIT: AtomicMMInitStatus = AtomicMMInitStatus::new(MMInitStatus::NotInit);
19 
20 pub unsafe fn mm_init() {
21     send_to_default_serial8250_port("mm_init\n\0".as_bytes());
22     PrintkWriter
23         .write_fmt(format_args!("mm_init() called\n"))
24         .unwrap();
25     // printk_color!(GREEN, BLACK, "mm_init() called\n");
26 
27     if MM_INIT
28         .compare_exchange(
29             MMInitStatus::NotInit,
30             MMInitStatus::Initializing,
31             Ordering::SeqCst,
32             Ordering::SeqCst,
33         )
34         .is_err()
35     {
36         send_to_default_serial8250_port("mm_init err\n\0".as_bytes());
37         panic!("mm_init() can only be called once");
38     }
39 
40     MMArch::init();
41 
42     // enable mmio
43     mmio_init();
44     // enable KMSG
45     kmsg_init();
46 
47     MM_INIT
48         .compare_exchange(
49             MMInitStatus::Initializing,
50             MMInitStatus::Initialized,
51             Ordering::SeqCst,
52             Ordering::SeqCst,
53         )
54         .unwrap();
55     kinfo!("mm init done.");
56 }
57 
58 /// 获取内存管理的初始化状态
59 pub fn mm_init_status() -> MMInitStatus {
60     MM_INIT.load(Ordering::SeqCst)
61 }
62