swissChili | 9b3584b | 2021-02-18 13:57:27 -0800 | [diff] [blame^] | 1 | #include "pic.h" |
| 2 | #include "io.h" |
| 3 | |
| 4 | void (* interrupt_handlers[256])(struct registers); |
| 5 | |
| 6 | void pic_send_eoi(uchar interrupt) |
| 7 | { |
| 8 | if (interrupt >= 40) |
| 9 | outb(PIC2_COMMAND, PIC_EOI); |
| 10 | outb(PIC1_COMMAND, PIC_EOI); |
| 11 | } |
| 12 | |
| 13 | void irq_handler(struct registers regs) |
| 14 | { |
| 15 | pic_send_eoi(regs.interrupt_number); |
| 16 | |
| 17 | if (interrupt_handlers[regs.interrupt_number]) |
| 18 | interrupt_handlers[regs.interrupt_number](regs); |
| 19 | } |
| 20 | |
| 21 | void add_interrupt_handler(uchar interrupt, void (* handler)(struct registers)) |
| 22 | { |
| 23 | interrupt_handlers[interrupt] = handler; |
| 24 | } |