mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-28 15:34:33 +00:00
Fixed interrupt handler manager
This commit is contained in:
parent
a14ac6f351
commit
efc6faf619
@ -1,6 +1,7 @@
|
|||||||
#include <interrupts.hpp>
|
#include <interrupts.hpp>
|
||||||
|
|
||||||
#include <syscalls.hpp>
|
#include <syscalls.hpp>
|
||||||
|
#include <hashmap.hpp>
|
||||||
|
|
||||||
#if defined(__amd64__)
|
#if defined(__amd64__)
|
||||||
#include "../Architecture/amd64/cpu/gdt.hpp"
|
#include "../Architecture/amd64/cpu/gdt.hpp"
|
||||||
@ -20,6 +21,8 @@ extern "C" __attribute__((no_stack_protector)) void ExceptionHandler(void *Data)
|
|||||||
|
|
||||||
namespace Interrupts
|
namespace Interrupts
|
||||||
{
|
{
|
||||||
|
HashMap<int, uint64_t> *RegisteredEvents;
|
||||||
|
|
||||||
#if defined(__amd64__)
|
#if defined(__amd64__)
|
||||||
/* APIC::APIC */ void *apic = nullptr;
|
/* APIC::APIC */ void *apic = nullptr;
|
||||||
#elif defined(__i386__)
|
#elif defined(__i386__)
|
||||||
@ -29,6 +32,10 @@ namespace Interrupts
|
|||||||
|
|
||||||
void Initialize(int Core)
|
void Initialize(int Core)
|
||||||
{
|
{
|
||||||
|
static int once = 0;
|
||||||
|
if (!once++)
|
||||||
|
RegisteredEvents = new HashMap<int, uint64_t>;
|
||||||
|
|
||||||
#if defined(__amd64__)
|
#if defined(__amd64__)
|
||||||
GlobalDescriptorTable::Init(0);
|
GlobalDescriptorTable::Init(0);
|
||||||
InterruptDescriptorTable::Init(0);
|
InterruptDescriptorTable::Init(0);
|
||||||
@ -64,14 +71,16 @@ namespace Interrupts
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<Handler *> RegisteredEvents;
|
|
||||||
|
|
||||||
extern "C" void MainInterruptHandler(void *Data)
|
extern "C" void MainInterruptHandler(void *Data)
|
||||||
{
|
{
|
||||||
#if defined(__amd64__)
|
#if defined(__amd64__)
|
||||||
CPU::x64::TrapFrame *Frame = (CPU::x64::TrapFrame *)Data;
|
CPU::x64::TrapFrame *Frame = (CPU::x64::TrapFrame *)Data;
|
||||||
if (RegisteredEvents[Frame->InterruptNumber])
|
|
||||||
RegisteredEvents[Frame->InterruptNumber]->OnInterruptReceived(Frame);
|
Handler *handler = (Handler *)RegisteredEvents->Get(Frame->InterruptNumber);
|
||||||
|
if (handler != (Handler *)0xdeadbeef)
|
||||||
|
handler->OnInterruptReceived(Frame);
|
||||||
|
else
|
||||||
|
error("Unhandled IRQ%d on CPU %d", Frame->InterruptNumber - 32, ((APIC::APIC *)Interrupts::apic)->Read(APIC::APIC::APIC_ID) >> 24);
|
||||||
|
|
||||||
if (apic)
|
if (apic)
|
||||||
{
|
{
|
||||||
@ -90,34 +99,30 @@ namespace Interrupts
|
|||||||
|
|
||||||
Handler::Handler(int InterruptNumber)
|
Handler::Handler(int InterruptNumber)
|
||||||
{
|
{
|
||||||
debug("Handler::Handler(%d)", InterruptNumber);
|
debug("Registering interrupt handler for IRQ%d", InterruptNumber - 32);
|
||||||
this->InterruptNumber = InterruptNumber;
|
this->InterruptNumber = InterruptNumber;
|
||||||
RegisteredEvents.push_back(this);
|
RegisteredEvents->AddNode(InterruptNumber, (uint64_t)this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Handler::~Handler()
|
Handler::~Handler()
|
||||||
{
|
{
|
||||||
for (uint64_t i = 0; i < RegisteredEvents.size(); i++)
|
debug("Unregistering interrupt handler for IRQ%d", InterruptNumber - 32);
|
||||||
if (RegisteredEvents[i] == this)
|
if (RegisteredEvents->DeleteNode(InterruptNumber) == 0xdeadbeef)
|
||||||
{
|
warn("Node %d not found", InterruptNumber);
|
||||||
debug("Handler::~Handler(%d)", InterruptNumber);
|
|
||||||
RegisteredEvents.remove(i);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__amd64__)
|
#if defined(__amd64__)
|
||||||
void Handler::OnInterruptReceived(CPU::x64::TrapFrame *Frame)
|
void Handler::OnInterruptReceived(CPU::x64::TrapFrame *Frame)
|
||||||
{
|
{
|
||||||
warn("Unhandled interrupt received %#lx", Frame->InterruptNumber);
|
trace("Unhandled interrupt IRQ%d", Frame->InterruptNumber - 32);
|
||||||
#elif defined(__i386__)
|
#elif defined(__i386__)
|
||||||
void Handler::OnInterruptReceived(void *Frame);
|
void Handler::OnInterruptReceived(void *Frame);
|
||||||
{
|
{
|
||||||
warn("Unhandled interrupt received");
|
trace("Unhandled interrupt received");
|
||||||
#elif defined(__aarch64__)
|
#elif defined(__aarch64__)
|
||||||
void Handler::OnInterruptReceived(void *Frame);
|
void Handler::OnInterruptReceived(void *Frame);
|
||||||
{
|
{
|
||||||
warn("Unhandled interrupt received");
|
trace("Unhandled interrupt received");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,8 @@
|
|||||||
"limine.h": "c",
|
"limine.h": "c",
|
||||||
"types.h": "c",
|
"types.h": "c",
|
||||||
"binfo.h": "c",
|
"binfo.h": "c",
|
||||||
"liballoc_1_1.h": "c"
|
"liballoc_1_1.h": "c",
|
||||||
|
"cstring": "cpp"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -67,7 +67,7 @@ public:
|
|||||||
Index++;
|
Index++;
|
||||||
Index %= HashMapCapacity;
|
Index %= HashMapCapacity;
|
||||||
}
|
}
|
||||||
return nullptr;
|
return 0xdeadbeef;
|
||||||
}
|
}
|
||||||
|
|
||||||
V Get(int Key)
|
V Get(int Key)
|
||||||
@ -78,14 +78,14 @@ public:
|
|||||||
while (Nodes[Index] != nullptr)
|
while (Nodes[Index] != nullptr)
|
||||||
{
|
{
|
||||||
if (Iterate++ > HashMapCapacity)
|
if (Iterate++ > HashMapCapacity)
|
||||||
return 0;
|
return 0xdeadbeef;
|
||||||
|
|
||||||
if (Nodes[Index]->Key == Key)
|
if (Nodes[Index]->Key == Key)
|
||||||
return Nodes[Index]->Value;
|
return Nodes[Index]->Value;
|
||||||
Index++;
|
Index++;
|
||||||
Index %= HashMapCapacity;
|
Index %= HashMapCapacity;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0xdeadbeef;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Size() { return HashMapSize; }
|
int Size() { return HashMapSize; }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user