Fix user apps randomly crashing (APIC, GDT layout, syscall entry)
All checks were successful
Build documentation / build-and-deploy (push) Successful in 23s

This commit is contained in:
2026-01-14 19:51:18 +01:00
parent 0d8f9e565f
commit d1d772cb42
23 changed files with 276 additions and 204 deletions

View File

@@ -9,9 +9,8 @@
#include <amd64/intr.h>
#endif
/* TODO: figure out a generic way to work with IRQs */
struct irq* irq_table[0x100];
static struct list_node_link* irqs = NULL;
static rw_spin_lock_t irqs_lock;
bool irq_attach (void (*func) (void*, void*), void* arg, uint32_t irq_num, uint32_t flags) {
@@ -26,7 +25,7 @@ bool irq_attach (void (*func) (void*, void*), void* arg, uint32_t irq_num, uint3
irq->flags = flags;
rw_spin_write_lock (&irqs_lock);
list_append (irqs, &irq->irqs_link);
irq_table[irq_num] = irq;
rw_spin_write_unlock (&irqs_lock);
#if defined(__x86_64__)
@@ -37,42 +36,12 @@ bool irq_attach (void (*func) (void*, void*), void* arg, uint32_t irq_num, uint3
return true;
}
void irq_detach (void (*func) (void*, void*)) {
struct list_node_link *irq_link, *irq_link_tmp;
struct irq* irq = NULL;
rw_spin_read_lock (&irqs_lock);
list_foreach (irqs, irq_link, irq_link_tmp) {
irq = list_entry (irq_link, struct irq, irqs_link);
if ((uintptr_t)irq->func == (uintptr_t)func)
break;
}
rw_spin_read_unlock (&irqs_lock);
if (irq != NULL) {
rw_spin_write_lock (&irqs_lock);
list_remove (irqs, &irq->irqs_link);
rw_spin_write_unlock (&irqs_lock);
}
}
struct irq* irq_find (uint32_t irq_num) {
struct list_node_link *irq_link, *irq_link_tmp;
rw_spin_read_lock (&irqs_lock);
list_foreach (irqs, irq_link, irq_link_tmp) {
struct irq* irq = list_entry (irq_link, struct irq, irqs_link);
if (irq->irq_num == irq_num) {
rw_spin_read_unlock (&irqs_lock);
return irq;
}
}
struct irq* irq = irq_table[irq_num];
rw_spin_read_unlock (&irqs_lock);
return NULL;
return irq;
}

View File

@@ -19,7 +19,6 @@ struct irq {
};
bool irq_attach (irq_func_t, void* arg, uint32_t irq_num, uint32_t flags);
void irq_detach (irq_func_t func);
struct irq* irq_find (uint32_t irq_num);
#endif // _KERNEL_IRQ_IRQ_H