mod.rs 942 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. use system_error::SystemError;
  2. use crate::{
  3. arch::interrupt::ipi::send_ipi,
  4. exception::ipi::{IpiKind, IpiTarget},
  5. };
  6. use self::{
  7. core::smp_get_processor_id,
  8. cpu::{smp_cpu_manager_init, ProcessorId},
  9. };
  10. pub mod c_adapter;
  11. pub mod core;
  12. pub mod cpu;
  13. pub fn kick_cpu(cpu_id: ProcessorId) -> Result<(), SystemError> {
  14. // todo: 增加对cpu_id的有效性检查
  15. send_ipi(IpiKind::KickCpu, IpiTarget::Specified(cpu_id));
  16. return Ok(());
  17. }
  18. pub trait SMPArch {
  19. /// 准备SMP初始化所需的cpu拓扑数据。
  20. ///
  21. /// 该函数需要标记为 `#[inline(never)]`
  22. fn prepare_cpus() -> Result<(), SystemError>;
  23. /// 初始化SMP
  24. ///
  25. /// 该函数需要标记为 `#[inline(never)]`
  26. fn init() -> Result<(), SystemError>;
  27. }
  28. /// 早期SMP初始化
  29. #[inline(never)]
  30. pub fn early_smp_init() -> Result<(), SystemError> {
  31. smp_cpu_manager_init(smp_get_processor_id());
  32. return Ok(());
  33. }