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