Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc64/src/trap/sun4u/interrupt.c

    rda1bafb rd99c1d2  
    5555void interrupt(int n, istate_t *istate)
    5656{
    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);
    5861        if (status & (!INTR_DISPATCH_STATUS_BUSY))
    5962                panic("Interrupt Dispatch Status busy bit not set\n");
    60        
    61         uint64_t intrcv = asi_u64_read(ASI_INTR_RECEIVE, 0);
     63
     64        intrcv = asi_u64_read(ASI_INTR_RECEIVE, 0);
    6265#if defined (US)
    63         uint64_t data0 = 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);
    6467#elif defined (US3)
    65         uint64_t data0 = asi_u64_read(ASI_INTR_R, VA_INTR_R_DATA_0);
     68        data0 = asi_u64_read(ASI_INTR_R, VA_INTR_R_DATA_0);
    6669#endif
    67        
     70
    6871        irq_t *irq = irq_dispatch_and_lock(data0);
    6972        if (irq) {
     
    7275                 */
    7376                irq->handler(irq);
    74                
    7577                /*
    7678                 * See if there is a clear-interrupt-routine and call it.
    7779                 */
    78                 if (irq->cir)
     80                if (irq->cir) {
    7981                        irq->cir(irq->cir_arg, irq->inr);
    80                
    81                 irq_spinlock_unlock(&irq->lock, false);
     82                }
     83                spinlock_unlock(&irq->lock);
    8284        } else if (data0 > config.base) {
    8385                /*
     
    8890                 */
    8991#ifdef CONFIG_SMP
    90                 if (data0 == (uintptr_t) tlb_shootdown_ipi_recv)
     92                if (data0 == (uintptr_t) tlb_shootdown_ipi_recv) {
    9193                        tlb_shootdown_ipi_recv();
     94                }
    9295#endif
    9396        } else {
     
    98101                printf("cpu%u: spurious interrupt (intrcv=%#" PRIx64
    99102                    ", data0=%#" PRIx64 ")\n", CPU->id, intrcv, data0);
    100 #else
    101                 (void) intrcv;
    102103#endif
    103104        }
    104        
     105
    105106        membar();
    106107        asi_u64_write(ASI_INTR_RECEIVE, 0, 0);
Note: See TracChangeset for help on using the changeset viewer.