Run first app from ramdisk!
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -3,16 +3,21 @@
|
||||
|
||||
#include <libk/std.h>
|
||||
|
||||
#define IRQ_INTERRUPT_SAFE (1 << 0)
|
||||
|
||||
typedef void (*irq_func_t) (void* arg, void* regs);
|
||||
|
||||
struct irq {
|
||||
struct irq* next;
|
||||
|
||||
void (*func) (void*);
|
||||
irq_func_t func;
|
||||
void* arg;
|
||||
uint32_t irq_num;
|
||||
uint32_t flags;
|
||||
};
|
||||
|
||||
bool irq_attach (void (*func) (void*), void* arg, uint32_t irq_num);
|
||||
void irq_detach (void (*func) (void*));
|
||||
void irq_invoke_each (uint32_t irq_num);
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user