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