mod.rs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. use core::ops::Add;
  2. use system_error::SystemError;
  3. use crate::arch::CurrentIrqArch;
  4. pub mod dummychip;
  5. pub mod handle;
  6. pub mod init;
  7. pub mod ipi;
  8. pub mod irqchip;
  9. pub mod irqdata;
  10. pub mod irqdesc;
  11. pub mod irqdomain;
  12. pub mod manage;
  13. pub mod msi;
  14. mod resend;
  15. pub mod softirq;
  16. pub mod sysfs;
  17. /// 中断的架构相关的trait
  18. pub trait InterruptArch: Send + Sync {
  19. /// 架构相关的中断初始化
  20. unsafe fn arch_irq_init() -> Result<(), SystemError>;
  21. /// 使能中断
  22. unsafe fn interrupt_enable();
  23. /// 禁止中断
  24. unsafe fn interrupt_disable();
  25. /// 检查中断是否被禁止
  26. fn is_irq_enabled() -> bool;
  27. /// 保存当前中断状态,并且禁止中断
  28. unsafe fn save_and_disable_irq() -> IrqFlagsGuard;
  29. unsafe fn restore_irq(flags: IrqFlags);
  30. /// 检测系统支持的中断总数
  31. fn probe_total_irq_num() -> u32;
  32. fn arch_early_irq_init() -> Result<(), SystemError> {
  33. Ok(())
  34. }
  35. /// 响应未注册的中断
  36. fn ack_bad_irq(irq: IrqNumber);
  37. }
  38. #[derive(Debug, Clone, Copy)]
  39. pub struct IrqFlags {
  40. flags: usize,
  41. }
  42. impl IrqFlags {
  43. pub fn new(flags: usize) -> Self {
  44. IrqFlags { flags }
  45. }
  46. pub fn flags(&self) -> usize {
  47. self.flags
  48. }
  49. }
  50. /// @brief 当前中断状态的保护器,当该对象被drop时,会恢复之前的中断状态
  51. ///
  52. /// # Example
  53. ///
  54. /// ```
  55. /// use crate::arch::CurrentIrqArch;
  56. ///
  57. /// // disable irq and save irq state (这是唯一的获取IrqFlagsGuard的方法)
  58. /// let guard = unsafe{CurrentIrqArch::save_and_disable_irq()};
  59. ///
  60. /// // do something
  61. ///
  62. /// // 销毁guard时,会恢复之前的中断状态
  63. /// drop(guard);
  64. ///
  65. /// ```
  66. #[derive(Debug)]
  67. pub struct IrqFlagsGuard {
  68. flags: IrqFlags,
  69. }
  70. impl IrqFlagsGuard {
  71. /// @brief 创建IrqFlagsGuard对象
  72. ///
  73. /// # Safety
  74. ///
  75. /// 该函数不安全,因为它不会检查flags是否是一个有效的IrqFlags对象, 而当它被drop时,会恢复flags中的中断状态
  76. ///
  77. /// 该函数只应被`CurrentIrqArch::save_and_disable_irq`调用
  78. pub unsafe fn new(flags: IrqFlags) -> Self {
  79. IrqFlagsGuard { flags }
  80. }
  81. }
  82. impl Drop for IrqFlagsGuard {
  83. fn drop(&mut self) {
  84. unsafe {
  85. CurrentIrqArch::restore_irq(self.flags);
  86. }
  87. }
  88. }
  89. // 定义中断号结构体
  90. // 用于表示软件逻辑视角的中断号,全局唯一
  91. int_like!(IrqNumber, u32);
  92. impl IrqNumber {
  93. /// 如果一个(PCI)设备中断没有被连接,我们将设置irqnumber为IRQ_NOTCONNECTED。
  94. /// 这导致request_irq()失败,返回-ENOTCONN,这样我们就可以区分这种情况和其他错误返回。
  95. pub const IRQ_NOTCONNECTED: IrqNumber = IrqNumber::new(u32::MAX);
  96. }
  97. // 硬件中断号
  98. // 用于表示在某个IrqDomain中的中断号
  99. int_like!(HardwareIrqNumber, u32);
  100. impl Add<u32> for HardwareIrqNumber {
  101. type Output = HardwareIrqNumber;
  102. fn add(self, rhs: u32) -> HardwareIrqNumber {
  103. HardwareIrqNumber::new(self.0 + rhs)
  104. }
  105. }
  106. impl Add<u32> for IrqNumber {
  107. type Output = IrqNumber;
  108. fn add(self, rhs: u32) -> IrqNumber {
  109. IrqNumber::new(self.0 + rhs)
  110. }
  111. }