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