HhhOS/arch/x86_64/drivers/idt/isr.c
2021-08-17 12:45:35 +03:00

124 lines
4.3 KiB
C

#include <drivers/idt/isr.h>
#include <drivers/terminal/terminal.h>
inline isr_exception(interrupt_frame_t *frame, const char *error) {
printf(error);
asm volatile("cli; hlt");
}
__attribute__((interrupt)) static void isr0(interrupt_frame_t *frame) {
isr_exception(frame, "Division By Zero");
}
__attribute__((interrupt)) static void isr1(interrupt_frame_t *frame) {
isr_exception(frame, "Debug");
}
__attribute__((interrupt)) static void isr2(interrupt_frame_t *frame) {
isr_exception(frame, "Non Maskable Interrupt");
}
__attribute__((interrupt)) static void isr3(interrupt_frame_t *frame) {
isr_exception(frame, "Breakpoint");
}
__attribute__((interrupt)) static void isr4(interrupt_frame_t *frame) {
isr_exception(frame, "Into Detected Overflow");
}
__attribute__((interrupt)) static void isr5(interrupt_frame_t *frame) {
isr_exception(frame, "Out of Bounds");
}
__attribute__((interrupt)) static void isr6(interrupt_frame_t *frame) {
isr_exception(frame, "Invalid Opcode");
}
__attribute__((interrupt)) static void isr7(interrupt_frame_t *frame) {
isr_exception(frame, "No Coprocessor");
}
__attribute__((interrupt)) static void isr8(interrupt_frame_t *frame) {
isr_exception(frame, "Double Fault");
}
__attribute__((interrupt)) static void isr9(interrupt_frame_t *frame) {
isr_exception(frame, "Coprocessor Segment Overrun");
}
__attribute__((interrupt)) static void isr10(interrupt_frame_t *frame) {
isr_exception(frame, "Bad TSS");
}
__attribute__((interrupt)) static void isr11(interrupt_frame_t *frame) {
isr_exception(frame, "Segment Not Present");
}
__attribute__((interrupt)) static void isr12(interrupt_frame_t *frame) {
isr_exception(frame, "Stack Fault");
}
__attribute__((interrupt)) static void isr13(interrupt_frame_t *frame) {
isr_exception(frame, "General Protection Fault");
}
__attribute__((interrupt)) static void isr14(interrupt_frame_t *frame) {
isr_exception(frame, "Page Fault");
}
__attribute__((interrupt)) static void isr15(interrupt_frame_t *frame) {
isr_exception(frame, "Unknown Interrupt");
}
__attribute__((interrupt)) static void isr16(interrupt_frame_t *frame) {
isr_exception(frame, "Coprocessor Fault");
}
__attribute__((interrupt)) static void isr17(interrupt_frame_t *frame) {
isr_exception(frame, "Alignment Check");
}
__attribute__((interrupt)) static void isr18(interrupt_frame_t *frame) {
isr_exception(frame, "Machine Check");
}
__attribute__((interrupt)) static void isr_reserved(interrupt_frame_t *frame) {
isr_exception(frame, "Reserved");
}
void isr_install(void) {
idt_set_entry(0, (void*)isr0, INTERRUPT_GATE);
idt_set_entry(1, (void*)isr1, INTERRUPT_GATE);
idt_set_entry(2, (void*)isr2, INTERRUPT_GATE);
idt_set_entry(3, (void*)isr3, INTERRUPT_GATE);
idt_set_entry(4, (void*)isr4, INTERRUPT_GATE);
idt_set_entry(5, (void*)isr5, INTERRUPT_GATE);
idt_set_entry(6, (void*)isr6, INTERRUPT_GATE);
idt_set_entry(7, (void*)isr7, INTERRUPT_GATE);
idt_set_entry(8, (void*)isr8, INTERRUPT_GATE);
idt_set_entry(9, (void*)isr9, INTERRUPT_GATE);
idt_set_entry(10, (void*)isr10, INTERRUPT_GATE);
idt_set_entry(11, (void*)isr11, INTERRUPT_GATE);
idt_set_entry(12, (void*)isr12, INTERRUPT_GATE);
idt_set_entry(13, (void*)isr13, INTERRUPT_GATE);
idt_set_entry(14, (void*)isr14, INTERRUPT_GATE);
idt_set_entry(15, (void*)isr15, INTERRUPT_GATE);
idt_set_entry(16, (void*)isr16, INTERRUPT_GATE);
idt_set_entry(17, (void*)isr17, INTERRUPT_GATE);
idt_set_entry(18, (void*)isr18, INTERRUPT_GATE);
idt_set_entry(19, (void*)isr_reserved, INTERRUPT_GATE);
idt_set_entry(20, (void*)isr_reserved, INTERRUPT_GATE);
idt_set_entry(21, (void*)isr_reserved, INTERRUPT_GATE);
idt_set_entry(22, (void*)isr_reserved, INTERRUPT_GATE);
idt_set_entry(23, (void*)isr_reserved, INTERRUPT_GATE);
idt_set_entry(24, (void*)isr_reserved, INTERRUPT_GATE);
idt_set_entry(25, (void*)isr_reserved, INTERRUPT_GATE);
idt_set_entry(26, (void*)isr_reserved, INTERRUPT_GATE);
idt_set_entry(27, (void*)isr_reserved, INTERRUPT_GATE);
idt_set_entry(28, (void*)isr_reserved, INTERRUPT_GATE);
idt_set_entry(29, (void*)isr_reserved, INTERRUPT_GATE);
idt_set_entry(30, (void*)isr_reserved, INTERRUPT_GATE);
idt_set_entry(31, (void*)isr_reserved, INTERRUPT_GATE);
idt_init();
}