Changes in kernel/arch/sparc64/src/trap/sun4u/interrupt.c [d99c1d2:da1bafb] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/trap/sun4u/interrupt.c
rd99c1d2 rda1bafb 55 55 void interrupt(int n, istate_t *istate) 56 56 { 57 uint64_t status; 58 uint64_t intrcv; 59 uint64_t data0; 60 status = asi_u64_read(ASI_INTR_DISPATCH_STATUS, 0); 57 uint64_t status = asi_u64_read(ASI_INTR_DISPATCH_STATUS, 0); 61 58 if (status & (!INTR_DISPATCH_STATUS_BUSY)) 62 59 panic("Interrupt Dispatch Status busy bit not set\n"); 63 64 intrcv = asi_u64_read(ASI_INTR_RECEIVE, 0);60 61 uint64_t intrcv = asi_u64_read(ASI_INTR_RECEIVE, 0); 65 62 #if defined (US) 66 data0 = asi_u64_read(ASI_INTR_R, ASI_UDB_INTR_R_DATA_0);63 uint64_t data0 = asi_u64_read(ASI_INTR_R, ASI_UDB_INTR_R_DATA_0); 67 64 #elif defined (US3) 68 data0 = asi_u64_read(ASI_INTR_R, VA_INTR_R_DATA_0);65 uint64_t data0 = asi_u64_read(ASI_INTR_R, VA_INTR_R_DATA_0); 69 66 #endif 70 67 71 68 irq_t *irq = irq_dispatch_and_lock(data0); 72 69 if (irq) { … … 75 72 */ 76 73 irq->handler(irq); 74 77 75 /* 78 76 * See if there is a clear-interrupt-routine and call it. 79 77 */ 80 if (irq->cir) {78 if (irq->cir) 81 79 irq->cir(irq->cir_arg, irq->inr); 82 }83 spinlock_unlock(&irq->lock);80 81 irq_spinlock_unlock(&irq->lock, false); 84 82 } else if (data0 > config.base) { 85 83 /* … … 90 88 */ 91 89 #ifdef CONFIG_SMP 92 if (data0 == (uintptr_t) tlb_shootdown_ipi_recv) {90 if (data0 == (uintptr_t) tlb_shootdown_ipi_recv) 93 91 tlb_shootdown_ipi_recv(); 94 }95 92 #endif 96 93 } else { … … 101 98 printf("cpu%u: spurious interrupt (intrcv=%#" PRIx64 102 99 ", data0=%#" PRIx64 ")\n", CPU->id, intrcv, data0); 100 #else 101 (void) intrcv; 103 102 #endif 104 103 } 105 104 106 105 membar(); 107 106 asi_u64_write(ASI_INTR_RECEIVE, 0, 0);
Note:
See TracChangeset
for help on using the changeset viewer.