Kernel: Rewrite APIC and PIC more OOP friendly

x86_64 port is slowly coming together
This commit is contained in:
Bananymous
2023-01-23 20:13:57 +02:00
parent b50bb03ed4
commit ba53582f23
13 changed files with 575 additions and 572 deletions

View File

@@ -1,13 +1,50 @@
#pragma once
#include <stdint.h>
#include <BAN/Vector.h>
#include <kernel/InterruptController.h>
namespace APIC
class APIC final : public InterruptController
{
public:
virtual void EOI(uint8_t) override;
virtual void EnableIrq(uint8_t) override;
virtual void GetISR(uint32_t[8]) override;
void Initialize(bool force_pic = false);
void EOI(uint8_t irq);
void GetISR(uint32_t[8]);
void EnableIRQ(uint8_t irq);
private:
uint32_t ReadFromLocalAPIC(ptrdiff_t);
void WriteToLocalAPIC(ptrdiff_t, uint32_t);
}
private:
static APIC* Create();
friend class InterruptController;
private:
struct Processor
{
enum Flags : uint8_t
{
Enabled = 1,
OnlineCapable = 2,
};
uint8_t processor_id;
uint8_t apic_id;
uint8_t flags;
};
struct IOAPIC
{
uint8_t id;
uintptr_t address;
uint32_t gsi_base;
uint8_t max_redirs;
uint32_t Read(uint8_t offset);
void Write(uint8_t offset, uint32_t data);
};
private:
BAN::Vector<Processor> m_processors;
uintptr_t m_local_apic = 0;
BAN::Vector<IOAPIC> m_io_apics;
uint8_t m_irq_overrides[0x100] {};
};

View File

@@ -0,0 +1,16 @@
#pragma once
#include <stdint.h>
class InterruptController
{
public:
virtual ~InterruptController() {}
virtual void EOI(uint8_t) = 0;
virtual void EnableIrq(uint8_t) = 0;
virtual void GetISR(uint32_t[8]) = 0;
static void Initialize(bool force_pic);
static InterruptController& Get();
};

View File

@@ -1,16 +1,18 @@
#pragma once
#include <stdint.h>
#include <kernel/InterruptController.h>
namespace PIC
class PIC final : public InterruptController
{
public:
virtual void EOI(uint8_t) override;
virtual void EnableIrq(uint8_t) override;
virtual void GetISR(uint32_t[8]) override;
void Remap();
void MaskAll();
void EOI(uint8_t);
void Unmask(uint8_t);
void Mask(uint8_t);
static void Remap();
static void MaskAll();
uint16_t GetISR();
}
private:
static PIC* Create();
friend class InterruptController;
};