summaryrefslogtreecommitdiff
path: root/kernel/exceptions.c
blob: 4ad87e8d81957d1ef006072f97003efac25fb741 (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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#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);
   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));
}

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);
}