1#![no_std]
2#![feature(abi_x86_interrupt)]
3#![feature(alloc_error_handler)]
4#![feature(allocator_api)]
5#![feature(naked_functions)]
6#![feature(fn_traits)]
7#![feature(const_for)]
8#![feature(const_trait_impl)]
9#![feature(const_mut_refs)]
10#![feature(strict_provenance)]
11
12use core::sync::atomic::{AtomicBool, Ordering};
13
14extern crate alloc;
15
16pub mod arch;
17pub mod console;
18pub mod data;
19pub mod drivers;
20pub mod memory;
21pub mod task;
22pub mod user;
23
24static START_SCHEDULE: AtomicBool = AtomicBool::new(false);
25
26pub fn init_framework() {
27 memory::init();
28 console::init();
29 arch::smp::CPUS.write().init_bsp();
30 arch::interrupts::IDT.load();
31 arch::acpi::init();
32 drivers::hpet::init();
33
34 #[cfg(feature = "smp")]
35 arch::smp::CPUS.write().init_ap();
36
37
38
39 let mut lapic = arch::apic::get_lapic();
40 unsafe {
41 lapic.enable();
42 arch::apic::calibrate_timer(&mut lapic);
43 lapic.enable_timer();
44 }
45
46 arch::apic::init();
47 drivers::mouse::init();
48 drivers::pci::init();
49 drivers::nvme::init();
50 user::init();
51 task::scheduler::init();
52}
53
54#[inline]
55pub fn start_schedule() {
56 START_SCHEDULE.store(true, Ordering::SeqCst);
57 x86_64::instructions::interrupts::enable();
58}
59
60pub fn addr_of<T>(reffer: &T) -> usize {
61 reffer as *const T as usize
62}
63
64pub fn ref_to_mut<T>(reffer: &T) -> &mut T {
65 unsafe { &mut *(addr_of(reffer) as *const T as *mut T) }
66}
67
68pub fn ref_to_static<T>(reffer: &T) -> &'static T {
69 unsafe { &*(addr_of(reffer) as *const T) }
70}
71
72#[macro_export]
73macro_rules! unsafe_trait_impl {
74 ($struct: ident, $trait: ident) => {
75 unsafe impl $trait for $struct {}
76 };
77 ($struct: ident, $trait: ident, $life: tt) => {
78 unsafe impl<$life> $trait for $struct<$life> {}
79 };
80}