I mentioned (a hint) in my previous comment about irq_install routine? You happened to map most of the IRQs to a single vector.
Code: Select all
idt_set_gate(32, (unsigned)irq0, 0x08, 0x8E);
idt_set_gate(32, (unsigned)irq1, 0x08, 0x8E);
idt_set_gate(32, (unsigned)irq2, 0x08, 0x8E);
idt_set_gate(32, (unsigned)irq3, 0x08, 0x8E);
idt_set_gate(32, (unsigned)irq4, 0x08, 0x8E);
idt_set_gate(32, (unsigned)irq5, 0x08, 0x8E);
idt_set_gate(32, (unsigned)irq6, 0x08, 0x8E);
idt_set_gate(32, (unsigned)irq7, 0x08, 0x8E);
idt_set_gate(32, (unsigned)irq8, 0x08, 0x8E);
idt_set_gate(32, (unsigned)irq9, 0x08, 0x8E);
idt_set_gate(32, (unsigned)irq10, 0x08, 0x8E);
idt_set_gate(32, (unsigned)irq11, 0x08, 0x8E);
idt_set_gate(32, (unsigned)irq12, 0x08, 0x8E);
idt_set_gate(32, (unsigned)irq13, 0x08, 0x8E);
idt_set_gate(32, (unsigned)irq14, 0x08, 0x8E);
idt_set_gate(47, (unsigned)irq15, 0x08, 0x8E);
Notice how the first parameter is all 32 except for the last one. IMHO They should be numbered 32 through 47. You've effectively overwritten entry 32 many times leaving most interrupts with no valid interrupt handler. Effectively iRQ1 through IRQ14 will fault when they occur. IRQ1 is the keyboard handler. IRQ0 and IRQ15 won't fault because they were actually initialised.