Run first app from ramdisk!

This commit is contained in:
2025-12-29 23:54:21 +01:00
parent c16170e4c2
commit fa7998c323
56 changed files with 5443 additions and 229 deletions

View File

@@ -6,6 +6,7 @@
#if defined(__x86_64__)
#include <amd64/apic.h>
#include <amd64/intr.h>
#endif
/* TODO: figure out a generic way to work with IRQs */
@@ -13,7 +14,7 @@
static struct irq* irqs = NULL;
static spin_lock_t irqs_lock;
bool irq_attach (void (*func) (void*), void* arg, uint32_t irq_num) {
bool irq_attach (void (*func) (void*, void*), void* arg, uint32_t irq_num, uint32_t flags) {
struct irq* irq = malloc (sizeof (*irq));
if (irq == NULL) {
return false;
@@ -22,19 +23,21 @@ bool irq_attach (void (*func) (void*), void* arg, uint32_t irq_num) {
irq->func = func;
irq->arg = arg;
irq->irq_num = irq_num;
irq->flags = flags;
spin_lock (&irqs_lock);
linklist_append (struct irq*, irqs, irq);
spin_unlock (&irqs_lock);
#if defined(__x86_64__)
amd64_ioapic_route_irq (irq_num, irq_num - 0x20, 0, amd64_lapic_id ());
uint8_t resolution = amd64_resolve_irq (irq_num);
amd64_ioapic_route_irq (irq_num, resolution, 0, amd64_lapic_id ());
#endif
return true;
}
void irq_detach (void (*func) (void*)) {
void irq_detach (void (*func) (void*, void*)) {
spin_lock (&irqs_lock);
struct irq *irq, *irq_tmp;
@@ -46,14 +49,18 @@ void irq_detach (void (*func) (void*)) {
spin_unlock (&irqs_lock);
}
void irq_invoke_each (uint32_t irq_num) {
struct irq* irq_find (uint32_t irq_num) {
spin_lock (&irqs_lock);
struct irq *irq, *irq_tmp;
linklist_foreach (irqs, irq, irq_tmp) {
if (irq->irq_num == irq_num)
irq->func (irq->arg);
if (irq->irq_num == irq_num) {
spin_unlock (&irqs_lock);
return irq;
}
}
spin_unlock (&irqs_lock);
return NULL;
}