#include "kernel.h" #include "exceptions.h" #include "scheduler.h" #include "syscalls.h" #include "log.h" #include "asm_x86.h" #include "smp.h" #include "apic.h" static void defklog(uint32_t esp) { klog("EXCEPTION: eip: 0x%08X",*(uint32_t *)esp); esp+=4; klog("EXCEPTION: segment: 0x%08X",*(uint16_t *)esp); esp+=4; klog("EXCPETION: eflags: 0x%08X",*(uint32_t *)esp); } static void show_selector_error(uint32_t err) { klog("Selector Error Details:"); klog("External Event: %x",err&0b1); klog("Location: 0x%x (0-GDT/1-IDT/2-LDT/3-IDT)",(err&0b110)>>1); klog("Selector: 0x%x",(err&0b1111111111111000)>>3); } static void show_page_fault_error(uint32_t error_code) { klog("Page Fault Error Details:"); klog("error_code_P (Present): %d",error_code&1?1:0); klog("error_code_W/R (Write): %d",error_code&2?1:0); klog("error_code_U/S (User): %d",error_code&4?1:0); klog("error_code_RSVD (Reserved Write) : %d",error_code&8?1:0); klog("error_code_I/D (Instruction Fetch): %d",error_code&16?1:0); klog("at addr: 0x%08X",x86_get_cr(2)); } uint32_t exception_handle(uint32_t esp, uint32_t irq) { uint32_t error_code=0; klog("EXCEPTION: apicID: 0x%08X",apic_id()); klog("EXCEPTION: task: %d",task_get_current_pid()); klog("EXCEPTION: vector nr.: %d",irq); switch(irq){ //this interrupts push also an error_code case 8: case 10: case 11: case 12: case 13: case 14: case 17: case 30: error_code = *(uint32_t *)esp; esp+=4; } klog("EXCEPTION: error_code: %d",irq); defklog(esp); switch(irq){ case 0: klog("Divide by 0"); break; case 1: klog("Single step (debugger)"); break; case 2: klog("Non Maskable Interrupt"); break; case 3: klog("Breakpoint (debugger)"); break; case 4: klog("Overflow"); break; case 5: klog("Bounds check"); break; case 6: klog("Undefined OP Code"); break; case 7: klog("No coprocessor"); break; case 8: klog("Double Fault"); break; case 9: klog("Coprocessor Segment Overrun"); break; case 10: show_selector_error(error_code); klog("Invalid TSS"); break; case 11: show_selector_error(error_code); klog("Segment Not Present"); break; case 12: show_selector_error(error_code); klog("Stack Segment Overrun"); break; case 13: show_selector_error(error_code); klog("Exception: Fault: General Protection Fault"); break; case 14: show_page_fault_error(error_code); klog("Exception: Fault: Page Fault"); break; case 15: klog("RESERVED"); break; case 16: klog("Coprocessor error"); break; case 17: klog("Alignment Check"); break; case 18: klog("Machine Check"); break; } klog("killing task in question!"); task_syscall(SYSCALL_EXIT,task_get_current_pid(),0,0); return scheduler_run(esp,0); }