Changes in kernel/arch/amd64/src/interrupt.c [d19b3fc:fd67c9f] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/src/interrupt.c
rd19b3fc rfd67c9f 37 37 #include <log.h> 38 38 #include <panic.h> 39 #include < arch/drivers/i8259.h>39 #include <genarch/drivers/i8259/i8259.h> 40 40 #include <halt.h> 41 41 #include <cpu.h> … … 60 60 void (*disable_irqs_function)(uint16_t irqmask) = NULL; 61 61 void (*enable_irqs_function)(uint16_t irqmask) = NULL; 62 void (*eoi_function)( void) = NULL;62 void (*eoi_function)(unsigned int) = NULL; 63 63 const char *irqs_info = NULL; 64 64 … … 91 91 } 92 92 93 static void trap_virtual_eoi( void)93 static void trap_virtual_eoi(unsigned int irq) 94 94 { 95 95 if (eoi_function) 96 eoi_function( );96 eoi_function(irq); 97 97 else 98 98 panic("No eoi_function."); … … 157 157 static void tlb_shootdown_ipi(unsigned int n, istate_t *istate) 158 158 { 159 trap_virtual_eoi( );159 trap_virtual_eoi(0); 160 160 tlb_shootdown_ipi_recv(); 161 161 } … … 172 172 bool ack = false; 173 173 assert(inum < IRQ_COUNT); 174 assert( (inum != IRQ_PIC_SPUR) && (inum != IRQ_PIC1));174 assert(inum != IRQ_PIC1); 175 175 176 176 irq_t *irq = irq_dispatch_and_lock(inum); … … 182 182 if (irq->preack) { 183 183 /* Send EOI before processing the interrupt */ 184 trap_virtual_eoi( );184 trap_virtual_eoi(inum); 185 185 ack = true; 186 186 } … … 188 188 irq_spinlock_unlock(&irq->lock, false); 189 189 } else { 190 /*191 * Spurious interrupt.192 */193 190 #ifdef CONFIG_DEBUG 194 log(LF_ARCH, LVL_DEBUG, "cpu%u: spurious interrupt (inum=%u)",195 CPU->id,inum);191 log(LF_ARCH, LVL_DEBUG, "cpu%u: unhandled IRQ %u", CPU->id, 192 inum); 196 193 #endif 197 194 } 198 195 199 196 if (!ack) 200 trap_virtual_eoi(); 197 trap_virtual_eoi(inum); 198 } 199 200 static void pic_spurious(unsigned int n, istate_t *istate) 201 { 202 unsigned int inum = n - IVT_IRQBASE; 203 if (!pic_is_spurious(inum)) { 204 /* This is actually not a spurious IRQ, so proceed as usual. */ 205 irq_interrupt(n, istate); 206 return; 207 } 208 pic_handle_spurious(n); 209 #ifdef CONFIG_DEBUG 210 log(LF_ARCH, LVL_DEBUG, "cpu%u: PIC spurious interrupt %u", CPU->id, 211 inum); 212 #endif 201 213 } 202 214 … … 209 221 210 222 for (i = 0; i < IRQ_COUNT; i++) { 211 if ((i != IRQ_PIC_SPUR) && (i != IRQ_PIC1)) 223 if ((i != IRQ_PIC0_SPUR) && (i != IRQ_PIC1_SPUR) && 224 (i != IRQ_PIC1)) 212 225 exc_register(IVT_IRQBASE + i, "irq", true, 213 226 (iroutine_t) irq_interrupt); … … 218 231 exc_register(VECTOR_SS, "ss_fault", true, (iroutine_t) ss_fault); 219 232 exc_register(VECTOR_GP, "gp_fault", true, (iroutine_t) gp_fault); 233 exc_register(VECTOR_PIC0_SPUR, "pic0_spurious", true, 234 (iroutine_t) pic_spurious); 235 exc_register(VECTOR_PIC1_SPUR, "pic1_spurious", true, 236 (iroutine_t) pic_spurious); 220 237 221 238 #ifdef CONFIG_SMP
Note:
See TracChangeset
for help on using the changeset viewer.