irq.h 2.7 KB

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