jankos/interrupts.c

113 lines
3.8 KiB
C

#include "interrupts.h"
#include "mem.h"
#include "types.h"
extern void no_err_handler_1();
extern void no_err_handler_2();
extern void no_err_handler_3();
extern void no_err_handler_4();
extern void no_err_handler_5();
extern void no_err_handler_6();
extern void no_err_handler_7();
extern void err_code_handler_8();
extern void no_err_handler_9();
extern void err_code_handler_10();
extern void err_code_handler_11();
extern void err_code_handler_12();
extern void err_code_handler_13();
extern void err_code_handler_14();
extern void no_err_handler_15();
extern void no_err_handler_16();
extern void err_code_handler_17();
extern void no_err_handler_18();
extern void no_err_handler_19();
extern void no_err_handler_20();
extern void no_err_handler_21();
extern void no_err_handler_22();
extern void no_err_handler_23();
extern void no_err_handler_24();
extern void no_err_handler_25();
extern void no_err_handler_26();
extern void no_err_handler_27();
extern void no_err_handler_28();
extern void no_err_handler_29();
extern void no_err_handler_30();
extern void no_err_handler_31();
extern void no_err_handler_32();
void setup_idt_entry(u32 t_idx, u32 base, u16 sel, u8 type_attrs) {
// Configuring a single given entry in the IDT table
IDT[t_idx].offset_low = (base & 0xffff);
IDT[t_idx].offset_high = ((base >> 16) & 0xffff);
IDT[t_idx].type_attrs = type_attrs;
IDT[t_idx].selector = sel;
}
void load_idt() {
asm("lidt [idt_ptr]");
return;
}
// Generic interrupt handler to be used later on
void interrupt_handler(struct cpu_reg_state cpu, struct stack_state stack, u32 interrupt_code) {
// treating things on the stack like it were a cpu_reg_state
}
void init_idt() {
// setup special idt pointer
idt_ptr.address = (u32)(&IDT);
idt_ptr.limit = sizeof(struct IDT_Entry) * IDT_SIZE;
// clear table
memset((u8*)IDT, 0x00, (sizeof(struct IDT_Entry) * IDT_SIZE) - 1);
// add interrupt service routines here
setup_idt_entry(0,(u32)no_err_handler_1,0x08, 0x8e);
setup_idt_entry(1,(u32)no_err_handler_2,0x08, 0x8e);
setup_idt_entry(2,(u32)no_err_handler_3,0x08, 0x8e);
setup_idt_entry(3,(u32)no_err_handler_4,0x08, 0x8e);
setup_idt_entry(4,(u32)no_err_handler_5,0x08, 0x8e);
setup_idt_entry(5,(u32)no_err_handler_6,0x08, 0x8e);
setup_idt_entry(6,(u32)no_err_handler_7,0x08, 0x8e);
setup_idt_entry(7,(u32)err_code_handler_8,0x08, 0x8e);
setup_idt_entry(8,(u32)no_err_handler_9,0x08, 0x8e); // err
setup_idt_entry(9,(u32)err_code_handler_10,0x08, 0x8e); // no err
setup_idt_entry(0,(u32)err_code_handler_11,0x08, 0x8e); // err
setup_idt_entry(11,(u32)err_code_handler_12,0x08, 0x8e);
setup_idt_entry(12,(u32)err_code_handler_13,0x08, 0x8e);
setup_idt_entry(13,(u32)err_code_handler_14,0x08, 0x8e);
setup_idt_entry(14,(u32)no_err_handler_15,0x08, 0x8e);
setup_idt_entry(15,(u32)no_err_handler_16,0x08, 0x8e); // no err
setup_idt_entry(16,(u32)err_code_handler_17,0x08, 0x8e);
setup_idt_entry(17,(u32)no_err_handler_18,0x08, 0x8e); // err
setup_idt_entry(18,(u32)no_err_handler_19,0x08, 0x8e); // no err
setup_idt_entry(19,(u32)no_err_handler_20,0x08, 0x8e);
setup_idt_entry(20,(u32)no_err_handler_21,0x08, 0x8e);
setup_idt_entry(21,(u32)no_err_handler_22,0x08, 0x8e);
setup_idt_entry(22,(u32)no_err_handler_23,0x08, 0x8e);
setup_idt_entry(23,(u32)no_err_handler_24,0x08, 0x8e);
setup_idt_entry(24,(u32)no_err_handler_25,0x08, 0x8e);
setup_idt_entry(25,(u32)no_err_handler_26,0x08, 0x8e);
setup_idt_entry(26,(u32)no_err_handler_27,0x08, 0x8e);
setup_idt_entry(27,(u32)no_err_handler_28,0x08, 0x8e);
setup_idt_entry(28,(u32)no_err_handler_29,0x08, 0x8e);
setup_idt_entry(29,(u32)no_err_handler_30,0x08, 0x8e);
setup_idt_entry(30,(u32)no_err_handler_31,0x08, 0x8e);
setup_idt_entry(31,(u32)no_err_handler_32,0x08, 0x8e);
// Load IDT with all the new information in place, ready to use
load_idt();
}