summaryrefslogtreecommitdiff
path: root/arch/i386/kernel/pic.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/i386/kernel/pic.c')
-rw-r--r--arch/i386/kernel/pic.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/arch/i386/kernel/pic.c b/arch/i386/kernel/pic.c
index 9494b92..7a51763 100644
--- a/arch/i386/kernel/pic.c
+++ b/arch/i386/kernel/pic.c
@@ -1,6 +1,6 @@
#include <kernel/pic.h>
-void (*irq_handlers[16])(struct isr_frame *frame);
+static void (*irq_handlers[16])(struct isr_frame *frame);
void pic_eoi(uint8_t irq) {
if (irq >= 8)
@@ -38,6 +38,16 @@ uint16_t pic_get_isr(void) {
return __pic_get_irq_reg(PIC_READ_ISR);
}
+void register_irq_handler(uint8_t irq, void (*handler)(struct isr_frame *frame)) {
+ irq_handlers[irq] = handler;
+}
+
+void irq_dispatch(struct isr_frame *frame) {
+ (*irq_handlers[frame->vector-32])(frame);
+ pic_eoi(frame->vector-32);
+ return;
+}
+
void irq_set_mask(uint8_t irq) {
uint16_t port;
uint8_t data;