Spinlock save cpu flags
This commit is contained in:
@@ -14,6 +14,8 @@ 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;
|
||||
@@ -23,29 +25,33 @@ bool irq_attach (irq_func_t func, void* arg, uint32_t irq_num) {
|
||||
irq->arg = arg;
|
||||
irq->irq_num = irq_num;
|
||||
|
||||
spin_lock (&irqs_lock);
|
||||
spin_lock (&irqs_lock, &fiq);
|
||||
rbtree_insert (struct irq, &irq_tree, &irq->irq_tree_link, irq_tree_link, irq_num);
|
||||
spin_unlock (&irqs_lock);
|
||||
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);
|
||||
spin_lock (&irqs_lock, &fiq);
|
||||
rbtree_delete (&irq_tree, &irq->irq_tree_link);
|
||||
spin_unlock (&irqs_lock);
|
||||
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);
|
||||
spin_lock (&irqs_lock, &fiq);
|
||||
rbtree_find (struct irq, &irq_tree, irq_num, irq, irq_tree_link, irq_num);
|
||||
spin_unlock (&irqs_lock);
|
||||
spin_unlock (&irqs_lock, fiq);
|
||||
|
||||
return irq;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user