X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Fntoskrnl%2Fke%2Fi386%2Firqhand.s;h=ecc70d8b15aef7c3a08dac0b62eda0edf99bc005;hp=20b7eadffd0d65360d7a6ad003aab8c65e4aef48;hb=61b5988d346e9354532057e2baf878bc06ce1bfd;hpb=6f306a8b90ade8a73e792f8d6129ebe02f993eef diff --git a/reactos/ntoskrnl/ke/i386/irqhand.s b/reactos/ntoskrnl/ke/i386/irqhand.s index 20b7eadffd0..ecc70d8b15a 100644 --- a/reactos/ntoskrnl/ke/i386/irqhand.s +++ b/reactos/ntoskrnl/ke/i386/irqhand.s @@ -1,6 +1,31 @@ #include #include <../hal/halx86/include/halirq.h> +_KiCommonInterrupt: + cld + pushl %ds + pushl %es + pushl %fs + pushl %gs + pushl $0xceafbeef + movl $KGDT_R0_DATA,%eax + movl %eax,%ds + movl %eax,%es + movl %eax,%gs + movl $KGDT_R0_PCR,%eax + movl %eax,%fs + pushl %esp + pushl %ebx + call _KiInterruptDispatch + addl $0xC, %esp + popl %gs + popl %fs + popl %es + popl %ds + popa + iret + + #ifdef CONFIG_SMP #define BUILD_INTERRUPT_HANDLER(intnum) \ @@ -21,31 +46,6 @@ B(x,8) B(x,9) B(x,A) B(x,B) \ B(x,C) B(x,D) B(x,E) B(x,F) -_KiCommonInterrupt: - cld - pushl %ds - pushl %es - pushl %fs - pushl %gs - movl $0xceafbeef,%eax - pushl %eax - movl $KGDT_R0_DATA,%eax - movl %eax,%ds - movl %eax,%es - movl %eax,%gs - movl $KGDT_R0_PCR,%eax - movl %eax,%fs - pushl %esp - pushl %ebx - call _KiInterruptDispatch - addl $0xC, %esp - popl %gs - popl %fs - popl %es - popl %ds - popa - iret - B16(3) B16(4) B16(5) B16(6) B16(7) B16(8) B16(9) B16(A) B16(B) B16(C) B16(D) B16(E) @@ -53,440 +53,29 @@ B16(F) #undef B #undef B16 +#undef BUILD_INTERRUPT_HANDLER #else /* CONFIG_SMP */ -.global _irq_handler_0 -_irq_handler_0: - cld - pusha - pushl %ds - pushl %es - pushl %fs - pushl %gs - movl $0xceafbeef,%eax - pushl %eax - movw $KGDT_R0_DATA,%ax - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movl $KGDT_R0_PCR, %eax - movl %eax, %fs - pushl %esp - pushl $(IRQ_BASE + 0) - call _KiInterruptDispatch - addl $0xC, %esp - popl %gs - popl %fs - popl %es - popl %ds - popa - iret - -.global _irq_handler_1 -_irq_handler_1: - cld - pusha - pushl %ds - pushl %es - pushl %fs - pushl %gs - movl $0xceafbeef,%eax - pushl %eax - movw $KGDT_R0_DATA,%ax - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movl $KGDT_R0_PCR, %eax - movl %eax, %fs - pushl %esp - pushl $(IRQ_BASE + 1) - call _KiInterruptDispatch - addl $0xC, %esp - popl %gs - popl %fs - popl %es - popl %ds - popa - iret - -.global _irq_handler_2 -_irq_handler_2: - cld - pusha - pushl %ds - pushl %es - pushl %fs - pushl %gs - movl $0xceafbeef,%eax - pushl %eax - movw $KGDT_R0_DATA,%ax - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movl $KGDT_R0_PCR, %eax - movl %eax, %fs - pushl %esp - pushl $(IRQ_BASE + 2) - call _KiInterruptDispatch - addl $0xC, %esp - popl %gs - popl %fs - popl %es - popl %ds - popa - iret - -.global _irq_handler_3 -_irq_handler_3: - cld - pusha - pushl %ds - pushl %es - pushl %fs - pushl %gs - movl $0xceafbeef,%eax - pushl %eax - movw $KGDT_R0_DATA,%ax - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movl $KGDT_R0_PCR, %eax - movl %eax, %fs - pushl %esp - pushl $(IRQ_BASE + 3) - call _KiInterruptDispatch - addl $0xC, %esp - popl %gs - popl %fs - popl %es - popl %ds - popa - iret - -.global _irq_handler_4 -_irq_handler_4: - cld - pusha - pushl %ds - pushl %es - pushl %fs - pushl %gs - movl $0xceafbeef,%eax - pushl %eax - movw $KGDT_R0_DATA,%ax - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movl $KGDT_R0_PCR, %eax - movl %eax, %fs - pushl %esp - pushl $(IRQ_BASE + 4) - call _KiInterruptDispatch - addl $0xC, %esp - popl %gs - popl %fs - popl %es - popl %ds - popa - iret - -.global _irq_handler_5 -_irq_handler_5: - cld - pusha - pushl %ds - pushl %es - pushl %fs - pushl %gs - movl $0xceafbeef,%eax - pushl %eax - movw $KGDT_R0_DATA,%ax - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movl $KGDT_R0_PCR, %eax - movl %eax, %fs - pushl %esp - pushl $(IRQ_BASE + 5) - call _KiInterruptDispatch - addl $0xC, %esp - popl %gs - popl %fs - popl %es - popl %ds - popa - iret - -.global _irq_handler_6 -_irq_handler_6: - cld - pusha - pushl %ds - pushl %es - pushl %fs - pushl %gs - movl $0xceafbeef,%eax - pushl %eax - movw $KGDT_R0_DATA,%ax - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movl $KGDT_R0_PCR, %eax - movl %eax, %fs - pushl %esp - pushl $(IRQ_BASE + 6) - call _KiInterruptDispatch - addl $0xC, %esp - popl %gs - popl %fs - popl %es - popl %ds - popa - iret - -.global _irq_handler_7 -_irq_handler_7: - cld - pusha - pushl %ds - pushl %es - pushl %fs - pushl %gs - movl $0xceafbeef,%eax - pushl %eax - movw $KGDT_R0_DATA,%ax - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movl $KGDT_R0_PCR, %eax - movl %eax, %fs - pushl %esp - pushl $(IRQ_BASE + 7) - call _KiInterruptDispatch - addl $0xC, %esp - popl %gs - popl %fs - popl %es - popl %ds - popa - iret - -.global _irq_handler_8 -_irq_handler_8: - cld - pusha - pushl %ds - pushl %es - pushl %fs - pushl %gs - movl $0xceafbeef,%eax - pushl %eax - movw $KGDT_R0_DATA,%ax - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movl $KGDT_R0_PCR, %eax - movl %eax, %fs - pushl %esp - pushl $(IRQ_BASE + 8) - call _KiInterruptDispatch - addl $0xC, %esp - popl %gs - popl %fs - popl %es - popl %ds - popa - iret - -.global _irq_handler_9 -_irq_handler_9: - cld - pusha - pushl %ds - pushl %es - pushl %fs - pushl %gs - movl $0xceafbeef,%eax - pushl %eax - movw $KGDT_R0_DATA,%ax - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movl $KGDT_R0_PCR, %eax - movl %eax, %fs - pushl %esp - pushl $(IRQ_BASE + 9) - call _KiInterruptDispatch - addl $0xC, %esp - popl %gs - popl %fs - popl %es - popl %ds - popa - iret - -.global _irq_handler_10 -_irq_handler_10: - cld - pusha - pushl %ds - pushl %es - pushl %fs - pushl %gs - movl $0xceafbeef,%eax - pushl %eax - movw $KGDT_R0_DATA,%ax - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movl $KGDT_R0_PCR, %eax - movl %eax, %fs - pushl %esp - pushl $(IRQ_BASE + 10) - call _KiInterruptDispatch - addl $0xC, %esp - popl %gs - popl %fs - popl %es - popl %ds - popa - iret - -.global _irq_handler_11 -_irq_handler_11: - cld - pusha - pushl %ds - pushl %es - pushl %fs - pushl %gs - movl $0xceafbeef,%eax - pushl %eax - movw $KGDT_R0_DATA,%ax - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movl $KGDT_R0_PCR, %eax - movl %eax, %fs - pushl %esp - pushl $(IRQ_BASE + 11) - call _KiInterruptDispatch - addl $0xC, %esp - popl %gs - popl %fs - popl %es - popl %ds - popa - iret +#define BUILD_INTERRUPT_HANDLER(intnum) \ + .global _irq_handler_##intnum; \ + _irq_handler_##intnum:; \ + pusha; \ + movl $(##intnum + IRQ_BASE), %ebx; \ + jmp _KiCommonInterrupt; -.global _irq_handler_12 -_irq_handler_12: - cld - pusha - pushl %ds - pushl %es - pushl %fs - pushl %gs - movl $0xceafbeef,%eax - pushl %eax - movw $KGDT_R0_DATA,%ax - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movl $KGDT_R0_PCR, %eax - movl %eax, %fs - pushl %esp - pushl $(IRQ_BASE + 12) - call _KiInterruptDispatch - addl $0xC, %esp - popl %gs - popl %fs - popl %es - popl %ds - popa - iret +/* Interrupt handlers and declarations */ -.global _irq_handler_13 -_irq_handler_13: - cld - pusha - pushl %ds - pushl %es - pushl %fs - pushl %gs - movl $0xceafbeef,%eax - pushl %eax - movw $KGDT_R0_DATA,%ax - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movl $KGDT_R0_PCR, %eax - movl %eax, %fs - pushl %esp - pushl $(IRQ_BASE + 13) - call _KiInterruptDispatch - addl $0xC, %esp - popl %gs - popl %fs - popl %es - popl %ds - popa - iret +#define B(x) \ + BUILD_INTERRUPT_HANDLER(x) -.global _irq_handler_14 -_irq_handler_14: - cld - pusha - pushl %ds - pushl %es - pushl %fs - pushl %gs - movl $0xceafbeef,%eax - pushl %eax - movw $KGDT_R0_DATA,%ax - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movl $KGDT_R0_PCR, %eax - movl %eax, %fs - pushl %esp - pushl $(IRQ_BASE + 14) - call _KiInterruptDispatch - addl $0xC, %esp - popl %gs - popl %fs - popl %es - popl %ds - popa - iret +B(0) B(1) B(2) B(3) +B(4) B(5) B(6) B(7) +B(8) B(9) B(10) B(11) +B(12) B(13) B(14) B(15) -.global _irq_handler_15 -_irq_handler_15: - cld - pusha - pushl %ds - pushl %es - pushl %fs - pushl %gs - movl $0xceafbeef,%eax - pushl %eax - movw $KGDT_R0_DATA,%ax - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movl $KGDT_R0_PCR, %eax - movl %eax, %fs - pushl %esp - pushl $(IRQ_BASE + 15) - call _KiInterruptDispatch - addl $0xC, %esp - popl %gs - popl %fs - popl %es - popl %ds - popa - iret +#undef B +#undef BUILD_INTERRUPT_HANDLER #endif /* CONFIG_SMP */