summaryrefslogtreecommitdiff
path: root/kernel/exceptions.c
blob: 0c8f6afb64c4d6b7e34909f73f2b493058c10f0e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "kernel.h"
#include "exceptions.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);
   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",apic_id());
    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");
    }
}