summaryrefslogtreecommitdiff
path: root/kernel/cpu/idt.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/cpu/idt.c')
-rw-r--r--kernel/cpu/idt.c60
1 files changed, 52 insertions, 8 deletions
diff --git a/kernel/cpu/idt.c b/kernel/cpu/idt.c
index d381990..823cc2a 100644
--- a/kernel/cpu/idt.c
+++ b/kernel/cpu/idt.c
@@ -39,11 +39,6 @@ void format_descriptor(u32 offset, u16 code_segment, u8 type_attribute,
descriptor->zero = 0;
}
-void install_handler(void (*handler_function)(), u16 type_attribute, u8 entry) {
- format_descriptor((u32)handler_function, KERNEL_CODE_SEGMENT_OFFSET,
- type_attribute, &IDT_Entry[entry]);
-}
-
__attribute__((no_caller_saved_registers)) void EOI(u8 irq) {
if (irq > 7)
outb(SLAVE_PIC_COMMAND_PORT, 0x20);
@@ -51,7 +46,7 @@ __attribute__((no_caller_saved_registers)) void EOI(u8 irq) {
outb(MASTER_PIC_COMMAND_PORT, 0x20);
}
-__attribute__((interrupt)) void general_protection_fault(registers_t *regs) {
+void general_protection_fault(reg_t *regs) {
klog("General Protetion Fault", 0x1);
kprintf(" Error Code: %x\n", regs->error_code);
kprintf("Instruction Pointer: %x\n", regs->eip);
@@ -62,7 +57,7 @@ __attribute__((interrupt)) void general_protection_fault(registers_t *regs) {
EOI(0xD - 8);
}
-__attribute__((interrupt)) void double_fault(registers_t *regs) {
+void double_fault(registers_t *regs) {
(void)regs;
klog("DOUBLE FAULT", LOG_ERROR);
asm("hlt");
@@ -77,7 +72,7 @@ void jump_process(const process_t *p) {
void none_save_switch(void);
extern PageDirectory *active_directory;
-__attribute__((interrupt)) void page_fault(registers_t *regs) {
+void page_fault(reg_t *regs) {
volatile uint32_t cr2;
asm volatile("mov %%cr2, %0" : "=r"(cr2));
kprintf("CR2: %x\n", cr2);
@@ -190,7 +185,56 @@ void IRQ_clear_mask(unsigned char IRQline) {
outb(port, value);
}
+// TODO: Maybe lay these out using assembly, macro or via a linker
+// script?
+void *isr_list[] = {
+ isr0, isr1, isr2, isr3, isr4, isr5, isr6, isr7, isr8,
+ isr9, isr10, isr11, isr12, isr13, isr14, isr15, isr16, isr17,
+ isr18, isr19, isr20, isr21, isr22, isr23, isr24, isr25, isr26,
+ isr27, isr28, isr29, isr30, isr31, isr32, isr33, isr34, isr35,
+ isr36, isr37, isr38, isr39, isr40, isr41, isr42, isr43, isr44,
+ isr45, isr46, isr47, isr48, isr49, isr50, isr51, isr52, isr53,
+ isr54, isr55, isr56, isr57, isr58, isr59, isr60, isr61, isr62,
+ isr63, isr64, isr65, isr66, isr67, isr68, isr69, isr70, isr71,
+ isr72, isr73, isr74, isr75, isr76, isr77, isr78, isr79, isr80,
+ isr81, isr82, isr83, isr84, isr85, isr86, isr87, isr88, isr89,
+ isr90, isr91, isr92, isr93, isr94, isr95, isr96, isr97, isr98,
+ isr99, isr100, isr101, isr102, isr103, isr104, isr105, isr106, isr107,
+ isr108, isr109, isr110, isr111, isr112, isr113, isr114, isr115, isr116,
+ isr117, isr118, isr119, isr120, isr121, isr122, isr123, isr124, isr125,
+ isr126, isr127, isr128, isr129, isr130, isr131, isr132, isr133, isr134,
+ isr135, isr136, isr137, isr138, isr139, isr140, isr141, isr142, isr143,
+ isr144, isr145, isr146, isr147, isr148, isr149, isr150, isr151, isr152,
+ isr153, isr154, isr155, isr156, isr157, isr158, isr159, isr160, isr161,
+ isr162, isr163, isr164, isr165, isr166, isr167, isr168, isr169, isr170,
+ isr171, isr172, isr173, isr174, isr175, isr176, isr177, isr178, isr179,
+ isr180, isr181, isr182, isr183, isr184, isr185, isr186, isr187, isr188,
+ isr189, isr190, isr191, isr192, isr193, isr194, isr195, isr196, isr197,
+ isr198, isr199, isr200, isr201, isr202, isr203, isr204, isr205, isr206,
+ isr207, isr208, isr209, isr210, isr211, isr212, isr213, isr214, isr215,
+ isr216, isr217, isr218, isr219, isr220, isr221, isr222, isr223, isr224,
+ isr225, isr226, isr227, isr228, isr229, isr230, isr231, isr232, isr233,
+ isr234, isr235, isr236, isr237, isr238, isr239, isr240, isr241, isr242,
+ isr243, isr244, isr245, isr246, isr247, isr248, isr249, isr250, isr251,
+ isr252, isr253, isr254, isr255,
+};
+
+void (*list_of_handlers[256])(reg_t *);
+
+void int_handler(reg_t *r) {
+ list_of_handlers[r->int_no](r);
+}
+
+void install_handler(void (*handler_function)(), u16 type_attribute, u8 entry) {
+ format_descriptor((u32)isr_list[entry], KERNEL_CODE_SEGMENT_OFFSET,
+ type_attribute, &IDT_Entry[entry]);
+ list_of_handlers[entry] = handler_function;
+}
+
void idt_init(void) {
+ // list_of_handlers = kcalloc(sizeof(void *), 128);
+ memset(list_of_handlers, 0, sizeof(void *) * 256);
+
install_handler(page_fault, INT_32_INTERRUPT_GATE(0x0), 0xE);
install_handler(double_fault, INT_32_INTERRUPT_GATE(0x0), 0x8);
install_handler(general_protection_fault, INT_32_INTERRUPT_GATE(0x0), 0xD);