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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 (;;)
|
||||
|
||||
Reference in New Issue
Block a user