191e9d4abSLoGin use system_error::SystemError; 291e9d4abSLoGin 3aa0367d6SLoGin use crate::{ 4*8cb2e9b3SLoGin arch::{interrupt::ipi::send_ipi, CurrentSMPArch}, 5aa0367d6SLoGin exception::ipi::{IpiKind, IpiTarget}, 6aa0367d6SLoGin }; 7aa0367d6SLoGin 8338f6903SLoGin use self::{ 9338f6903SLoGin core::smp_get_processor_id, 10*8cb2e9b3SLoGin cpu::{smp_cpu_manager, smp_cpu_manager_init, CpuHpCpuState, ProcessorId}, 11338f6903SLoGin }; 12e2841179SLoGin 1366f67c6aSlogin pub mod core; 1470a4e555SLoGin pub mod cpu; 15*8cb2e9b3SLoGin pub mod init; 16aa0367d6SLoGin 17e2841179SLoGin pub fn kick_cpu(cpu_id: ProcessorId) -> Result<(), SystemError> { 18aa0367d6SLoGin // todo: 增加对cpu_id的有效性检查 19aa0367d6SLoGin 20e2841179SLoGin send_ipi(IpiKind::KickCpu, IpiTarget::Specified(cpu_id)); 21aa0367d6SLoGin return Ok(()); 22aa0367d6SLoGin } 235b59005fSLoGin 245b59005fSLoGin pub trait SMPArch { 255b59005fSLoGin /// 准备SMP初始化所需的cpu拓扑数据。 265b59005fSLoGin /// 275b59005fSLoGin /// 该函数需要标记为 `#[inline(never)]` 285b59005fSLoGin fn prepare_cpus() -> Result<(), SystemError>; 295b59005fSLoGin 30*8cb2e9b3SLoGin /// 在smp初始化结束后,执行一些必要的操作 315b59005fSLoGin /// 325b59005fSLoGin /// 该函数需要标记为 `#[inline(never)]` 33*8cb2e9b3SLoGin fn post_init() -> Result<(), SystemError> { 34*8cb2e9b3SLoGin return Ok(()); 35*8cb2e9b3SLoGin } 36*8cb2e9b3SLoGin 37*8cb2e9b3SLoGin /// 向目标CPU发送启动信号 38*8cb2e9b3SLoGin /// 39*8cb2e9b3SLoGin /// 如果目标CPU已经启动,返回Ok。 40*8cb2e9b3SLoGin fn start_cpu(cpu_id: ProcessorId, hp_state: &CpuHpCpuState) -> Result<(), SystemError>; 415b59005fSLoGin } 42338f6903SLoGin 43338f6903SLoGin /// 早期SMP初始化 44338f6903SLoGin #[inline(never)] 45338f6903SLoGin pub fn early_smp_init() -> Result<(), SystemError> { 46338f6903SLoGin smp_cpu_manager_init(smp_get_processor_id()); 47338f6903SLoGin 48338f6903SLoGin return Ok(()); 49338f6903SLoGin } 50*8cb2e9b3SLoGin 51*8cb2e9b3SLoGin #[inline(never)] 52*8cb2e9b3SLoGin pub fn smp_init() { 53*8cb2e9b3SLoGin smp_cpu_manager().bringup_nonboot_cpus(); 54*8cb2e9b3SLoGin 55*8cb2e9b3SLoGin CurrentSMPArch::post_init().expect("SMP post init failed"); 56*8cb2e9b3SLoGin } 57