Change Interrupts::Handler

This commit is contained in:
Alex 2023-03-23 20:48:09 +02:00
parent 958e4c792e
commit 6b01a21a71
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD
6 changed files with 20 additions and 7 deletions

View File

@ -138,7 +138,7 @@ namespace ACPI
} }
} }
DSDT::DSDT(ACPI *acpi) : Interrupts::Handler(acpi->FADT->SCI_Interrupt + CPU::x86::IRQ0) DSDT::DSDT(ACPI *acpi) : Interrupts::Handler(acpi->FADT->SCI_Interrupt)
{ {
this->acpi = acpi; this->acpi = acpi;
uint64_t Address = ((IsCanonical(acpi->FADT->X_Dsdt) && acpi->XSDTSupported) ? acpi->FADT->X_Dsdt : acpi->FADT->Dsdt); uint64_t Address = ((IsCanonical(acpi->FADT->X_Dsdt) && acpi->XSDTSupported) ? acpi->FADT->X_Dsdt : acpi->FADT->Dsdt);

View File

@ -347,7 +347,7 @@ namespace APIC
this->lapic->Write(APIC_TIMER, timer.raw); this->lapic->Write(APIC_TIMER, timer.raw);
} }
Timer::Timer(APIC *apic) : Interrupts::Handler(IRQ0) Timer::Timer(APIC *apic) : Interrupts::Handler(0) /* IRQ0 */
{ {
SmartCriticalSection(APICLock); SmartCriticalSection(APICLock);
this->lapic = apic; this->lapic = apic;

View File

@ -77,7 +77,7 @@ static inline int GetLetterFromScanCode(uint8_t ScanCode)
namespace CrashHandler namespace CrashHandler
{ {
CrashKeyboardDriver::CrashKeyboardDriver() : Interrupts::Handler(CPU::x86::IRQ1) CrashKeyboardDriver::CrashKeyboardDriver() : Interrupts::Handler(1) /* IRQ1 */
{ {
while (inb(0x64) & 0x1) while (inb(0x64) & 0x1)
inb(0x60); inb(0x60);

View File

@ -134,7 +134,11 @@ namespace Interrupts
bool InterruptHandled = false; bool InterruptHandled = false;
foreach (auto ev in RegisteredEvents) foreach (auto ev in RegisteredEvents)
{ {
#if defined(a64) || defined(a32)
if ((ev.ID + CPU::x86::IRQ0) == static_cast<int>(Frame->InterruptNumber))
#elif defined(aa64)
if (ev.ID == static_cast<int>(Frame->InterruptNumber)) if (ev.ID == static_cast<int>(Frame->InterruptNumber))
#endif
{ {
((Handler *)ev.Data)->OnInterruptReceived(Frame); ((Handler *)ev.Data)->OnInterruptReceived(Frame);
InterruptHandled = true; InterruptHandled = true;
@ -174,18 +178,18 @@ namespace Interrupts
{ {
if (ev.ID == InterruptNumber) if (ev.ID == InterruptNumber)
{ {
warn("IRQ%d is already registered.", InterruptNumber - 32); warn("IRQ%d is already registered.", InterruptNumber);
} }
} }
debug("Registering interrupt handler for IRQ%d.", InterruptNumber - 32); debug("Registering interrupt handler for IRQ%d.", InterruptNumber);
this->InterruptNumber = InterruptNumber; this->InterruptNumber = InterruptNumber;
RegisteredEvents.push_back({InterruptNumber, this}); RegisteredEvents.push_back({InterruptNumber, this});
} }
Handler::~Handler() Handler::~Handler()
{ {
debug("Unregistering interrupt handler for IRQ%d.", InterruptNumber - 32); debug("Unregistering interrupt handler for IRQ%d.", InterruptNumber);
for (size_t i = 0; i < RegisteredEvents.size(); i++) for (size_t i = 0; i < RegisteredEvents.size(); i++)
{ {
if (RegisteredEvents[i].ID == InterruptNumber) if (RegisteredEvents[i].ID == InterruptNumber)

View File

@ -740,7 +740,7 @@ namespace Tasking
return Process; return Process;
} }
Task::Task(const IP EntryPoint) : Interrupts::Handler(CPU::x86::IRQ16) Task::Task(const IP EntryPoint) : Interrupts::Handler(16) /* IRQ16 */
{ {
SmartLock(TaskingLock); SmartLock(TaskingLock);
#if defined(a64) #if defined(a64)

View File

@ -33,8 +33,17 @@ namespace Interrupts
int InterruptNumber; int InterruptNumber;
protected: protected:
/**
* @brief Set a new interrupt number.
* @param InterruptNumber The interrupt number. NOT the IRQ number! (IRQ0 != 32)
*/
void SetInterruptNumber(int InterruptNumber) { this->InterruptNumber = InterruptNumber; } void SetInterruptNumber(int InterruptNumber) { this->InterruptNumber = InterruptNumber; }
int GetInterruptNumber() { return InterruptNumber; } int GetInterruptNumber() { return InterruptNumber; }
/**
* @brief Create a new interrupt handler.
* @param InterruptNumber The interrupt number. NOT the IRQ number! (IRQ0 != 32)
*/
Handler(int InterruptNumber); Handler(int InterruptNumber);
~Handler(); ~Handler();