irqhand.s
来自「一个类似windows」· S 代码 · 共 90 行
S
90 行
#include <ndk/asm.h>
#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) \
.global _KiUnexpectedInterrupt##intnum; \
_KiUnexpectedInterrupt##intnum:; \
pusha; \
movl $0x##intnum, %ebx; \
jmp _KiCommonInterrupt;
/* Interrupt handlers and declarations */
#define B(x,y) \
BUILD_INTERRUPT_HANDLER(x##y)
#define B16(x) \
B(x,0) B(x,1) B(x,2) B(x,3) \
B(x,4) B(x,5) B(x,6) B(x,7) \
B(x,8) B(x,9) B(x,A) B(x,B) \
B(x,C) B(x,D) B(x,E) B(x,F)
B16(3) B16(4) B16(5) B16(6)
B16(7) B16(8) B16(9) B16(A)
B16(B) B16(C) B16(D) B16(E)
B16(F)
#undef B
#undef B16
#undef BUILD_INTERRUPT_HANDLER
#else /* CONFIG_SMP */
#define BUILD_INTERRUPT_HANDLER(intnum) \
.global _irq_handler_##intnum; \
_irq_handler_##intnum:; \
pusha; \
movl $(##intnum + IRQ_BASE), %ebx; \
jmp _KiCommonInterrupt;
/* Interrupt handlers and declarations */
#define B(x) \
BUILD_INTERRUPT_HANDLER(x)
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)
#undef B
#undef BUILD_INTERRUPT_HANDLER
#endif /* CONFIG_SMP */
.intel_syntax noprefix
.globl _KiUnexpectedInterrupt@0
_KiUnexpectedInterrupt@0:
/* Bugcheck with invalid interrupt code */
push 0x12
call _KeBugCheck@4
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?