COBE 0.1 ALPHA
|
00001 #include <panic.h> 00002 #include <stdio.h> 00003 #include <sysfunc.h> 00004 #include <multitasking.h> 00005 #include <pic.h> 00006 #include <io.h> 00007 00009 00010 void kernel_panic(int errn, cpu_regs* cpu) { 00011 00012 switch(errn) 00013 { 00014 00015 case 0: // Interrupt-Exceptions 00016 clrscr(); 00017 setcolor(0x04); 00018 kprintf("\n"); 00019 position_x = 33; kprintf("KERNEL PANIC!\n\n"); 00020 //----------Liest die Interrupt-Nummer und gibt den jeweiligen Exception-Namen aus---------- 00021 switch(cpu->interrupt) 00022 { 00023 case 0: kprintf("\n Divisions durch Null");break; 00024 case 1: kprintf("\n Debug");break; 00025 case 3: kprintf("\n Breakpoint");break; 00026 case 4: kprintf("\n Overflow");break; 00027 case 5: kprintf("\n Bound-Range");break; 00028 case 6: kprintf("\n Invalid Opcode");break; 00029 case 7: kprintf("\n Device not available");break; 00030 case 8: kprintf("\n Doube-Fault");break; 00031 case 9: kprintf("\n Coprocessor Segment Overrun");break; 00032 case 10: kprintf("\n Invalid TSS");break; 00033 case 11: kprintf("\n Segment not present");break; 00034 case 12: kprintf("\n Stack-Exception");break; 00035 case 13: kprintf("\n General Protection Fault");break; 00036 case 14: kprintf("\n Page Fault");break; 00037 case 16: kprintf("\n x87 Floating Point");break; 00038 case 17: kprintf("\n Alignment Check");break; 00039 case 18: kprintf("\n Machine Check");break; 00040 case 19: kprintf("\n SIMD Floating Point");break; 00041 default: kprintf("\n Unbekannter Interrupt");break; 00042 00043 } 00044 kprintf("\n Error-Code: "); kputx(cpu->error, 16); //----------Gibt den Error-Code aus---------- 00045 00046 //----------Bei Paging-Errors gibt es informative Fehler---------- 00047 if(cpu->interrupt == 14) { 00048 kprintf("\n Paging-Error: "); 00049 switch(cpu->error) { 00050 case 0x0: kprintf("RING0 Prozess versucht eine nicht vorhandene Page zu lesen");break; 00051 case 0x1: kprintf("RING0 Prozess löst beim Lesen einer Page ein Protection-Fault aus");break; 00052 case 0x2: kprintf("RING0 Prozess versucht in eine nicht vorhandene Page zu schreiben");break; 00053 case 0x3: kprintf("RING0 Prozess löst beim Schreiben einer Page ein \n Protection-Fault aus");break; 00054 case 0x4: kprintf("RING3 Prozess versucht eine nicht vorhandene Page zu lesen");break; 00055 case 0x5: kprintf("RING3 Prozess löst beim Lesen einer Page ein Protection-Fault aus");break; 00056 case 0x6: kprintf("RING3 Prozess versucht in eine nicht vorhandene Page zu schreiben");break; 00057 case 0x7: kprintf("RING3 Prozess löst beim Schreiben einer Page ein \n Protection-Fault aus");break; 00058 default: kprintf("Ein unbekannter Fehler ist aufgetreten!"); break; 00059 } 00060 } 00061 00062 //----------Gibt die Werte des CPU-Zustandes aus, bei kputx ist der zweite Parameter die Potenz---------- 00063 kprintf("\n Instruction-Pointer: 0x"); kputx(cpu->eip, 16); 00064 kprintf("\n Stack-Pointer: 0x"); kputx(cpu->esp, 16); 00065 kprintf("\n EFLAG-Register: 0x"); kputx(cpu->eflags, 16); kprintf(" / (BIN) "); kputx(cpu->eflags, 2); 00066 kprintf("\n\n Segmente:"); 00067 kprintf("\n (CS) CodeSegment: 0x"); kputx(cpu->cs, 16); position_x = 35; kprintf("(SS) StackSegment: 0x"); kputx(cpu->ss, 16); 00068 kprintf("\n (DS) DatenSegment: 0x"); kputx(cpu->ds, 16); position_x = 35; kprintf("(ES) ExtraSegment: 0x"); kputx(cpu->es, 16); 00069 kprintf("\n (FS) ZweckSegment: 0x"); kputx(cpu->ds, 16); position_x = 35; kprintf("(GS) ZweckSegment: 0x"); kputx(cpu->es, 16); 00070 kprintf("\n\n CPU-Register:"); 00071 kprintf("\n EAX: 0x"); kputx(cpu->eax, 16); position_x = 35; kprintf("EBX: 0x"); kputx(cpu->ebx, 16); 00072 kprintf("\n ECX: 0x"); kputx(cpu->ecx, 16); position_x = 35; kprintf("EDX: 0x"); kputx(cpu->edx, 16); 00073 kprintf("\n ESI: 0x"); kputx(cpu->esi, 16); position_x = 35; kprintf("EDI: 0x"); kputx(cpu->edi, 16); 00074 kprintf("\n EBP: 0x"); kputx(cpu->ebp, 16); 00075 setcolor(0x07); 00076 //----------Die CPU wird angehalten---------- 00077 kprintf("\n Bitte eine Taste drücken, um den Prozess zu terminieren..."); 00078 pic_mask_irqs(0x1); 00079 __asm("sti"); 00080 endgets = 0; 00081 while(endgets != 1); 00082 outb(0x64, 0xFE); 00083 break; 00084 00085 case 1: //Kein physikalischer Speicher mehr übrig 00086 clrscr(); 00087 setcolor(0x04); 00088 position_x = 33; kprintf("KERNEL PANIC!\n\n"); 00089 kprintf("No more memory available! System halted!"); 00090 setcolor(0x07); 00091 __asm("cli\nhlt"); 00092 00093 } 00094 00095 return; 00096 } 00097 00098 /* KERNEL_PANIC Error-Liste 00099 * 00100 * Error 0: Interrupt-Exceptions 00101 * Error 1: Kein physikalischer Speicher mehr übrig 00102 */