#include "isr.h" #include "pic.h" #include /* Forward declaration for kernel panic or similar */ void offset_print(const char *str); void print_hex(uint32_t val); /* Exception messages */ char *exception_messages[] = { "Division By Zero", "Debug", "Non Maskable Interrupt", "Breakpoint", "Into Detected Overflow", "Out of Bounds", "Invalid Opcode", "No Coprocessor", "Double Fault", "Coprocessor Segment Overrun", "Bad TSS", "Segment Not Present", "Stack Fault", "General Protection Fault", "Page Fault", "Unknown Interrupt", "Coprocessor Fault", "Alignment Check", "Machine Check", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved" }; void isr_handler(registers_t *regs) { // If it's a hardware interrupt (IRQ), we must acknowledge it if (regs->int_no >= 32 && regs->int_no < 48) { // Send EOI to PIC (IRQ number 0-15) pic_send_eoi(regs->int_no - 32); // Here we would call the registered handler for this IRQ // For now, just print something for the timer tick so we know it works, // but limit it to avoid flooding the log. if (regs->int_no == 32) { // Timer tick - do nothing verbose // offset_print("."); } else if (regs->int_no == 33) { // Keyboard offset_print("Keyboard IRQ!\n"); } return; } offset_print("received interrupt: "); print_hex(regs->int_no); offset_print("\n"); if (regs->int_no < 32) { offset_print(exception_messages[regs->int_no]); offset_print(" Exception. System Halted!\n"); for (;;) ; } }