xref: /DragonOS/kernel/src/exception/ipi.rs (revision e28411791f090c421fe4b6fa5956fb1bd362a8d9)
1*e2841179SLoGin use alloc::sync::Arc;
2*e2841179SLoGin use system_error::SystemError;
3*e2841179SLoGin 
4*e2841179SLoGin use crate::{
5*e2841179SLoGin     arch::{sched::sched, MMArch},
6*e2841179SLoGin     mm::MemoryManagementArch,
7*e2841179SLoGin     smp::cpu::ProcessorId,
8*e2841179SLoGin };
9*e2841179SLoGin 
10*e2841179SLoGin use super::{
11*e2841179SLoGin     irqdata::IrqHandlerData,
12*e2841179SLoGin     irqdesc::{IrqHandler, IrqReturn},
13*e2841179SLoGin     HardwareIrqNumber, IrqNumber,
14*e2841179SLoGin };
15*e2841179SLoGin 
16aa0367d6SLoGin #[allow(dead_code)]
17aa0367d6SLoGin #[derive(Debug, Copy, Clone, Eq, PartialEq)]
18aa0367d6SLoGin pub enum IpiKind {
19aa0367d6SLoGin     KickCpu,
20aa0367d6SLoGin     FlushTLB,
21*e2841179SLoGin     /// 指定中断向量号
22*e2841179SLoGin     SpecVector(HardwareIrqNumber),
23aa0367d6SLoGin }
24aa0367d6SLoGin 
25aa0367d6SLoGin /// IPI投递目标
26aa0367d6SLoGin #[derive(Debug, Copy, Clone, Eq, PartialEq)]
27aa0367d6SLoGin #[allow(dead_code)]
28aa0367d6SLoGin pub enum IpiTarget {
29aa0367d6SLoGin     /// 当前CPU
30aa0367d6SLoGin     Current,
31aa0367d6SLoGin     /// 所有CPU
32aa0367d6SLoGin     All,
33aa0367d6SLoGin     /// 除了当前CPU以外的所有CPU
34aa0367d6SLoGin     Other,
35aa0367d6SLoGin     /// 指定的CPU
36*e2841179SLoGin     Specified(ProcessorId),
37*e2841179SLoGin }
38*e2841179SLoGin 
39*e2841179SLoGin /// 处理跨核心CPU唤醒的IPI
40*e2841179SLoGin #[derive(Debug)]
41*e2841179SLoGin pub struct KickCpuIpiHandler;
42*e2841179SLoGin 
43*e2841179SLoGin impl IrqHandler for KickCpuIpiHandler {
44*e2841179SLoGin     fn handle(
45*e2841179SLoGin         &self,
46*e2841179SLoGin         _irq: IrqNumber,
47*e2841179SLoGin         _static_data: Option<&dyn IrqHandlerData>,
48*e2841179SLoGin         _dynamic_data: Option<Arc<dyn IrqHandlerData>>,
49*e2841179SLoGin     ) -> Result<IrqReturn, SystemError> {
50*e2841179SLoGin         sched();
51*e2841179SLoGin         Ok(IrqReturn::Handled)
52*e2841179SLoGin     }
53*e2841179SLoGin }
54*e2841179SLoGin 
55*e2841179SLoGin /// 处理TLB刷新的IPI
56*e2841179SLoGin #[derive(Debug)]
57*e2841179SLoGin pub struct FlushTLBIpiHandler;
58*e2841179SLoGin 
59*e2841179SLoGin impl IrqHandler for FlushTLBIpiHandler {
60*e2841179SLoGin     fn handle(
61*e2841179SLoGin         &self,
62*e2841179SLoGin         _irq: IrqNumber,
63*e2841179SLoGin         _static_data: Option<&dyn IrqHandlerData>,
64*e2841179SLoGin         _dynamic_data: Option<Arc<dyn IrqHandlerData>>,
65*e2841179SLoGin     ) -> Result<IrqReturn, SystemError> {
66*e2841179SLoGin         unsafe { MMArch::invalidate_all() };
67*e2841179SLoGin 
68*e2841179SLoGin         Ok(IrqReturn::Handled)
69*e2841179SLoGin     }
70aa0367d6SLoGin }
71