acpi.rs 1.2 KB

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