#include #include #include #include #include #define MAX_IRQ_HANDLERS 128 /* the maximum number of irq handlers */ typedef struct { uint32_t irq_no; irq_func_t func; } irq_handler_t; uint32_t num_irq_handlers = 0; irq_handler_t handler_list[MAX_IRQ_HANDLERS]; static volatile uint32_t num_irqs_missed = 0; void irq_init(void) { for (int i = 0; i < MAX_IRQ_HANDLERS; i++) { handler_list[i].irq_no = 0; handler_list[i].func = NULL; } set_irq_handler(0, (irq_func_t) pit_handler); set_irq_handler(1, (irq_func_t) ps2_keyboard_handler); } void irq_handler(uint32_t irq, registers_t* regs) { uint8_t funcs_called = 0; if (num_irq_handlers > 0) { for (unsigned int i = 0; i < num_irq_handlers; i++) { if (handler_list[i].irq_no == irq && handler_list[i].func != NULL) { handler_list[i].func(regs); funcs_called++; /* PIC IRQ acknowledgement happens in idt.c */ } } } if (funcs_called == 0) { num_irqs_missed++; } } uint32_t get_interrupts_missed(void) { return num_irqs_missed; } void set_irq_handler(uint32_t num, irq_func_t handler) { if (num < MAX_IRQ_HANDLERS) { handler_list[num].irq_no = num; handler_list[num].func = handler; num_irq_handlers++; } }