Subversion Repositories HelenOS

Rev

Rev 3149 | Rev 4339 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3149 Rev 3674
Line 65... Line 65...
65
 * @param n Ignored.
65
 * @param n Ignored.
66
 * @param istate Ignored.
66
 * @param istate Ignored.
67
 */
67
 */
68
void interrupt(int n, istate_t *istate)
68
void interrupt(int n, istate_t *istate)
69
{
69
{
-
 
70
    uint64_t status;
70
    uint64_t intrcv;
71
    uint64_t intrcv;
71
    uint64_t data0;
72
    uint64_t data0;
-
 
73
    status = asi_u64_read(ASI_INTR_DISPATCH_STATUS, 0);
-
 
74
    if (status & (!INTR_DISPATCH_STATUS_BUSY))
-
 
75
        panic("Interrupt Dispatch Status busy bit not set\n");
72
 
76
 
73
    intrcv = asi_u64_read(ASI_INTR_RECEIVE, 0);
77
    intrcv = asi_u64_read(ASI_INTR_RECEIVE, 0);
-
 
78
#if defined (US)
74
    data0 = asi_u64_read(ASI_UDB_INTR_R, ASI_UDB_INTR_R_DATA_0);
79
    data0 = asi_u64_read(ASI_INTR_R, ASI_UDB_INTR_R_DATA_0);
-
 
80
#elif defined (US3)
-
 
81
    data0 = asi_u64_read(ASI_INTR_R, VA_INTR_R_DATA_0);
-
 
82
#endif
75
 
83
 
76
    irq_t *irq = irq_dispatch_and_lock(data0);
84
    irq_t *irq = irq_dispatch_and_lock(data0);
77
    if (irq) {
85
    if (irq) {
78
        /*
86
        /*
79
         * The IRQ handler was found.
87
         * The IRQ handler was found.
80
         */
88
         */
81
        irq->handler(irq, irq->arg);
89
        irq->handler(irq, irq->arg);
-
 
90
        /*
-
 
91
         * See if there is a clear-interrupt-routine and call it.
-
 
92
         */
-
 
93
        if (irq->cir) {
-
 
94
            irq->cir(irq->cir_arg, irq->inr);
-
 
95
        }
82
        spinlock_unlock(&irq->lock);
96
        spinlock_unlock(&irq->lock);
83
    } else if (data0 > config.base) {
97
    } else if (data0 > config.base) {
84
        /*
98
        /*
85
         * This is a cross-call.
99
         * This is a cross-call.
86
         * data0 contains address of the kernel function.
100
         * data0 contains address of the kernel function.