summaryrefslogtreecommitdiff
path: root/kernel/interrupts.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/interrupts.c')
-rw-r--r--kernel/interrupts.c50
1 files changed, 31 insertions, 19 deletions
diff --git a/kernel/interrupts.c b/kernel/interrupts.c
index 51d8f8e..a7e021c 100644
--- a/kernel/interrupts.c
+++ b/kernel/interrupts.c
@@ -7,6 +7,18 @@
#include "console.h"
#include "x86.h"
+void errlog(uint32_t error_code)
+{
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"error_code: 0x%08X",error_code);
+}
+
+void deflog(uint32_t eip, uint16_t cs, uint32_t flags)
+{
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"eip: 0x%08X",eip);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"segment: 0x%08X",cs);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"eflags: 0x%08X",flags);
+}
+
void int_install_ir(int irq, uint16_t flags, uint16_t sel, void *addr);
//void mouse_handler();
@@ -36,17 +48,6 @@ void exception_handle()
panic(FOOLOS_MODULE_NAME,"exception interrupt");
}
-void exception_handle_14(uint32_t error_code)
-{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"error_code: 0x%08X",error_code);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"error_code_P: %d",error_code&1);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"error_code_W/R: %d",error_code&2);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"error_code_U/S: %d",error_code&4);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"error_code_RSVD: %d",error_code&8);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"error_code_I/D: %d",error_code&16);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"at addr: 0x%08X",x86_get_cr2());
- panic(FOOLOS_MODULE_NAME,"page fault !");
-}
void int_default()
{
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"default handler");
@@ -76,15 +77,26 @@ void exception_handle_10(){ panic(FOOLOS_MODULE_NAME,"Invalid TSS"); }
void exception_handle_11(){ panic(FOOLOS_MODULE_NAME,"Segment Not Present"); }
void exception_handle_12(){ panic(FOOLOS_MODULE_NAME,"Stack Segment Overrun"); }
-void exception_handle_13()
+void exception_handle_13(uint32_t error_code,uint32_t eip,uint16_t cs,uint16_t unused, uint32_t flags)
{
-
- uint32_t err;
- asm("pop %eax"); // get Error Code
- asm ("mov %%eax, %0":"=r"(err));
- show_error(err);
+ errlog(error_code);
+ deflog(eip,cs,flags);
+
+ panic(FOOLOS_MODULE_NAME,"Exception: Fault: General Protection Fault");
+}
- panic(FOOLOS_MODULE_NAME,"General Protection Fault");
+void exception_handle_14(uint32_t error_code,uint32_t eip,uint16_t cs,uint16_t unused, uint32_t flags)
+{
+ errlog(error_code);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"error_code_P: %d",error_code&1?1:0);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"error_code_W/R: %d",error_code&2?1:0);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"error_code_U/S: %d",error_code&4?1:0);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"error_code_RSVD: %d",error_code&8?1:0);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"error_code_I/D: %d",error_code&16?1:0);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"at addr: 0x%08X",x86_get_cr2());
+
+ deflog(eip,cs,flags);
+ panic(FOOLOS_MODULE_NAME,"Exception: Fault: Page Fault");
}
void exception_handle_15(){ panic(FOOLOS_MODULE_NAME,"Unassigned"); }
@@ -158,7 +170,7 @@ void int_init(uint16_t sel)
// int_install_ir(44, 0b10001110, 0x08,&mouse_handler);
//system calls
- int_install_ir(0x80, 0b10001110, 0x08,&int_syscall_handler);
+ int_install_ir(0x80, 0b11101110, 0x08,&int_syscall_handler);
int_install();