diff --git a/src/Makefile.am b/src/Makefile.am index f602e69..b50d3eb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -8,6 +8,7 @@ if x86 quark_kernel_SOURCES += x86/mmgr.c \ x86/putc.c \ x86/multiboot2.c \ + x86/interrupts.c \ x86/isr.c \ x86/quark_x86.c \ x86/entry.S diff --git a/src/x86/interrupts.c b/src/x86/interrupts.c new file mode 100644 index 0000000..d8fb7df --- /dev/null +++ b/src/x86/interrupts.c @@ -0,0 +1,29 @@ +#include "interrupts.h" + +struct idt_info_t +{ + uint16_t size; + void *location; +}; + +void lidt(struct interrupt_descriptor_t *idt) +{ + struct idt_info_t idt_info; + idt_info.size = sizeof(idt) - 1; + idt_info.location = (void *)&idt; + asm("lidt (%0)" + : + : "r"(&idt_info)); +} + +void create_interrupt_descriptor(struct interrupt_descriptor_t *descriptor, void *isr, enum isr_type_t type, uint32_t privilage) +{ + descriptor->offset_1 = (uint32_t) isr & 0xFFFF; + descriptor->offset_2 = (uint32_t) isr >> 16; + descriptor->selector = 8; + descriptor->zero = 0; + descriptor->type = type; + descriptor->storage = 0; + descriptor->dpl = privilage; + descriptor->present = 1; +} diff --git a/src/x86/interrupts.h b/src/x86/interrupts.h new file mode 100644 index 0000000..7a9a8be --- /dev/null +++ b/src/x86/interrupts.h @@ -0,0 +1,28 @@ +#pragma once + +#include + +enum isr_type_t +{ + INTERRPUT_TASK32 = 5, + INTERRPUT_TRAP32 = 15, + INTERRPUT_INT32 = 14, + INTERRPUT_TRAP16 = 7, + INTERRPUT_INT16 = 6 +}; + +struct interrupt_descriptor_t +{ + uint16_t offset_1; + uint16_t selector; + uint16_t zero : 8; + uint16_t type : 4; + uint16_t storage : 1; + uint16_t dpl : 2; + uint16_t present : 1; + uint16_t offset_2; +}; + +void lidt(struct interrupt_descriptor_t *idt); + +void create_interrupt_descriptor(struct interrupt_descriptor_t *descriptor, void *isr, enum isr_type_t type, uint32_t privilage); diff --git a/src/x86/quark_x86.c b/src/x86/quark_x86.c index 8a29541..2f6fef7 100644 --- a/src/x86/quark_x86.c +++ b/src/x86/quark_x86.c @@ -2,51 +2,14 @@ #include "pageallocator.h" #include "multiboot2.h" #include "memorymap.h" +#include "interrupts.h" #include "stdio.h" -#include "string.h" #include "module.h" #include #include -enum isr_type_t -{ - INTERRPUT_TASK32 = 5, - INTERRPUT_TRAP32 = 15, - INTERRPUT_INT32 = 14, - INTERRPUT_TRAP16 = 7, - INTERRPUT_INT16 = 6 -}; - -struct interrupt_descriptor_t -{ - uint16_t m_offset1; - uint16_t m_selector; - uint16_t m_zero : 8; - uint16_t m_type : 4; - uint16_t m_storage : 1; - uint16_t m_dpl : 2; - uint16_t m_present : 1; - uint16_t m_offset2; -}; - -struct idt_info_t -{ - uint16_t size; - void *location; -}; - extern int _kernelEnd; -void lidt(struct interrupt_descriptor_t *idt) -{ - struct idt_info_t idt_info; - idt_info.size = sizeof(idt) - 1; - idt_info.location = (void *)&idt; - asm("lidt (%0)" - : - : "r"(&idt_info)); -} - int startPaging(uint32_t *directory, uint32_t *table, uint32_t *identityTable) { for (int i = 0; i < 1024; i++) @@ -106,6 +69,6 @@ int initialize(void *multiboot_info) load_module(&kernel, &boot_info.modules[i]); } // TODO: setup IDT - + // TODO: enter first process }