.code32 .macro ISR_NOERRCODE num .global isr\num isr\num: pushl $0 pushl $\num jmp isr_common_stub .endm .macro ISR_ERRCODE num .global isr\num isr\num: pushl $\num jmp isr_common_stub .endm .extern common_interrupt_handler # interrupts.c isr_common_stub: pushal pushl %esp call common_interrupt_handler addl $4, %esp popal addl $8, %esp iret .extern idtr .global load_idt load_idt: lidt idtr ret ISR_NOERRCODE 0 # Divide by Zero ISR_NOERRCODE 1 # Debug ISR_ERRCODE 8 # Double Fault (Has Error Code!) ISR_ERRCODE 13 # General Protection Fault (Has Error Code!) ISR_ERRCODE 14 # Page Fault (Has Error Code!) // This is a special case so we need to handle it for task switching .global isr32 .extern switch_context # scheduler.c .extern send_eoi_master # drivers/pic/pic.S isr32: cli pushal xorl %eax, %eax movw %ds, %ax pushl %eax movw $0x10, %ax # Load Kernel Data Segment descriptor movw %ax, %ds movw %ax, %es movw %ax, %fs movw %ax, %gs call send_eoi_master pushl %esp call switch_context movl %eax, %esp popl %eax movw %ax, %ds movw %ax, %es movw %ax, %fs movw %ax, %gs popal sti iret ISR_NOERRCODE 33 # IRQ1 - Keyboard ISR_NOERRCODE 46 # IRQ14 ISR_NOERRCODE 47 # IRQ15