irq.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /**
  2. * @file irq.h
  3. * @author longjin
  4. * @brief 中断处理程序
  5. * @version 0.1
  6. * @date 2022-01-28
  7. *
  8. * @copyright Copyright (c) 2022
  9. *
  10. */
  11. #pragma once
  12. #include "../common/glib.h"
  13. #include "../process/ptrace.h"
  14. #define SMP_IRQ_NUM 10
  15. extern void (*interrupt_table[24])(void);
  16. extern void do_IRQ(struct pt_regs *regs, ul number);
  17. extern void (*SMP_interrupt_table[SMP_IRQ_NUM])(void);
  18. /* ========= 中断向量分配表 ==========
  19. 0~255 IDT
  20. 0 ~ 31 trap fault abort for system
  21. 0 devide error
  22. 1 debug
  23. 2 NMI
  24. 3 breakpoint
  25. 4 overflow
  26. 5 bound range
  27. 6 undefined opcode
  28. 7 device not available
  29. 8 double fault
  30. 9 coprocessor segment overrun
  31. 10 invalid TSS
  32. 11 segment not present
  33. 12 stack segment fault
  34. 13 general protection
  35. 14 page fault
  36. 15
  37. 16 x87 FPU error
  38. 17 alignment check
  39. 18 machine check
  40. 19 SIMD exception
  41. 20 virtualization exception
  42. 21 ~ 31 Do not use
  43. 32 ~ 55 I/O APIC
  44. 32 8259A
  45. 33 keyboard
  46. 34 HPET timer 0,8254 counter 0
  47. 35 serial port A
  48. 36 serial port B
  49. 37 parallel port
  50. 38 floppy
  51. 39 parallel port
  52. 40 RTC,HPET timer 1
  53. 41 Generic
  54. 42 Generic
  55. 43 HPET timer 2
  56. 44 HPET timer 3 / mouse
  57. 45 FERR#
  58. 46 SATA primary
  59. 47 SATA secondary
  60. 48 PIRQA
  61. 49 PIRQB
  62. 50 PIRQC
  63. 51 PIRQD
  64. 52 PIRQE
  65. 53 PIRQF
  66. 54 PIRQG
  67. 55 PIRQH
  68. 0x80 system call
  69. 150 ~ 200 Local APIC
  70. 150 CMCI
  71. 151 Timer
  72. 152 Thermal Monitor
  73. 153 Performance Counter
  74. 154 LINT0
  75. 155 LINT1
  76. 156 Error
  77. 200 ~ 255 MP IPI
  78. */
  79. typedef struct hardware_intr_type
  80. {
  81. // 使能中断操作接口
  82. void (*enable)(ul irq_num);
  83. // 禁止中断操作接口
  84. void (*disable)(ul irq_num);
  85. // 安装中断操作接口
  86. ul (*install)(ul irq_num, void *arg);
  87. // 卸载中断操作接口
  88. void (*uninstall)(ul irq_num);
  89. // 应答中断操作接口
  90. void (*ack)(ul irq_num);
  91. } hardware_intr_controller;
  92. // 中断描述结构体
  93. typedef struct
  94. {
  95. hardware_intr_controller *controller;
  96. // 中断名
  97. char *irq_name;
  98. // 中断处理函数的参数
  99. ul parameter;
  100. // 中断处理函数
  101. void (*handler)(ul irq_num, ul parameter, struct pt_regs *regs);
  102. // 自定义的标志位
  103. ul flags;
  104. } irq_desc_t;
  105. #define IRQ_NUM 24
  106. irq_desc_t interrupt_desc[IRQ_NUM] = {0};
  107. irq_desc_t SMP_IPI_desc[SMP_IRQ_NUM];
  108. /**
  109. * @brief 中断注册函数
  110. *
  111. * @param irq_num 中断向量号
  112. * @param arg 传递给中断安装接口的参数
  113. * @param handler 中断处理函数
  114. * @param paramater 中断处理函数的参数
  115. * @param controller 中断控制器结构
  116. * @param irq_name 中断名
  117. * @return int
  118. */
  119. int irq_register(ul irq_num, void *arg, void (*handler)(ul irq_num, ul parameter, struct pt_regs *regs), ul paramater, hardware_intr_controller *controller, char *irq_name);
  120. /**
  121. * @brief 中断注销函数
  122. *
  123. * @param irq_num 中断向量号
  124. * @return int
  125. */
  126. int irq_unregister(ul irq_num);
  127. /**
  128. * @brief 初始化中断模块
  129. */
  130. void irq_init();