#include #include #include #include #include #include #if defined(__x86_64__) #include #include #endif struct irq* irq_table[0x100]; static rw_spin_lock_t irqs_lock; bool irq_attach (void (*func) (void*, void*), void* arg, uint32_t irq_num) { spin_lock_ctx_t ctxiqa; struct irq* irq = malloc (sizeof (*irq)); if (irq == NULL) { return false; } irq->func = func; irq->arg = arg; irq->irq_num = irq_num; rw_spin_write_lock (&irqs_lock, &ctxiqa); irq_table[irq_num] = irq; rw_spin_write_unlock (&irqs_lock, &ctxiqa); return true; } struct irq* irq_find (uint32_t irq_num) { spin_lock_ctx_t ctxiqa; rw_spin_read_lock (&irqs_lock, &ctxiqa); struct irq* irq = irq_table[irq_num]; rw_spin_read_unlock (&irqs_lock, &ctxiqa); return irq; }