xref: /DragonOS/kernel/src/smp/mod.rs (revision 9430523b465b19db4dd476e9fd3038bdc2aa0c8d)
191e9d4abSLoGin use system_error::SystemError;
291e9d4abSLoGin 
3aa0367d6SLoGin use crate::{
48cb2e9b3SLoGin     arch::{interrupt::ipi::send_ipi, CurrentSMPArch},
5aa0367d6SLoGin     exception::ipi::{IpiKind, IpiTarget},
6aa0367d6SLoGin };
7aa0367d6SLoGin 
8338f6903SLoGin use self::{
9338f6903SLoGin     core::smp_get_processor_id,
108cb2e9b3SLoGin     cpu::{smp_cpu_manager, smp_cpu_manager_init, CpuHpCpuState, ProcessorId},
11338f6903SLoGin };
12e2841179SLoGin 
1366f67c6aSlogin pub mod core;
1470a4e555SLoGin pub mod cpu;
158cb2e9b3SLoGin pub mod init;
16*9430523bSyuyi2439 mod syscall;
17aa0367d6SLoGin 
kick_cpu(cpu_id: ProcessorId) -> Result<(), SystemError>18e2841179SLoGin pub fn kick_cpu(cpu_id: ProcessorId) -> Result<(), SystemError> {
19aa0367d6SLoGin     // todo: 增加对cpu_id的有效性检查
20aa0367d6SLoGin 
21e2841179SLoGin     send_ipi(IpiKind::KickCpu, IpiTarget::Specified(cpu_id));
22aa0367d6SLoGin     return Ok(());
23aa0367d6SLoGin }
245b59005fSLoGin 
255b59005fSLoGin pub trait SMPArch {
265b59005fSLoGin     /// 准备SMP初始化所需的cpu拓扑数据。
275b59005fSLoGin     ///
285b59005fSLoGin     /// 该函数需要标记为 `#[inline(never)]`
prepare_cpus() -> Result<(), SystemError>295b59005fSLoGin     fn prepare_cpus() -> Result<(), SystemError>;
305b59005fSLoGin 
318cb2e9b3SLoGin     /// 在smp初始化结束后,执行一些必要的操作
325b59005fSLoGin     ///
335b59005fSLoGin     /// 该函数需要标记为 `#[inline(never)]`
post_init() -> Result<(), SystemError>348cb2e9b3SLoGin     fn post_init() -> Result<(), SystemError> {
358cb2e9b3SLoGin         return Ok(());
368cb2e9b3SLoGin     }
378cb2e9b3SLoGin 
388cb2e9b3SLoGin     /// 向目标CPU发送启动信号
398cb2e9b3SLoGin     ///
408cb2e9b3SLoGin     /// 如果目标CPU已经启动,返回Ok。
start_cpu(cpu_id: ProcessorId, hp_state: &CpuHpCpuState) -> Result<(), SystemError>418cb2e9b3SLoGin     fn start_cpu(cpu_id: ProcessorId, hp_state: &CpuHpCpuState) -> Result<(), SystemError>;
425b59005fSLoGin }
43338f6903SLoGin 
44338f6903SLoGin /// 早期SMP初始化
45338f6903SLoGin #[inline(never)]
early_smp_init() -> Result<(), SystemError>46338f6903SLoGin pub fn early_smp_init() -> Result<(), SystemError> {
47338f6903SLoGin     smp_cpu_manager_init(smp_get_processor_id());
48338f6903SLoGin 
49338f6903SLoGin     return Ok(());
50338f6903SLoGin }
518cb2e9b3SLoGin 
528cb2e9b3SLoGin #[inline(never)]
smp_init()538cb2e9b3SLoGin pub fn smp_init() {
548cb2e9b3SLoGin     smp_cpu_manager().bringup_nonboot_cpus();
558cb2e9b3SLoGin 
568cb2e9b3SLoGin     CurrentSMPArch::post_init().expect("SMP post init failed");
578cb2e9b3SLoGin }
58