/* Copyright (C) 2021,2022 fef . All rights reserved. */ #include #include #include .data /* void (*irq_table[NUM_IRQ])(void); */ .extern irq_table /* there is probably a fancy CPU feature for this, but idk */ L_DATA(irq_count) .byte 0 L_END(irq_count) .text /* bool in_irq(void); */ ENTRY(in_irq) xor %eax, %eax cmpb $0, irq_count setne %al ret END(in_irq) .section .text.isr .macro gen_irq num ENTRY(_x86_isr_irq\num ) push %eax push %ecx push %edx incb irq_count #if CFG_DEBUG_IRQ pushl $\num #endif call *(irq_table + \num * 4) #if CFG_DEBUG_IRQ add $4, %esp #endif jmp leave_irq END(_x86_isr_irq\num ) .endm gen_irq 0 gen_irq 1 /* IRQ 2 is for cascading from PIC2 to PIC1 */ gen_irq 3 gen_irq 4 gen_irq 5 gen_irq 6 gen_irq 7 gen_irq 8 gen_irq 9 gen_irq 10 gen_irq 11 gen_irq 12 gen_irq 13 gen_irq 14 gen_irq 15 L_ENTRY(leave_irq) decb irq_count pop %edx pop %ecx pop %eax iret L_END(leave_irq)