#include "lib/print.h" #include #include "drivers/atapi/ata.h" extern void send_eoi_master(void); extern void send_eoi_slave(void); extern uint8_t read_isr_master(void); extern uint8_t read_isr_slave(void); extern uint8_t ps2_read_data(); struct registers { uint32_t edi, esi, ebp, esp_dummy, ebx, edx, ecx, eax; uint32_t int_no; uint32_t error_code; uint32_t eip, cs, eflags, useresp, ss; }; const char* err_messages[32] = { [0] = "Divide by 0", [1] = "", [8] = "", [13] = "General Protection Fault", [14] = "Page Fault", }; void common_interrupt_handler(struct registers *args) { switch (args->int_no) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 15: case 16: kprintf("CPU Error: %s", err_messages[args->int_no]); break; case 14:{ uint32_t faulting_address; asm volatile("mov %%cr2, %0" : "=r"(faulting_address)); kprintf("\n--- PAGE FAULT ---\n"); kprintf("Faulted Virtual Address: 0x%x\n", faulting_address); kprintf("Error Code: 0x%x\n", args->error_code); kprintf("Instruction Pointer: 0x%x\n", args->eip); kprintf("Caused by: %s, %s, running in %s mode\n", (args->error_code & 0x01) ? "Protection Violation" : "Page Not Present", (args->error_code & 0x02) ? "Write" : "Read", (args->error_code & 0x04) ? "User" : "Supervisor"); while(1); break; } case 32: // wake the PIT timer driver send_eoi_master(); break; case 33: { uint8_t data = ps2_read_data(); send_eoi_master(); break; } case 46: { // IDE PRIMARY kprintf("got interrupt\n"); ide_invoke_irq(); send_eoi_slave(); break; } case 47: { // IDE SLAVE kprintf("got interrupt\n"); ide_invoke_irq(); send_eoi_slave(); break; } default: kprintf("Received unhandled interrupt: %d\n", args->int_no); return; } }