Kernel: Replace PIC with APIC

If APIC/IOAPIC is not found, we fallback to PIC

Interrupts don't seem to work on real hardware (?)
This commit is contained in:
Bananymous
2022-12-19 11:33:07 +02:00
parent 7efa5bfb75
commit 0bdb01ee04
11 changed files with 427 additions and 46 deletions

View File

@@ -1,9 +1,9 @@
#include <BAN/Queue.h>
#include <kernel/APIC.h>
#include <kernel/IDT.h>
#include <kernel/IO.h>
#include <kernel/Keyboard.h>
#include <kernel/kprint.h>
#include <kernel/PIC.h>
#include <kernel/PIT.h>
#include <kernel/Serial.h>
@@ -449,7 +449,7 @@ namespace Keyboard
// Register callback and IRQ
IDT::register_irq_handler(KEYBOARD_IRQ, keyboard_irq_handler);
PIC::unmask(KEYBOARD_IRQ);
APIC::EnableIRQ(KEYBOARD_IRQ);
return true;
}

View File

@@ -27,8 +27,11 @@
namespace PIC
{
void initialize()
void Remap()
{
uint8_t a1 = IO::inb(PIC1_DATA);
uint8_t a2 = IO::inb(PIC2_DATA);
// Start the initialization sequence (in cascade mode)
IO::outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4);
IO::io_wait();
@@ -53,19 +56,25 @@ namespace PIC
IO::outb(PIC2_DATA, ICW4_8086);
IO::io_wait();
// Mask everything
// Restore original masks
IO::outb(PIC1_DATA, a1);
IO::outb(PIC2_DATA, a2);
}
void MaskAll()
{
IO::outb(PIC1_DATA, 0xff);
IO::outb(PIC2_DATA, 0xff);
}
void eoi(uint8_t irq)
void EOI(uint8_t irq)
{
if (irq >= 8)
IO::outb(PIC2_COMMAND, PIC_EOI);
IO::outb(PIC1_COMMAND, PIC_EOI);
}
void mask(uint8_t irq) {
void Mask(uint8_t irq) {
uint16_t port;
uint8_t value;
@@ -79,7 +88,7 @@ namespace PIC
IO::outb(port, value);
}
void unmask(uint8_t irq) {
void Unmask(uint8_t irq) {
uint16_t port;
uint8_t value;
@@ -93,7 +102,7 @@ namespace PIC
IO::outb(port, value);
}
uint16_t get_isr()
uint16_t GetISR()
{
IO::outb(PIC1_COMMAND, 0x0b);
IO::outb(PIC2_COMMAND, 0x0b);

View File

@@ -1,7 +1,7 @@
#include <kernel/IDT.h>
#include <kernel/IO.h>
#include <kernel/kprint.h>
#include <kernel/PIC.h>
#include <kernel/APIC.h>
#define IRQ_TIMER 0
@@ -28,7 +28,7 @@ namespace PIT
void clock_handle()
{
PIT::s_system_time++;
s_system_time++;
}
uint64_t ms_since_boot()
@@ -47,7 +47,7 @@ namespace PIT
IDT::register_irq_handler(IRQ_TIMER, clock_handle);
PIC::unmask(IRQ_TIMER);
APIC::EnableIRQ(IRQ_TIMER);
}
}

View File

@@ -1,3 +1,4 @@
#include <kernel/APIC.h>
#include <kernel/GDT.h>
#include <kernel/IDT.h>
#include <kernel/IO.h>
@@ -40,11 +41,9 @@ void kernel_main(multiboot_info_t* mbi, uint32_t magic)
}
TTY::initialize();
dprintln("{}", mbi->framebuffer.type);
kmalloc_initialize();
PIC::initialize();
APIC::Initialize();
gdt_initialize();
IDT::initialize();
@@ -52,11 +51,12 @@ void kernel_main(multiboot_info_t* mbi, uint32_t magic)
if (!Keyboard::initialize())
return;
kprintln("Hello from the kernel!");
ENABLE_INTERRUPTS();
kprintln("Hello from the kernel!");
auto& shell = Kernel::Shell::Get();
shell.Run();
for (;;)