axhal/platform/x86_pc/
mod.rs

1mod 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    // TODO: handle multiboot info
36    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
54/// Initializes the platform devices for the primary CPU.
55pub fn platform_init() {
56    self::apic::init_primary();
57    self::time::init_primary();
58}
59
60/// Initializes the platform devices for secondary CPUs.
61#[cfg(feature = "smp")]
62pub fn platform_init_secondary() {
63    self::apic::init_secondary();
64    self::time::init_secondary();
65}