; Dispatching to our interrupt handler code from assembly because some of this is ; enourmous pain in C ; Save the register state ; call the C handler ; executes iret(expects the stack to look like struct stack_state) ; If the interrupt we need to handle doesn't produce an error code then must provide a 0 ; for consistency extern interrupt_handler extern cpu_reg_state extern stack_state extern idt_ptr global load_idt 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: push dword 0 push dword %1 jmp common_int_handler %endmacro ; deals with the intterrupts that do give us an error code %macro err_code_handler 1 global err_code_handler_%1 err_code_handler_%1: push dword %1 jmp common_int_handler %endmacro extern interrupt_handler ; external handler (interrupts.c) common_int_handler: ; save thigns before do our C-call pushad ;push eax ecx edx ebx ;push esp ebp esi edi push ds push es push fs push gs ; load the kernel segment descriptor mov ax, 0x10 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov eax, esp ; pushing the stack into the next call push eax mov eax, interrupt_handler call eax ; preserve the eip register past this call ; segments pop eax pop gs pop fs pop es pop ds popad add esp, 8 ; special instruction which lets us jump back to code ; which was previously interrupted iret no_err_handler 0 no_err_handler 1 no_err_handler 2 no_err_handler 3 no_err_handler 4 no_err_handler 5 no_err_handler 6 no_err_handler 7 err_code_handler 8 no_err_handler 9 err_code_handler 10 err_code_handler 11 err_code_handler 12 err_code_handler 13 err_code_handler 14 no_err_handler 15 no_err_handler 16 no_err_handler 17 no_err_handler 18 no_err_handler 19 no_err_handler 20 no_err_handler 21 no_err_handler 22 no_err_handler 23 no_err_handler 24 no_err_handler 25 no_err_handler 26 no_err_handler 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