git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
update project structures
[lunaix-os.git]
/
lunaix-os
/
kernel
/
asm
/
x86
/
interrupts.c
diff --git
a/lunaix-os/kernel/asm/x86/interrupts.c
b/lunaix-os/kernel/asm/x86/interrupts.c
index 8dfb23bf32a176e33a935b3bd455c834360fe189..c79ed07300e12492d01e8c97ed6a4383543c2ca2 100644
(file)
--- a/
lunaix-os/kernel/asm/x86/interrupts.c
+++ b/
lunaix-os/kernel/asm/x86/interrupts.c
@@
-1,8
+1,11
@@
#include <arch/x86/interrupts.h>
#include <arch/x86/interrupts.h>
-#include <
lunaix/tty/tty
.h>
+#include <
hal/cpu
.h>
#include <libc/stdio.h>
#include <libc/stdio.h>
+#include <lunaix/tty/tty.h>
-void panic_msg(const char* msg) {
+void
+panic_msg(const char* msg)
+{
tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_RED);
tty_clear_line(10);
tty_clear_line(11);
tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_RED);
tty_clear_line(10);
tty_clear_line(11);
@@
-11,32
+14,47
@@
void panic_msg(const char* msg) {
printf(" %s", msg);
}
printf(" %s", msg);
}
-void panic (const char* msg, isr_param* param) {
+void
+panic(const char* msg, isr_param* param)
+{
char buf[1024];
char buf[1024];
- sprintf(buf, "INT %u: (%x) [%p: %p] %s", param->vector, param->err_code, param->cs, param->eip, msg);
+ sprintf(buf,
+ "INT %u: (%x) [%p: %p] %s",
+ param->vector,
+ param->err_code,
+ param->cs,
+ param->eip,
+ msg);
panic_msg(buf);
panic_msg(buf);
- while(1);
+ while (1)
+ ;
}
}
-void
-interrupt_handler(isr_param* param)
{
- switch (param->vector)
- {
+void
+interrupt_handler(isr_param* param)
+{
+
switch (param->vector)
{
case 0:
panic("Division by 0", param);
case 0:
panic("Division by 0", param);
- break;
// never reach
+ break; // never reach
case FAULT_GENERAL_PROTECTION:
panic("General Protection", param);
case FAULT_GENERAL_PROTECTION:
panic("General Protection", param);
- break;
// never reach
+ break; // never reach
case FAULT_PAGE_FAULT:
case FAULT_PAGE_FAULT:
- panic("Page Fault", param);
- break; // never reach
+ void* pg_fault_ptr = cpu_rcr2();
+ if (pg_fault_ptr) {
+ panic("Page Fault", param);
+ } else {
+ panic("Null pointer reference", param);
+ }
+ break; // never reach
case LUNAIX_SYS_PANIC:
panic_msg((char*)(param->registers.edi));
case LUNAIX_SYS_PANIC:
panic_msg((char*)(param->registers.edi));
- while(1);
- break; // never reach
+ while (1)
+ ;
+ break; // never reach
default:
panic("Unknown Interrupt", param);
default:
panic("Unknown Interrupt", param);
- break;
// never reach
+ break; // never reach
}
}
\ No newline at end of file
}
}
\ No newline at end of file