191e9d4abSLoGin use system_error::SystemError; 291e9d4abSLoGin 3aa0367d6SLoGin use crate::{ 41496ba7bSLoGin arch::interrupt::ipi::send_ipi, 5aa0367d6SLoGin exception::ipi::{IpiKind, IpiTarget}, 6aa0367d6SLoGin }; 7aa0367d6SLoGin 840fe15e0SLoGin pub mod c_adapter; 966f67c6aSlogin pub mod core; 1070a4e555SLoGin pub mod cpu; 11aa0367d6SLoGin 121496ba7bSLoGin pub fn kick_cpu(cpu_id: u32) -> Result<(), SystemError> { 13aa0367d6SLoGin // todo: 增加对cpu_id的有效性检查 14aa0367d6SLoGin 151496ba7bSLoGin send_ipi(IpiKind::KickCpu, IpiTarget::Specified(cpu_id as usize)); 16aa0367d6SLoGin return Ok(()); 17aa0367d6SLoGin } 18*5b59005fSLoGin 19*5b59005fSLoGin pub trait SMPArch { 20*5b59005fSLoGin /// 准备SMP初始化所需的cpu拓扑数据。 21*5b59005fSLoGin /// 22*5b59005fSLoGin /// 该函数需要标记为 `#[inline(never)]` 23*5b59005fSLoGin fn prepare_cpus() -> Result<(), SystemError>; 24*5b59005fSLoGin 25*5b59005fSLoGin /// 初始化SMP 26*5b59005fSLoGin /// 27*5b59005fSLoGin /// 该函数需要标记为 `#[inline(never)]` 28*5b59005fSLoGin fn init() -> Result<(), SystemError>; 29*5b59005fSLoGin } 30