ipi.rs 1.5 KB

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