Luna/kernel/src/interrupts/Install.cpp
2022-10-06 17:13:34 +02:00

112 lines
2.5 KiB
C++

#include "interrupts/Install.h"
#include "interrupts/IDT.h"
#include "log/Log.h"
extern "C"
{
void unused();
void isr0();
void isr1();
void isr2();
void isr3();
void isr4();
void isr5();
void isr6();
void isr7();
void isr8();
void isr10();
void isr11();
void isr12();
void isr13();
void isr14();
void isr16();
void isr17();
void isr18();
void isr19();
void isr20();
void isr21();
void isr28();
void isr29();
void isr30();
void isr31();
void isr32();
void isr33();
void isr34();
void isr35();
void isr36();
void isr37();
void isr38();
void isr39();
void isr40();
void isr41();
void isr42();
void isr43();
void isr44();
void isr45();
void isr46();
void isr47();
void isr66();
}
#define INSTALL_TRAP(x) IDT::add_handler(x, (void*)&isr##x, IDT_TA_TrapGate)
#define INSTALL_UNUSED(x) IDT::add_handler(x, (void*)&unused, IDT_TA_InterruptGate)
#define INSTALL_ISR(x) IDT::add_handler(x, (void*)&isr##x, IDT_TA_InterruptGate)
#define INSTALL_USER_ISR(x) IDT::add_handler(x, (void*)&isr##x, IDT_TA_InterruptGateUser)
void Interrupts::install()
{
kdbgln("Installing handler stubs for exceptions (ISRs 0-31)");
INSTALL_TRAP(0);
INSTALL_TRAP(1);
INSTALL_TRAP(2);
INSTALL_TRAP(3);
INSTALL_TRAP(4);
INSTALL_TRAP(5);
INSTALL_TRAP(6);
INSTALL_TRAP(7);
INSTALL_TRAP(8);
INSTALL_UNUSED(9);
INSTALL_TRAP(10);
INSTALL_TRAP(11);
INSTALL_TRAP(12);
INSTALL_TRAP(13);
INSTALL_TRAP(14);
INSTALL_UNUSED(15);
INSTALL_TRAP(16);
INSTALL_TRAP(17);
INSTALL_TRAP(18);
INSTALL_TRAP(19);
INSTALL_TRAP(20);
INSTALL_TRAP(21);
INSTALL_UNUSED(22);
INSTALL_UNUSED(23);
INSTALL_UNUSED(24);
INSTALL_UNUSED(25);
INSTALL_UNUSED(26);
INSTALL_UNUSED(27);
INSTALL_TRAP(28);
INSTALL_TRAP(29);
INSTALL_TRAP(30);
INSTALL_UNUSED(31);
kdbgln("Installing handler stubs for IRQs (ISRs 32-47)");
INSTALL_ISR(32);
INSTALL_ISR(33);
INSTALL_ISR(34);
INSTALL_ISR(35);
INSTALL_ISR(36);
INSTALL_ISR(37);
INSTALL_ISR(38);
INSTALL_ISR(39);
INSTALL_ISR(40);
INSTALL_ISR(41);
INSTALL_ISR(42);
INSTALL_ISR(43);
INSTALL_ISR(44);
INSTALL_ISR(45);
INSTALL_ISR(46);
INSTALL_ISR(47);
kdbgln("Installing unused handler stubs for the rest of the IDT");
for (short i = 48; i < 256; i++) { INSTALL_UNUSED(i); }
kdbgln("Installing syscall handler stub");
INSTALL_USER_ISR(66);
}