diff --git a/interrupt_entry.s b/interrupt_entry.s index 49428bc..903adb4 100644 --- a/interrupt_entry.s +++ b/interrupt_entry.s @@ -19,6 +19,14 @@ load_idt: lidt [idt_ptr] ret +%macro irq_handler 2 +global irq_handler_%1 +irq_handler_%1: + push dword 0 + push dword %2 + jmp common_irq_handler +%endmacro + %macro no_err_handler 1 global no_err_handler_%1 ; defined in interrupts.h no_err_handler_%1: @@ -109,3 +117,27 @@ no_err_handler 28 no_err_handler 29 no_err_handler 30 no_err_handler 31 + + +common_irq_handler: + ret + +; Remapped IRQ's for the APIC + +# starting from irq 0 -> 15 but remapped to 32 -> 47 +irq_handler 0, 32 +irq_handler 1, 33 +irq_handler 2, 34 +irq_handler 3, 35 +irq_handler 4, 36 +irq_handler 5, 37 +irq_handler 6, 38 +irq_handler 7, 39 +irq_handler 8, 40 +irq_handler 9, 41 +irq_handler 10, 42 +irq_handler 11, 43 +irq_handler 12, 44 +irq_handler 13, 45 +irq_handler 14, 46 +irq_handler 15, 47 \ No newline at end of file diff --git a/interrupts.c b/interrupts.c index 8024bf0..6c32892 100644 --- a/interrupts.c +++ b/interrupts.c @@ -65,6 +65,23 @@ extern void no_err_handler_29(); extern void no_err_handler_30(); extern void no_err_handler_31(); +// Remapped IRQ's +extern void irq_handler_0(); +extern void irq_handler_1(); +extern void irq_handler_2(); +extern void irq_handler_3(); +extern void irq_handler_4(); +extern void irq_handler_5(); +extern void irq_handler_6(); +extern void irq_handler_7(); +extern void irq_handler_8(); +extern void irq_handler_9(); +extern void irq_handler_10(); +extern void irq_handler_11(); +extern void irq_handler_12(); +extern void irq_handler_13(); +extern void irq_handler_14(); +extern void irq_handler_15(); void setup_idt_entry(u32 t_idx, u32 base, u16 sel, u8 type_attrs) { // Configuring a single given entry in the IDT table