00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "includes.h"
00010
00011 void InterruptInit(void){
00012 InterruptCpuIntHandlerSet(0,InterruptCpuInt0Handler);
00013 InterruptCpuIntHandlerSet(1,InterruptCpuInt1Handler);
00014 InterruptCpuIntHandlerSet(2,InterruptCpuInt2Handler);
00015 InterruptCpuIntHandlerSet(3,InterruptCpuInt3Handler);
00016 InterruptCpuIntHandlerSet(4,InterruptCpuInt4Handler);
00017 InterruptCpuIntHandlerSet(5,InterruptCpuInt5Handler);
00018 InterruptCpuIntHandlerSet(6,InterruptCpuInt6Handler);
00019 InterruptCpuIntHandlerSet(7,InterruptCpuInt7Handler);
00020 InterruptCpuIntHandlerSet(8,InterruptCpuInt8Handler);
00021 InterruptCpuIntHandlerSet(9,InterruptCpuInt9Handler);
00022 InterruptCpuIntHandlerSet(10,InterruptCpuInt10Handler);
00023 InterruptCpuIntHandlerSet(11,InterruptCpuInt11Handler);
00024 InterruptCpuIntHandlerSet(12,InterruptCpuInt12Handler);
00025 InterruptCpuIntHandlerSet(13,InterruptCpuInt13Handler);
00026 InterruptCpuIntHandlerSet(14,InterruptCpuInt14Handler);
00027 InterruptCpuIntHandlerSet(15,InterruptCpuInt15Handler);
00028 InterruptCpuIntHandlerSet(16,InterruptCpuInt16Handler);
00029 InterruptCpuIntHandlerSet(17,InterruptCpuInt17Handler);
00030 InterruptCpuIntHandlerSet(18,InterruptCpuInt18Handler);
00031 InterruptCpuIntHandlerSet(19,InterruptCpuInt19Handler);
00032
00033 InterruptIrqHandlerSet(0,InterruptIrq0Handler);
00034 InterruptIrqHandlerSet(1,InterruptIrq1Handler);
00035 InterruptIrqHandlerSet(2,InterruptIrq2Handler);
00036 InterruptIrqHandlerSet(3,InterruptIrq3Handler);
00037 InterruptIrqHandlerSet(4,InterruptIrq4Handler);
00038 InterruptIrqHandlerSet(5,InterruptIrq5Handler);
00039 InterruptIrqHandlerSet(6,InterruptIrq6Handler);
00040 InterruptIrqHandlerSet(7,InterruptIrq7Handler);
00041 InterruptIrqHandlerSet(8,InterruptIrq8Handler);
00042 InterruptIrqHandlerSet(9,InterruptIrq9Handler);
00043 InterruptIrqHandlerSet(10,InterruptIrq10Handler);
00044 InterruptIrqHandlerSet(11,InterruptIrq11Handler);
00045 InterruptIrqHandlerSet(12,InterruptIrq12Handler);
00046 InterruptIrqHandlerSet(13,InterruptIrq13Handler);
00047 InterruptIrqHandlerSet(14,InterruptIrq14Handler);
00048 InterruptIrqHandlerSet(15,InterruptIrq15Handler);
00049
00050 InterruptSoftwareIntHandlerSet(0,InterruptSoftwareInt48Handler);
00051 }
00052
00053 void InterruptCpuIntHandlerSet(U8 IntNumber,INT_HANDLER IntHandler){
00054 if(IntNumber>=20) return;
00055 CpuIntHandlersTable[IntNumber]=IntHandler;
00056 }
00057
00058 void InterruptIrqHandlerSet(U8 IrqNumber,INT_HANDLER IrqHandler){
00059 if(IrqNumber>=16) return;
00060 IrqHandlersTable[IrqNumber]=IrqHandler;
00061 }
00062
00063 void InterruptSoftwareIntHandlerSet(U8 IntNumber,INT_HANDLER IntHandler){
00064 if(IntNumber>=1) return;
00065 SoftwareIntHandlersTable[IntNumber]=IntHandler;
00066 }
00067
00068 void InterruptIdtEntrySet(U8 IntNumber,U8 IdtType,INT_HANDLER Handler,U8 IdtDpl){
00069 GATE* pGate;
00070 U32 Base;
00071
00072 pGate=&IdtTable[IntNumber];
00073 Base=(U32)Handler;
00074 pGate->OffsetLow=Base&0x0000ffff;
00075 pGate->Selector=IDT_SELECTOR;
00076 pGate->Dcount=0x00;
00077 pGate->Attribute=(IDT_P<<7)|(IdtDpl<<5)|IdtType;
00078 pGate->OffsetHigh=(Base>>16)&0x0000ffff;
00079 }
00080
00081 void InterruptIdtTableFill(void){
00082 InterruptIdtEntrySet(INT_CPU_DIVIDE_BY_0, INT_GATE_32,CpuIntExecutorTable[0],DPL_3);
00083 InterruptIdtEntrySet(INT_CPU_SINGLE_STEP, INT_GATE_32,CpuIntExecutorTable[1],DPL_3);
00084 InterruptIdtEntrySet(INT_CPU_NMI, INT_GATE_32,CpuIntExecutorTable[2],DPL_3);
00085 InterruptIdtEntrySet(INT_CPU_BREAKPOINT, INT_GATE_32,CpuIntExecutorTable[3],DPL_3);
00086 InterruptIdtEntrySet(INT_CPU_OVERFLOW, INT_GATE_32,CpuIntExecutorTable[4],DPL_3);
00087 InterruptIdtEntrySet(INT_CPU_BOUND, INT_GATE_32,CpuIntExecutorTable[5],DPL_3);
00088 InterruptIdtEntrySet(INT_CPU_INVALID_OPCODE, INT_GATE_32,CpuIntExecutorTable[6],DPL_3);
00089 InterruptIdtEntrySet(INT_CPU_NO_FPU, INT_GATE_32,CpuIntExecutorTable[7],DPL_3);
00090 InterruptIdtEntrySet(INT_CPU_DOUBLE_FAULT, INT_GATE_32,CpuIntExecutorTable[8],DPL_3);
00091 InterruptIdtEntrySet(INT_CPU_FPU_SEGMENT_OVERFLOW, INT_GATE_32,CpuIntExecutorTable[9],DPL_3);
00092 InterruptIdtEntrySet(INT_CPU_INVAL_TSS, INT_GATE_32,CpuIntExecutorTable[10],DPL_3);
00093 InterruptIdtEntrySet(INT_CPU_INVALID_SEGMENT, INT_GATE_32,CpuIntExecutorTable[11],DPL_3);
00094 InterruptIdtEntrySet(INT_CPU_STACK_FAULT, INT_GATE_32,CpuIntExecutorTable[12],DPL_3);
00095 InterruptIdtEntrySet(INT_CPU_PROTECTION, INT_GATE_32,CpuIntExecutorTable[13],DPL_3);
00096 InterruptIdtEntrySet(INT_CPU_PAGE_FAULT, INT_GATE_32,CpuIntExecutorTable[14],DPL_3);
00097
00098 InterruptIdtEntrySet(INT_CPU_FPU_ERROR, INT_GATE_32,CpuIntExecutorTable[16],DPL_3);
00099 InterruptIdtEntrySet(INT_CPU_ALIGNMENT_ERROR, INT_GATE_32,CpuIntExecutorTable[17],DPL_3);
00100 InterruptIdtEntrySet(INT_CPU_MACHINE_ERROR, INT_GATE_32,CpuIntExecutorTable[18],DPL_3);
00101 InterruptIdtEntrySet(INT_CPU_SIMD_ERROR, INT_GATE_32,CpuIntExecutorTable[19],DPL_3);
00102
00103 InterruptIdtEntrySet(INT_VECTOR_IRQ0+0, INT_GATE_32,IrqExecutorTable[0],DPL_3);
00104 InterruptIdtEntrySet(INT_VECTOR_IRQ0+1, INT_GATE_32,IrqExecutorTable[1],DPL_3);
00105 InterruptIdtEntrySet(INT_VECTOR_IRQ0+2, INT_GATE_32,IrqExecutorTable[2],DPL_3);
00106 InterruptIdtEntrySet(INT_VECTOR_IRQ0+3, INT_GATE_32,IrqExecutorTable[3],DPL_3);
00107 InterruptIdtEntrySet(INT_VECTOR_IRQ0+4, INT_GATE_32,IrqExecutorTable[4],DPL_3);
00108 InterruptIdtEntrySet(INT_VECTOR_IRQ0+5, INT_GATE_32,IrqExecutorTable[5],DPL_3);
00109 InterruptIdtEntrySet(INT_VECTOR_IRQ0+6, INT_GATE_32,IrqExecutorTable[6],DPL_3);
00110 InterruptIdtEntrySet(INT_VECTOR_IRQ0+7, INT_GATE_32,IrqExecutorTable[7],DPL_3);
00111 InterruptIdtEntrySet(INT_VECTOR_IRQ8+0, INT_GATE_32,IrqExecutorTable[8],DPL_3);
00112 InterruptIdtEntrySet(INT_VECTOR_IRQ8+1, INT_GATE_32,IrqExecutorTable[9],DPL_3);
00113 InterruptIdtEntrySet(INT_VECTOR_IRQ8+2, INT_GATE_32,IrqExecutorTable[10],DPL_3);
00114 InterruptIdtEntrySet(INT_VECTOR_IRQ8+3, INT_GATE_32,IrqExecutorTable[11],DPL_3);
00115 InterruptIdtEntrySet(INT_VECTOR_IRQ8+4, INT_GATE_32,IrqExecutorTable[12],DPL_3);
00116 InterruptIdtEntrySet(INT_VECTOR_IRQ8+5, INT_GATE_32,IrqExecutorTable[13],DPL_3);
00117 InterruptIdtEntrySet(INT_VECTOR_IRQ8+6, INT_GATE_32,IrqExecutorTable[14],DPL_3);
00118 InterruptIdtEntrySet(INT_VECTOR_IRQ8+7, INT_GATE_32,IrqExecutorTable[15],DPL_3);
00119
00120 InterruptIdtEntrySet(INT_VECTOR_OS_CSW, INT_GATE_32,SoftwareIntExecutorTable[0],DPL_3);
00121 }
00122
00123 void InterruptIrq0Handler(void){
00124 }
00125
00126 void InterruptIrq1Handler(void){
00127 }
00128
00129 void InterruptIrq2Handler(void){
00130 }
00131
00132 void InterruptIrq3Handler(void){
00133 }
00134
00135 void InterruptIrq4Handler(void){
00136 }
00137
00138 void InterruptIrq5Handler(void){
00139 }
00140
00141 void InterruptIrq6Handler(void){
00142 }
00143
00144 void InterruptIrq7Handler(void){
00145 }
00146
00147 void InterruptIrq8Handler(void){
00148 }
00149
00150 void InterruptIrq9Handler(void){
00151 }
00152
00153 void InterruptIrq10Handler(void){
00154 }
00155
00156 void InterruptIrq11Handler(void){
00157 }
00158
00159 void InterruptIrq12Handler(void){
00160 }
00161
00162 void InterruptIrq13Handler(void){
00163 }
00164
00165 void InterruptIrq14Handler(void){
00166 }
00167
00168 void InterruptIrq15Handler(void){
00169 }
00170
00171 void InterruptCpuInt0Handler(void){
00172 SystemCgaInit();
00173 SystemCgaStringPrint("Cpu fault 0");
00174 SystemCgaStringPrint("\nFAULT TYPE: DIVIDE BY 0");
00175 SystemCgaStringPrint("\nSYSTEM HALT");
00176 SystemHalt();
00177 }
00178 void InterruptCpuInt1Handler(void){
00179 SystemCgaInit();
00180 SystemCgaStringPrint("Cpu fault 1");
00181 SystemCgaStringPrint("\nFAULT TYPE: SINGLE STEP");
00182 SystemCgaStringPrint("\nSINGLE STEP IS FOR DEBUG USE.");
00183 SystemCgaStringPrint("\nSYSTEM HALT");
00184 SystemHalt();
00185 }
00186 void InterruptCpuInt2Handler(void){
00187 SystemCgaInit();
00188 SystemCgaStringPrint("Cpu fault 2");
00189 SystemCgaStringPrint("\nFAULT TYPE: NON MASKABLE INTERRUPT");
00190 SystemCgaStringPrint("\nNMI IS NOT SUPPORTED.");
00191 SystemCgaStringPrint("\nSYSTEM HALT");
00192 SystemHalt();
00193 }
00194 void InterruptCpuInt3Handler(void){
00195 SystemCgaInit();
00196 SystemCgaStringPrint("Cpu fault 3");
00197 SystemCgaStringPrint("\nFAULT TYPE: BREAK POINT");
00198 SystemCgaStringPrint("\nBREAK POINT IS FOR DEBUG USE.");
00199 SystemCgaStringPrint("\nSYSTEM HALT");
00200 SystemHalt();
00201 }
00202 void InterruptCpuInt4Handler(void){
00203 SystemCgaInit();
00204 SystemCgaStringPrint("Cpu fault 4");
00205 SystemCgaStringPrint("\nFAULT TYPE: OVERFLOW");
00206 SystemCgaStringPrint("\nSYSTEM HALT");
00207 SystemHalt();
00208 }
00209 void InterruptCpuInt5Handler(void){
00210 SystemCgaInit();
00211 SystemCgaStringPrint("Cpu fault 5");
00212 SystemCgaStringPrint("\nFAULT TYPE: BOUND");
00213 SystemCgaStringPrint("\nSYSTEM HALT");
00214 SystemHalt();
00215 }
00216 void InterruptCpuInt6Handler(void){
00217 SystemCgaInit();
00218 SystemCgaStringPrint("Cpu fault 6");
00219 SystemCgaStringPrint("\nFAULT TYPE: INVALID OP CODE");
00220 SystemCgaStringPrint("\nSYSTEM HALT");
00221 SystemHalt();
00222 }
00223 void InterruptCpuInt7Handler(void){
00224 SystemCgaInit();
00225 SystemCgaStringPrint("Cpu fault 7");
00226 SystemCgaStringPrint("\nFAULT TYPE: NO FPU");
00227 SystemCgaStringPrint("\nSYSTEM HALT");
00228 SystemHalt();
00229 }
00230 void InterruptCpuInt8Handler(void){
00231 SystemCgaInit();
00232 SystemCgaStringPrint("Cpu fault 8");
00233 SystemCgaStringPrint("\nFAULT TYPE: DOUBLE FAULT");
00234 SystemCgaStringPrint("\nSYSTEM HALT");
00235 SystemHalt();
00236 }
00237 void InterruptCpuInt9Handler(void){
00238 SystemCgaInit();
00239 SystemCgaStringPrint("Cpu fault 9");
00240 SystemCgaStringPrint("\nFAULT TYPE: FPU SEGMENT OVERFLOW");
00241 SystemCgaStringPrint("\nSYSTEM HALT");
00242 SystemHalt();
00243 }
00244 void InterruptCpuInt10Handler(void){
00245 SystemCgaInit();
00246 SystemCgaStringPrint("Cpu fault 10");
00247 SystemCgaStringPrint("\nFAULT TYPE: INVALID TSS");
00248 SystemCgaStringPrint("\nSYSTEM HALT");
00249 SystemHalt();
00250 }
00251 void InterruptCpuInt11Handler(void){
00252 SystemCgaInit();
00253 SystemCgaStringPrint("Cpu fault 11");
00254 SystemCgaStringPrint("\nFAULT TYPE: SEGMENT NOT PRESENT");
00255 SystemCgaStringPrint("\nSYSTEM HALT");
00256 SystemHalt();
00257 }
00258 void InterruptCpuInt12Handler(void){
00259 SystemCgaInit();
00260 SystemCgaStringPrint("Cpu fault 12");
00261 SystemCgaStringPrint("\nFAULT TYPE: STACK SEGMENT OVERFLOW");
00262 SystemCgaStringPrint("\nSYSTEM HALT");
00263 SystemHalt();
00264 }
00265 void InterruptCpuInt13Handler(void){
00266 SystemCgaInit();
00267 SystemCgaStringPrint("Cpu fault 13");
00268 SystemCgaStringPrint("\nFAULT TYPE: GENERAL PROTECTION");
00269 SystemCgaStringPrint("\nSYSTEM HALT");
00270 SystemHalt();
00271 }
00272 void InterruptCpuInt14Handler(void){
00273 SystemCgaInit();
00274 SystemCgaStringPrint("Cpu fault 14");
00275 SystemCgaStringPrint("\nFAULT TYPE: PAGE FAULT");
00276 SystemCgaStringPrint("\nSYSTEM HALT");
00277 SystemHalt();
00278 }
00279 void InterruptCpuInt15Handler(void){
00280 SystemCgaInit();
00281 SystemCgaStringPrint("Cpu fault 15");
00282 SystemCgaStringPrint("\nFAULT TYPE: UNDEFINE.");
00283 SystemCgaStringPrint("\nTHIS FAULT TYPE SHOULD NOT HAPPEN ,BECAUSE IT IS UNDEFINED.");
00284 SystemCgaStringPrint("\nSYSTEM HALT");
00285 SystemHalt();
00286 }
00287 void InterruptCpuInt16Handler(void){
00288 SystemCgaInit();
00289 SystemCgaStringPrint("Cpu fault 16");
00290 SystemCgaStringPrint("\nFAULT TYPE: FPU ERROR");
00291 SystemCgaStringPrint("\nSYSTEM HALT");
00292 SystemHalt();
00293 }
00294 void InterruptCpuInt17Handler(void){
00295 SystemCgaInit();
00296 SystemCgaStringPrint("Cpu fault 17");
00297 SystemCgaStringPrint("\nFAULT TYPE: ALIGNMENT ERROR");
00298 SystemCgaStringPrint("\nSYSTEM HALT");
00299 SystemHalt();
00300 }
00301 void InterruptCpuInt18Handler(void){
00302 SystemCgaInit();
00303 SystemCgaStringPrint("Cpu fault 18");
00304 SystemCgaStringPrint("\nFAULT TYPE: MACHINE ERROR");
00305 SystemCgaStringPrint("\nSYSTEM HALT");
00306 SystemHalt();
00307 }
00308 void InterruptCpuInt19Handler(void){
00309 SystemCgaInit();
00310 SystemCgaStringPrint("Cpu fault 19");
00311 SystemCgaStringPrint("\nFAULT TYPE: SIMD ERROR");
00312 SystemCgaStringPrint("\nSYSTEM HALT");
00313 SystemHalt();
00314 }
00315 void InterruptSoftwareInt48Handler(void){
00316 OsSchedulerNextTaskFind();
00317 }