irq.h 3.0 KB

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