summaryrefslogtreecommitdiff
path: root/Kernel/Arch/i386
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel/Arch/i386')
-rw-r--r--Kernel/Arch/i386/CPU.cpp24
-rw-r--r--Kernel/Arch/i386/CPU.h7
-rw-r--r--Kernel/Arch/i386/PIC.cpp14
-rw-r--r--Kernel/Arch/i386/PIC.h1
4 files changed, 11 insertions, 35 deletions
diff --git a/Kernel/Arch/i386/CPU.cpp b/Kernel/Arch/i386/CPU.cpp
index 56d9aaf8d8..d1ef90e6a4 100644
--- a/Kernel/Arch/i386/CPU.cpp
+++ b/Kernel/Arch/i386/CPU.cpp
@@ -26,12 +26,12 @@
#include "APIC.h"
#include "Assertions.h"
+#include "IRQHandler.h"
#include "PIC.h"
#include "Process.h"
#include <AK/Types.h>
#include <Kernel/Arch/i386/CPU.h>
#include <Kernel/KSyms.h>
-#include <Kernel/SharedInterruptHandler.h>
#include <Kernel/VM/MemoryManager.h>
#include <LibC/mallocdefs.h>
@@ -48,7 +48,7 @@ static DescriptorTablePointer s_gdtr;
static Descriptor s_idt[256];
static Descriptor s_gdt[256];
-static SharedInterruptHandler* s_irq_handler[256];
+static IRQHandler* s_irq_handler[16];
static Vector<u16>* s_gdt_freelist;
@@ -435,25 +435,18 @@ static void unimp_trap()
hang();
}
-void register_shared_interrupt_handler(u8 irq, SharedInterruptHandler& handler)
+void register_irq_handler(u8 irq, IRQHandler& handler)
{
ASSERT(!s_irq_handler[irq]);
s_irq_handler[irq] = &handler;
}
-void unregister_shared_interrupt_handler(u8 irq, SharedInterruptHandler& handler)
+void unregister_irq_handler(u8 irq, IRQHandler& handler)
{
ASSERT(s_irq_handler[irq] == &handler);
s_irq_handler[irq] = nullptr;
}
-SharedInterruptHandler& get_interrupt_handler(u8 number)
-{
- ASSERT(number < 256);
- ASSERT(s_irq_handler[number] != nullptr);
- return *s_irq_handler[number];
-}
-
void register_interrupt_handler(u8 index, void (*f)())
{
s_idt[index].low = 0x00080000 | LSW((f));
@@ -531,8 +524,8 @@ void idt_init()
register_interrupt_handler(0x5e, irq_14_asm_entry);
register_interrupt_handler(0x5f, irq_15_asm_entry);
- for (u8 i = 0; i < 255; ++i) {
- SharedInterruptHandler::initialize(i);
+ for (u8 i = 0; i < 16; ++i) {
+ s_irq_handler[i] = nullptr;
}
flush_idt();
@@ -548,9 +541,8 @@ void handle_irq(RegisterDump regs)
clac();
ASSERT(regs.isr_number >= 0x50 && regs.isr_number <= 0x5f);
u8 irq = (u8)(regs.isr_number - 0x50);
- ASSERT(s_irq_handler[irq] != nullptr);
- s_irq_handler[irq]->handle_interrupt();
- // FIXME: Determine if we use IRQs or MSIs (in the future) to send EOI...
+ if (s_irq_handler[irq])
+ s_irq_handler[irq]->handle_irq();
PIC::eoi(irq);
}
diff --git a/Kernel/Arch/i386/CPU.h b/Kernel/Arch/i386/CPU.h
index 3eebbc3156..11fb73881c 100644
--- a/Kernel/Arch/i386/CPU.h
+++ b/Kernel/Arch/i386/CPU.h
@@ -240,7 +240,7 @@ public:
u64 raw[4];
};
-class SharedInterruptHandler;
+class IRQHandler;
struct RegisterDump;
void gdt_init();
@@ -248,9 +248,8 @@ void idt_init();
void sse_init();
void register_interrupt_handler(u8 number, void (*f)());
void register_user_callable_interrupt_handler(u8 number, void (*f)());
-void register_shared_interrupt_handler(u8 number, SharedInterruptHandler&);
-SharedInterruptHandler& get_interrupt_handler(u8 number);
-void unregister_shared_interrupt_handler(u8 number, SharedInterruptHandler&);
+void register_irq_handler(u8 number, IRQHandler&);
+void unregister_irq_handler(u8 number, IRQHandler&);
void flush_idt();
void flush_gdt();
void load_task_register(u16 selector);
diff --git a/Kernel/Arch/i386/PIC.cpp b/Kernel/Arch/i386/PIC.cpp
index c500ef8c95..2b62494b5a 100644
--- a/Kernel/Arch/i386/PIC.cpp
+++ b/Kernel/Arch/i386/PIC.cpp
@@ -75,20 +75,6 @@ void enable(u8 irq)
}
}
-bool is_enabled(u8 irq)
-{
- InterruptDisabler disabler;
- u8 imr;
- if (irq & 8) {
- imr = IO::in8(PIC1_CMD);
- imr &= (1 << (irq - 8));
- } else {
- imr = IO::in8(PIC0_CMD);
- imr &= (1 << irq);
- }
- return (!!imr);
-}
-
void eoi(u8 irq)
{
if (irq & 8)
diff --git a/Kernel/Arch/i386/PIC.h b/Kernel/Arch/i386/PIC.h
index 4746fb4a4b..ecac1c3101 100644
--- a/Kernel/Arch/i386/PIC.h
+++ b/Kernel/Arch/i386/PIC.h
@@ -34,7 +34,6 @@ void enable(u8 number);
void disable(u8 number);
void eoi(u8 number);
void initialize();
-bool is_enabled(u8 number);
u16 get_isr();
u16 get_irr();