diff options
Diffstat (limited to 'kernel/interrupts.c')
| -rw-r--r-- | kernel/interrupts.c | 50 |
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(); |
