xref: /DragonOS/kernel/src/arch/x86_64/acpi.rs (revision e28411791f090c421fe4b6fa5956fb1bd362a8d9)
1 use system_error::SystemError;
2 
3 use crate::{driver::acpi::acpi_manager, kinfo, mm::percpu::PerCpu, smp::cpu::ProcessorId};
4 
5 use super::smp::SMP_BOOT_DATA;
6 
7 pub(super) fn early_acpi_boot_init() -> Result<(), SystemError> {
8     // 在这里解析madt,初始化smp boot data
9 
10     let platform_info = acpi_manager().platform_info().ok_or(SystemError::ENODEV)?;
11     let processor_info = platform_info.processor_info.ok_or(SystemError::ENODEV)?;
12 
13     unsafe {
14         SMP_BOOT_DATA.set_phys_id(
15             ProcessorId::new(0),
16             processor_info.boot_processor.local_apic_id as usize,
17         );
18         let mut cnt = ProcessorId::new(1);
19         for ap in processor_info.application_processors.iter() {
20             if cnt.data() >= PerCpu::MAX_CPU_NUM {
21                 break;
22             }
23             SMP_BOOT_DATA.set_phys_id(cnt, ap.local_apic_id as usize);
24             cnt = ProcessorId::new(cnt.data() + 1);
25         }
26         SMP_BOOT_DATA.set_cpu_count(cnt.data());
27         SMP_BOOT_DATA.mark_initialized();
28     }
29     kinfo!(
30         "early_acpi_boot_init: cpu_count: {}\n",
31         SMP_BOOT_DATA.cpu_count()
32     );
33 
34     // todo!("early_acpi_boot_init")
35     return Ok(());
36 }
37