-
Notifications
You must be signed in to change notification settings - Fork 1
/
isr.cpp
139 lines (135 loc) · 3.81 KB
/
isr.cpp
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
132
133
134
135
136
137
138
139
#include <stdint.h>
#include "isr.hpp"
#include "graphics.hpp"
#include "sheet.hpp"
#include "timer.hpp"
#include "heap.hpp"
#include "asmfunc.hpp"
#include "hanastd.hpp"
using namespace hanastd;
#define FOREGROUND 0xf2ff91
#define FOREGROUND_DUMP 0xdaffdb
#define BACKGROUND 0xcc000f4b
#define AUTOREBOOT_COUNTDOWN 15
//http://wiki.osdev.org/Exceptions
const char exceptions[32][32]={
"Divide by Zero",
"Debug",
"Non-maskable Interrupt",
"Breakpoint",
"Overflow",
"Bound Range Exceeded",
"Invalid Opcode",
"Device not Available",
"Double Fault",
"Coprocessor Segment Overrun",
"Invalid TSS",
"Segment Not Present",
"Stack-segment Fault",
"General Protection Fault",
"Page Fault",
"Unknown",
"x87 Floating-point Exception",
"Alignment Check",
"Machine Check",
"SIMD Floating-point Exception",
"Virtualization Exception",
"Unknown",
"Unknown",
"Unknown",
"Unknown",
"Unknown",
"Unknown",
"Unknown",
"Unknown",
"Unknown",
"Security Exception",
"Unknown",
};
void isr_handler(registers_t regs){
auto sht_panic=shtctl_alloc(screen_width,screen_height);
sht_panic->slide(0,0);
extern SHEETCTRL *shtctl;
sht_panic->updown(shtctl->top+1);
sht_panic->graphics->setcolor(BACKGROUND,true);
sht_panic->graphics->boxfill(0,0,screen_width,screen_height);
shtctl_refresh(0,0,screen_width,screen_height);
char str[64];
int y=0;
sprintf(str,"Kernel Panic!");
sht_panic->putstring(0,y,1,FOREGROUND,BACKGROUND,true,str);
y+=16;
sprintf(str,"Interrupt Number: %d",regs.int_no);
sht_panic->putstring(0,y,1,FOREGROUND,BACKGROUND,true,str);
y+=16;
sprintf(str,"Description: %s",exceptions[regs.int_no]);
sht_panic->putstring(0,y,1,FOREGROUND,BACKGROUND,true,str);
y+=16;
sprintf(str,"Error Code: %d",regs.err_code);
sht_panic->putstring(0,y,1,FOREGROUND,BACKGROUND,true,str);
y+=32;
sprintf(str,"Registers Dump:");
sht_panic->putstring(0,y,1,FOREGROUND_DUMP,BACKGROUND,true,str);
y+=16;
sprintf(str,"EIP: 0x%08X",regs.eip);
sht_panic->putstring(0,y,1,FOREGROUND_DUMP,BACKGROUND,true,str);
y+=16;
sprintf(str,"CS: 0x%08X",regs.cs);
sht_panic->putstring(0,y,1,FOREGROUND_DUMP,BACKGROUND,true,str);
y+=16;
sprintf(str,"EFLAGS: 0x%08X",regs.eflags);
sht_panic->putstring(0,y,1,FOREGROUND_DUMP,BACKGROUND,true,str);
y+=16;
sprintf(str,"EAX: 0x%08X",regs.eax);
sht_panic->putstring(0,y,1,FOREGROUND_DUMP,BACKGROUND,true,str);
y+=16;
sprintf(str,"ECX: 0x%08X",regs.ecx);
sht_panic->putstring(0,y,1,FOREGROUND_DUMP,BACKGROUND,true,str);
y+=16;
sprintf(str,"EDX: 0x%08X",regs.edx);
sht_panic->putstring(0,y,1,FOREGROUND_DUMP,BACKGROUND,true,str);
y+=16;
sprintf(str,"EBX: 0x%08X",regs.ebx);
sht_panic->putstring(0,y,1,FOREGROUND_DUMP,BACKGROUND,true,str);
y+=16;
sprintf(str,"ESP: 0x%08X",regs.esp);
sht_panic->putstring(0,y,1,FOREGROUND_DUMP,BACKGROUND,true,str);
y+=16;
sprintf(str,"EBP: 0x%08X",regs.ebp);
sht_panic->putstring(0,y,1,FOREGROUND_DUMP,BACKGROUND,true,str);
y+=16;
sprintf(str,"ESI: 0x%08X",regs.esi);
sht_panic->putstring(0,y,1,FOREGROUND_DUMP,BACKGROUND,true,str);
y+=16;
sprintf(str,"EDI: 0x%08X",regs.edi);
sht_panic->putstring(0,y,1,FOREGROUND_DUMP,BACKGROUND,true,str);
y+=16;
sprintf(str,"DS: 0x%08X",regs.ds);
sht_panic->putstring(0,y,1,FOREGROUND_DUMP,BACKGROUND,true,str);
auto fifo=(FIFO*)malloc(sizeof(FIFO));
fifo->init(128,NULL);
auto timer=timer_alloc()->init(fifo,1);
timer->set(100);
int countdown=AUTOREBOOT_COUNTDOWN;
y+=32;
sprintf(str,"Reboot in %d seconds...",countdown);
sht_panic->putstring(0,y,2,0xfff8e2,BACKGROUND,true,str);
io_sti();
for(;;){
io_cli();
if(fifo->status()==0){
io_stihlt();
}else{
io_sti();
fifo->get();
countdown--;
sprintf(str,"Reboot in %d seconds...",countdown);
sht_panic->putstring(0,y,2,0xfff8e2,BACKGROUND,true,str);
if(countdown<=0){
reboot();
}else{
timer->set(100);
}
}
}
}