Files
mop3/kernel/irq/irq.c
kamkow1 c8fb575bdd
All checks were successful
Build ISO image / build-and-deploy (push) Successful in 2m7s
Build documentation / build-and-deploy (push) Successful in 39s
Change formatting rules
2026-04-24 01:54:48 +02:00

58 lines
1.2 KiB
C

#include <irq/irq.h>
#include <libk/rbtree.h>
#include <libk/std.h>
#include <mm/malloc.h>
#include <sync/spin_lock.h>
#include <sys/debug.h>
#if defined(__x86_64__)
#include <amd64/apic.h>
#include <amd64/intr.h>
#endif
static struct rb_node_link* irq_tree = NULL;
static spin_lock_t irqs_lock = SPIN_LOCK_INIT;
bool irq_attach(irq_func_t func, void* arg, uint32_t irq_num) {
uint64_t fiq;
struct irq* irq = malloc(sizeof(*irq));
if (irq == NULL) {
return false;
}
irq->func = func;
irq->arg = arg;
irq->irq_num = irq_num;
spin_lock(&irqs_lock, &fiq);
rbtree_insert(struct irq, &irq_tree, &irq->irq_tree_link, irq_tree_link, irq_num);
spin_unlock(&irqs_lock, fiq);
return true;
}
void irq_detach(uint32_t irq_num) {
uint64_t fiq;
struct irq* irq = irq_find(irq_num);
spin_lock(&irqs_lock, &fiq);
rbtree_delete(&irq_tree, &irq->irq_tree_link);
spin_unlock(&irqs_lock, fiq);
free(irq);
}
struct irq* irq_find(uint32_t irq_num) {
uint64_t fiq;
struct irq* irq = NULL;
spin_lock(&irqs_lock, &fiq);
rbtree_find(struct irq, &irq_tree, irq_num, irq, irq_tree_link, irq_num);
spin_unlock(&irqs_lock, fiq);
return irq;
}