Implement lock IRQ nesting via stack variables/contexts
All checks were successful
Build documentation / build-and-deploy (push) Successful in 21s

This commit is contained in:
2026-01-14 22:11:56 +01:00
parent 55166f9d5f
commit 270ff507d4
22 changed files with 197 additions and 145 deletions

View File

@@ -14,6 +14,8 @@ 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, uint32_t flags) {
spin_lock_ctx_t ctxiqa;
struct irq* irq = malloc (sizeof (*irq));
if (irq == NULL) {
return false;
@@ -24,9 +26,9 @@ bool irq_attach (void (*func) (void*, void*), void* arg, uint32_t irq_num, uint3
irq->irq_num = irq_num;
irq->flags = flags;
rw_spin_write_lock (&irqs_lock);
rw_spin_write_lock (&irqs_lock, &ctxiqa);
irq_table[irq_num] = irq;
rw_spin_write_unlock (&irqs_lock);
rw_spin_write_unlock (&irqs_lock, &ctxiqa);
#if defined(__x86_64__)
uint8_t resolution = amd64_resolve_irq (irq_num);
@@ -37,11 +39,13 @@ bool irq_attach (void (*func) (void*, void*), void* arg, uint32_t irq_num, uint3
}
struct irq* irq_find (uint32_t irq_num) {
rw_spin_read_lock (&irqs_lock);
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);
rw_spin_read_unlock (&irqs_lock, &ctxiqa);
return irq;
}