trap.c 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. #include "trap.h"
  2. #include "gate.h"
  3. #include "../process/ptrace.h"
  4. void init_sys_vector()
  5. {
  6. set_trap_gate(0, 1, divide_error);
  7. set_trap_gate(1, 1, debug);
  8. set_intr_gate(2, 1, nmi);
  9. set_system_trap_gate(3, 1, int3);
  10. set_system_trap_gate(4, 1, overflow);
  11. set_system_trap_gate(5, 1, bounds);
  12. set_trap_gate(6, 1, undefined_opcode);
  13. set_trap_gate(7, 1, dev_not_avaliable);
  14. set_trap_gate(8, 1, double_fault);
  15. set_trap_gate(9, 1, coprocessor_segment_overrun);
  16. set_trap_gate(10, 1, invalid_TSS);
  17. set_trap_gate(11, 1, segment_not_exists);
  18. set_trap_gate(12, 1, stack_segment_fault);
  19. set_trap_gate(13, 1, general_protection);
  20. set_trap_gate(14, 1, page_fault);
  21. // 中断号15由Intel保留,不能使用
  22. set_trap_gate(16, 1, x87_FPU_error);
  23. set_trap_gate(17, 1, alignment_check);
  24. set_trap_gate(18, 1, machine_check);
  25. set_trap_gate(19, 1, SIMD_exception);
  26. set_trap_gate(20, 1, virtualization_exception);
  27. // 中断号21-31由Intel保留,不能使用
  28. // 32-255为用户自定义中断内部
  29. }
  30. // 0 #DE 除法错误
  31. void do_divide_error(struct pt_regs * regs, unsigned long error_code)
  32. {
  33. printk("[ ");
  34. printk_color(RED, BLACK, "ERROR");
  35. printk(" ] do_divide_error(0),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  36. while (1)
  37. ;
  38. }
  39. // 1 #DB 调试异常
  40. void do_debug(struct pt_regs * regs, unsigned long error_code)
  41. {
  42. printk("[ ");
  43. printk_color(RED, BLACK, "ERROR / TRAP");
  44. printk(" ] do_debug(1),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  45. while (1)
  46. ;
  47. }
  48. // 2 不可屏蔽中断
  49. void do_nmi(struct pt_regs * regs, unsigned long error_code)
  50. {
  51. printk("[ ");
  52. printk_color(BLUE, BLACK, "INT");
  53. printk(" ] do_nmi(2),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  54. while (1)
  55. ;
  56. }
  57. // 3 #BP 断点异常
  58. void do_int3(struct pt_regs * regs, unsigned long error_code)
  59. {
  60. printk("[ ");
  61. printk_color(YELLOW, BLACK, "TRAP");
  62. printk(" ] do_int3(3),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  63. while (1)
  64. ;
  65. }
  66. // 4 #OF 溢出异常
  67. void do_overflow(struct pt_regs * regs, unsigned long error_code)
  68. {
  69. printk("[ ");
  70. printk_color(YELLOW, BLACK, "TRAP");
  71. printk(" ] do_overflow(4),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  72. while (1)
  73. ;
  74. }
  75. // 5 #BR 越界异常
  76. void do_bounds(struct pt_regs * regs, unsigned long error_code)
  77. {
  78. printk("[ ");
  79. printk_color(RED, BLACK, "ERROR");
  80. printk(" ] do_bounds(5),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  81. while (1)
  82. ;
  83. }
  84. // 6 #UD 无效/未定义的机器码
  85. void do_undefined_opcode(struct pt_regs * regs, unsigned long error_code)
  86. {
  87. printk("[ ");
  88. printk_color(RED, BLACK, "ERROR");
  89. printk(" ] do_undefined_opcode(6),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  90. while (1)
  91. ;
  92. }
  93. // 7 #NM 设备异常(FPU不存在)
  94. void do_dev_not_avaliable(struct pt_regs * regs, unsigned long error_code)
  95. {
  96. printk("[ ");
  97. printk_color(RED, BLACK, "ERROR");
  98. printk(" ] do_dev_not_avaliable(7),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  99. while (1)
  100. ;
  101. }
  102. // 8 #DF 双重错误
  103. void do_double_fault(struct pt_regs * regs, unsigned long error_code)
  104. {
  105. printk("[ ");
  106. printk_color(RED, BLACK, "Terminate");
  107. printk(" ] do_double_fault(8),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  108. while (1)
  109. ;
  110. }
  111. // 9 协处理器越界(保留)
  112. void do_coprocessor_segment_overrun(struct pt_regs * regs, unsigned long error_code)
  113. {
  114. printk("[ ");
  115. printk_color(RED, BLACK, "ERROR");
  116. printk(" ] do_coprocessor_segment_overrun(9),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  117. while (1)
  118. ;
  119. }
  120. // 10 #TS 无效的TSS段
  121. void do_invalid_TSS(struct pt_regs * regs, unsigned long error_code)
  122. {
  123. printk("[");
  124. printk_color(RED, BLACK, "ERROR");
  125. printk("] do_invalid_TSS(10),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  126. printk_color(YELLOW, BLACK, "Information:\n");
  127. // 解析错误码
  128. if (error_code & 0x01)
  129. printk("The exception occurred during delivery of an event external to the program.\n");
  130. if (error_code & 0x02)
  131. printk("Refers to a descriptor in the IDT.\n");
  132. else
  133. {
  134. if (error_code & 0x04)
  135. printk("Refers to a descriptor in the current LDT.\n");
  136. else
  137. printk("Refers to a descriptor in the GDT.\n");
  138. }
  139. printk("Segment Selector Index:%10x\n", error_code & 0xfff8);
  140. printk("\n");
  141. while (1)
  142. ;
  143. }
  144. // 11 #NP 段不存在
  145. void do_segment_not_exists(struct pt_regs * regs, unsigned long error_code)
  146. {
  147. printk("[ ");
  148. printk_color(RED, BLACK, "ERROR");
  149. printk(" ] do_segment_not_exists(11),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  150. while (1)
  151. ;
  152. }
  153. // 12 #SS SS段错误
  154. void do_stack_segment_fault(struct pt_regs * regs, unsigned long error_code)
  155. {
  156. printk("[ ");
  157. printk_color(RED, BLACK, "ERROR");
  158. printk(" ] do_stack_segment_fault(12),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  159. while (1)
  160. ;
  161. }
  162. // 13 #GP 通用保护性异常
  163. void do_general_protection(struct pt_regs * regs, unsigned long error_code)
  164. {
  165. printk("[ ");
  166. printk_color(RED, BLACK, "ERROR");
  167. printk(" ] do_general_protection(13),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  168. if(error_code & 0x01)
  169. printk_color(RED,BLACK,"The exception occurred during delivery of an event external to the program,such as an interrupt or an earlier exception.\n");
  170. if(error_code & 0x02)
  171. printk_color(RED,BLACK,"Refers to a gate descriptor in the IDT;\n");
  172. else
  173. printk_color(RED,BLACK,"Refers to a descriptor in the GDT or the current LDT;\n");
  174. if((error_code & 0x02) == 0)
  175. if(error_code & 0x04)
  176. printk_color(RED,BLACK,"Refers to a segment or gate descriptor in the LDT;\n");
  177. else
  178. printk_color(RED,BLACK,"Refers to a descriptor in the current GDT;\n");
  179. printk_color(RED,BLACK,"Segment Selector Index:%#010x\n",error_code & 0xfff8);
  180. while (1)
  181. ;
  182. }
  183. // 14 #PF 页故障
  184. void do_page_fault(struct pt_regs * regs, unsigned long error_code)
  185. {
  186. unsigned long cr2 = 0;
  187. // 先保存cr2寄存器的值,避免由于再次触发页故障而丢失值
  188. // cr2存储着触发异常的线性地址
  189. __asm__ __volatile__("movq %%cr2, %0"
  190. : "=r"(cr2)::"memory");
  191. printk("[ ");
  192. printk_color(RED, BLACK, "ERROR");
  193. printk(" ] do_page_fault(14),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\tCR2:%#18lx\n", error_code, regs->rsp, regs->rip, cr2);
  194. printk_color(YELLOW, BLACK, "Information:\n");
  195. if (!(error_code & 0x01))
  196. printk("Page does not exist.\n");
  197. if (error_code & 0x02)
  198. printk("Fault occurred during operation: writing\n");
  199. else
  200. printk("Fault occurred during operation: reading\n");
  201. if (error_code & 0x04)
  202. printk("Fault in user level(3).\n");
  203. else
  204. printk("Fault in supervisor level(0,1,2).\n");
  205. if (error_code & 0x08)
  206. printk("Reserved bit caused the fault.\n");
  207. if (error_code & 0x10)
  208. printk("Fault occurred during fetching instruction.\n");
  209. while (1)
  210. ;
  211. }
  212. // 15 Intel保留,请勿使用
  213. // 16 #MF x87FPU错误
  214. void do_x87_FPU_error(struct pt_regs * regs, unsigned long error_code)
  215. {
  216. printk("[ ");
  217. printk_color(RED, BLACK, "ERROR");
  218. printk(" ] do_x87_FPU_error(16),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  219. while (1)
  220. ;
  221. }
  222. // 17 #AC 对齐检测
  223. void do_alignment_check(struct pt_regs * regs, unsigned long error_code)
  224. {
  225. printk("[ ");
  226. printk_color(RED, BLACK, "ERROR");
  227. printk(" ] do_alignment_check(17),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  228. while (1)
  229. ;
  230. }
  231. // 18 #MC 机器检测
  232. void do_machine_check(struct pt_regs * regs, unsigned long error_code)
  233. {
  234. printk("[ ");
  235. printk_color(RED, BLACK, "ERROR");
  236. printk(" ] do_machine_check(18),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  237. while (1)
  238. ;
  239. }
  240. // 19 #XM SIMD浮点异常
  241. void do_SIMD_exception(struct pt_regs * regs, unsigned long error_code)
  242. {
  243. printk("[ ");
  244. printk_color(RED, BLACK, "ERROR");
  245. printk(" ] do_SIMD_exception(19),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  246. while (1)
  247. ;
  248. }
  249. // 20 #VE 虚拟化异常
  250. void do_virtualization_exception(struct pt_regs * regs, unsigned long error_code)
  251. {
  252. printk("[ ");
  253. printk_color(RED, BLACK, "ERROR");
  254. printk(" ] do_virtualization_exception(20),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
  255. while (1)
  256. ;
  257. }
  258. // 21-21 Intel保留,请勿使用