COBE 0.1 ALPHA

D:/COBE-Packet/cobe/system/panic.c

gehe zur Dokumentation dieser Datei
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  */
 Alle Datenstrukturen Dateien Funktionen Variablen Typdefinitionen Makrodefinitionen