6 %define NUM_IRQ_CALLBACKS 4
8 MM_LOCALAPIC equ 0xFFFFFD0000000000
51 ; Install IRQ Handlers
54 ; int IRQ_AddHandler(int IRQ, void (*Handler)(int IRQ))
57 ; -1 on an invalid IRQ Number
58 ; -2 when no slots are avaliable
59 [global IRQ_AddHandler]
73 mov rcx, gaIRQ_Handlers
76 ; Find a free callback slot
77 %rep NUM_IRQ_CALLBACKS
83 ; None found, return -2
89 ; Assign the IRQ Callback
119 mov rbx, [rsp+16*8] ; Calculate address
121 mov rax, gaIRQ_Handlers
125 %rep NUM_IRQ_CALLBACKS
128 mov rdi, [rsp+16*8] ; Get IRQ number
130 call rax ; 2 Bytes (Op and Mod/RM)
136 mov rdi, [rsp+16*8] ; Get IRQ number
150 [extern Proc_Scheduler]
152 ; TODO: Find Current CPU
158 mov rdi, MM_LOCALAPIC+0x20
169 times 256 dw 0x00080000, 0x00008E00, 0, 0 ; 64-bit Interrupt Gate, CS = 0x8, IST0
172 times 16*NUM_IRQ_CALLBACKS dq 0