summaryrefslogtreecommitdiff
path: root/kernel/exceptions.c
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-09 19:56:46 +0200
committerMiguel <m.i@gmx.at>2018-09-09 19:56:46 +0200
commit074490c63dd09fc941b1162f62af1985ee9576d3 (patch)
treecf20201cb188c556c8deb59d0eb6f5d145b04b72 /kernel/exceptions.c
parent4cda542d863839c5b0e026ccee297ca5ff3dd9cd (diff)
never ending cleanup
Diffstat (limited to 'kernel/exceptions.c')
-rw-r--r--kernel/exceptions.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/kernel/exceptions.c b/kernel/exceptions.c
new file mode 100644
index 0000000..3030b9c
--- /dev/null
+++ b/kernel/exceptions.c
@@ -0,0 +1,103 @@
+#include "kernel.h"
+#include "exceptions.h"
+
+#include "asm_x86.h"
+#include "smp.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);
+ klog("Selector: 0x%x",err&0b1111111111111000);
+}
+
+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));
+}
+
+void exception_handle(uint32_t esp, uint32_t irq)
+{
+ uint32_t error_code=0;
+
+ klog("EXCEPTION: apicID: 0x%08X",apicID());
+ 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:
+ kpanic("Divide by 0");
+ case 1:
+ kpanic("Single step (debugger)");
+ case 2:
+ kpanic("Non Maskable Interrupt");
+ case 3:
+ kpanic("Breakpoint (debugger)");
+ case 4:
+ kpanic("Overflow");
+ case 5:
+ kpanic("Bounds check");
+ case 6:
+ kpanic("Undefined OP Code");
+ case 7:
+ kpanic("No coprocessor");
+ case 8:
+ kpanic("Double Fault");
+ case 9:
+ kpanic("Coprocessor Segment Overrun");
+ case 10:
+ show_selector_error(error_code);
+ kpanic("Invalid TSS");
+ case 11:
+ show_selector_error(error_code);
+ kpanic("Segment Not Present");
+ case 12:
+ show_selector_error(error_code);
+ kpanic("Stack Segment Overrun");
+ case 13:
+ show_selector_error(error_code);
+ kpanic("Exception: Fault: General Protection Fault");
+ case 14:
+ show_page_fault_error(error_code);
+ kpanic("Exception: Fault: Page Fault");
+ case 15:
+ kpanic("RESERVED");
+ case 16:
+ kpanic("Coprocessor error");
+ case 17:
+ kpanic("Alignment Check");
+ case 18:
+ kpanic("Machine Check");
+ }
+}
+