]> git.dujemihanovic.xyz Git - nameless-os.git/blob - kernel/arch/x86/irq/interrupt.c
kernel: Huge refactoring of tty driver
[nameless-os.git] / kernel / arch / x86 / irq / interrupt.c
1 #include <irq/idt.h>
2 #include <irq/interrupt.h>
3 #include <kprint.h>
4 #include <stddef.h>
5 #include <irq/i8259a.h>
6
7 /* This table will hold pointers to our interrupt handlers. */
8 static int (*int_handler_table[256])(struct interrupt_frame *);
9
10 void int_handler(struct interrupt_frame *frame)
11 {
12 int interrupt = frame->interrupt;
13 if (int_handler_table[interrupt] == NULL) {
14 kprint("WARNING: Unhandled interrupt ", VGA_YELLOW, VGA_BLACK);
15 kprintb(interrupt, 1);
16 kprint(" occurred!\n", VGA_YELLOW, VGA_BLACK);
17 } else {
18 int ret = (*int_handler_table[interrupt])(frame);
19 if (ret) {
20 kprint("WARNING: Error while handling interrupt ", VGA_YELLOW, VGA_BLACK);
21 kprintb(interrupt, 1);
22 kprint("!\n", VGA_YELLOW, VGA_BLACK);
23 }
24 }
25 if (interrupt >= 0x20) {
26 pic_send_eoi(interrupt - 0x20);
27 }
28 }
29
30 int register_interrupt(int irq, int (*handler)(struct interrupt_frame *))
31 {
32 int_handler_table[irq] = handler;
33 if (irq >= 32 && irq < 48) {
34 pic_unmask(irq-32);
35 }
36 return 0;
37 }