panic.c
上传用户:qddsws
上传日期:2022-06-22
资源大小:723k
文件大小:3k
源码类别:

操作系统开发

开发平台:

C/C++

  1. #include <i386/panic.h>
  2. void int_00(void);
  3. void LoadExceptions()
  4. {
  5. /*
  6.  * Afegim a la IDT tots els handlers de les excepcions.
  7.  * 
  8.  */
  9.    AddInt(0, int00, 0);
  10.      AddInt(1, _int01, 0);
  11.      AddInt(2, int02, 0);
  12.      AddInt(3, _int03, 0);
  13.      AddInt(4, int04, 0);
  14.      AddInt(5, int05, 0);
  15.      AddInt(6, int06, 0);
  16.      AddInt(7, int07, 0);
  17.      AddInt(8, int08, 0);
  18.      AddInt(9, int09, 0);
  19.      AddInt(10, int10, 0);
  20.      AddInt(11, int11, 0);
  21.      AddInt(12, int12, 0);
  22.      AddInt(13, int13, 0);
  23.      AddInt(14, int14, 0);
  24.      AddInt(16, int16, 0);
  25.      AddInt(17, int17, 0);
  26.      AddInt(18, int18, 0);
  27.      AddInt(19, int19, 0);
  28. AddInt(20, 0, 0);
  29. AddInt(21, 0, 0);
  30. AddInt(22, 0, 0);
  31. AddInt(23, 0, 0);
  32. AddInt(24, 0, 0);
  33. AddInt(25, 0, 0);
  34. AddInt(26, 0, 0);
  35. AddInt(27, 0, 0);
  36. AddInt(28, 0, 0);
  37. AddInt(29, 0, 0);
  38. AddInt(30, 0, 0);
  39. AddInt(31, 0, 0);
  40. }
  41. void panic(char *message, char *code, bool halt)
  42. {
  43.       clrscr();
  44.       kprint("<SYSTEM ERROR>n");
  45.       if(halt==true)
  46.       {
  47.            kprint("A Fatal ");
  48.       }
  49. if(halt==false)
  50. {
  51.  kprint("A Non Fataln");
  52. }
  53.      kprint("Exception Has Occuredan");
  54. kprint(message);
  55. kprint("n");
  56. while (1>0);
  57.       if(halt==true)
  58.       {
  59.          kprint("n>SYSTEM HALTED<<n");
  60. asm("clin");
  61. asm("hltn"); //Parem la m鄎uina
  62.       } 
  63. else if(halt==false)
  64. {
  65.            kprint("n<Press Any Key To Continue>n");
  66. }
  67. }
  68. /*
  69.  * Exceptions
  70.  */
  71. void int_00(void)
  72. {
  73.    kprint("Zarro Division Errorn");
  74. //panic("Divide By Zero Error","#00", false);
  75. }
  76. void int_01(void)
  77. {
  78. panic("Debug Error","#DB", false);
  79. }
  80. void int_02(void)
  81. {
  82. panic("NMI Interrupt","#--", false);
  83. }
  84. void int_03(void)
  85. {
  86. panic("Breakpoint","#BP", false);
  87. }
  88. void int_04(void)
  89. {
  90. panic("Overflow","#OF", false);
  91. }
  92. void int_05(void)
  93. {
  94. panic("BOUND Range Exceeded","#BR", false);
  95. }
  96. void int_06(void)
  97. {
  98. panic("Invalid Opcode","#UD", false);
  99. }
  100. void int_07(void)
  101. {
  102. panic("Device Not Available","#NM", false);
  103. }
  104. void int_08(void)
  105. {
  106. panic("Double Fault","#DF", true);
  107. }
  108. void int_09(void)
  109. {
  110. panic("Coprocessor Segment Overrun", "#NA", false);
  111. }
  112. void int_10(void)
  113. {
  114. panic("Invalid TSS","#TS", false);
  115. }
  116. void int_11(void)
  117. {
  118. panic("Segment Not Present","#NP", false);
  119. }
  120. void int_12(void)
  121. {
  122. panic("Stack Segment Fault","#SS", false);
  123. }
  124. void int_13(void)
  125. {
  126. panic("Gneral Protection Fault","#GP", false);
  127. hangup();
  128. }
  129. void int_14(void)
  130. {
  131.    unsigned long t;
  132. unsigned long errorcode;
  133.    __asm__ volatile ("" : "=a"(t));
  134. __asm__ volatile ("" : "=b"(errorcode));
  135. panic("Page Fault","#PF", false);
  136. if (errorcode==2) {
  137.    kprint("nWrite a non present pagen");
  138. allocate_page(t);
  139. }
  140. if (errorcode==0) {
  141.    kprint("nRead a non present pagen");
  142. }
  143. }
  144. void int_16(void)
  145. {
  146. panic("FPU Floating-Point Error","#MF", false);
  147. }
  148. void int_17(void)
  149. {
  150. panic("Alignment Check","#AC", false);
  151. }
  152. void int_18(void)
  153. {
  154. panic("Machine Check","#MC", true);
  155. }
  156. void int_19(void)
  157. {
  158. panic("SIMD Floating-Point","#XF", false);
  159. }