#include #include void *irq_routines[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; void irq_install_handler(int irq, void (*handler)(struct cpu_state *r)) { irq_routines[irq] = handler; } void irq_uninstall_handler(int irq) { irq_routines[irq] = 0; } void setup_pic(int irq0, int irq8) { // Master-PIC initialisieren outb(0x20, 0x11); outb(0x21, irq0); outb(0x21, 0x04); outb(0x21, 0x01); // Slave-PIC initialisieren outb(0xa0, 0x11); outb(0xa1, irq8); outb(0xa1, 0x02); outb(0xa1, 0x01); // Alle IRQs aktivieren (demaskieren) outb(0x20, 0x0); outb(0xa0, 0x0); } void irq_init() { setup_pic(0x20, 0x28); } struct cpu_state *irq_handler(struct cpu_state *r) { struct cpu_state* new_cpu = r; if (r->intr == 0x20 && is_running) { new_cpu = schedule(r); tss[1] = (uint32_t) (new_cpu + 1); } int irq = r->intr - 32; if(irq_routines[irq] != 0) { void (*handler)(struct cpu_state*) = irq_routines[irq]; handler(r); } if (r->intr >= 0x28) { outb(0xa0, 0x20); } outb(0x20, 0x20); return new_cpu; }