axhal/platform/x86_pc/
mod.rs1mod apic;
2mod boot;
3mod uart16550;
4
5pub mod mem;
6pub mod misc;
7pub mod time;
8
9#[cfg(feature = "smp")]
10pub mod mp;
11
12#[cfg(feature = "irq")]
13pub mod irq {
14 pub use super::apic::*;
15}
16
17pub mod console {
18 pub use super::uart16550::*;
19}
20
21unsafe extern "C" {
22 fn rust_main(cpu_id: usize, dtb: usize) -> !;
23 #[cfg(feature = "smp")]
24 fn rust_main_secondary(cpu_id: usize) -> !;
25}
26
27fn current_cpu_id() -> usize {
28 match raw_cpuid::CpuId::new().get_feature_info() {
29 Some(finfo) => finfo.initial_local_apic_id() as usize,
30 None => 0,
31 }
32}
33
34unsafe extern "C" fn rust_entry(magic: usize, _mbi: usize) {
35 if magic == self::boot::MULTIBOOT_BOOTLOADER_MAGIC {
37 crate::mem::clear_bss();
38 crate::cpu::init_primary(current_cpu_id());
39 self::uart16550::init();
40 self::time::init_early();
41 rust_main(current_cpu_id(), 0);
42 }
43}
44
45#[allow(unused_variables)]
46unsafe extern "C" fn rust_entry_secondary(magic: usize) {
47 #[cfg(feature = "smp")]
48 if magic == self::boot::MULTIBOOT_BOOTLOADER_MAGIC {
49 crate::cpu::init_secondary(current_cpu_id());
50 rust_main_secondary(current_cpu_id());
51 }
52}
53
54pub fn platform_init() {
56 self::apic::init_primary();
57 self::time::init_primary();
58}
59
60#[cfg(feature = "smp")]
62pub fn platform_init_secondary() {
63 self::apic::init_secondary();
64 self::time::init_secondary();
65}