diff options
-rw-r--r-- | kernel/boot/interrupts/idt.cc | 38 | ||||
-rw-r--r-- | kernel/include/boot/interrupts.h | 5 | ||||
-rw-r--r-- | kernel/kernel/kernel.cc | 2 |
3 files changed, 43 insertions, 2 deletions
diff --git a/kernel/boot/interrupts/idt.cc b/kernel/boot/interrupts/idt.cc index 7da25e1..92f35ea 100644 --- a/kernel/boot/interrupts/idt.cc +++ b/kernel/boot/interrupts/idt.cc @@ -16,7 +16,9 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "common.h" #include <boot/interrupts.h> +#include <kernel/halt.h> #include <kernel/io.h> #include <libk/stdio.h> @@ -27,6 +29,22 @@ extern "C" void *isr_stub_table[]; entry_t l_entries[256]; descriptor_t descriptor = { sizeof(l_entries) - 1, l_entries }; +static bool l_idt_loaded = false; + +bool +idt_loaded(void) +{ + return l_idt_loaded; +} + +void +initialize() +{ + load_idt(); + printk("\nInterrupts", "IDT Loaded."); + enable(); + printk("Interrupts", "Initialized."); +} void load_idt(void) @@ -41,9 +59,27 @@ load_idt(void) | IDT_32BIT_INTERRUPT_GATE); __asm__ volatile("lidt %0" ::"m"(descriptor)); + + l_idt_loaded = true; +} + +void +enable(void) +{ + if (!l_idt_loaded) { + printk("Interrupts", "Attempt to enable before IDT load."); + ASSERT_NOT_REACHED(); + } + __asm__ volatile("sti"); + // printk("\ninterrupts", "Enabled."); +} - printk("\ninterrupts", "Loaded IDT!"); +void +disable(void) +{ + __asm__ volatile("cli"); + // printk("\ninterrupts", "Disabled."); } } diff --git a/kernel/include/boot/interrupts.h b/kernel/include/boot/interrupts.h index 165b2d6..5fbe696 100644 --- a/kernel/include/boot/interrupts.h +++ b/kernel/include/boot/interrupts.h @@ -58,7 +58,12 @@ typedef struct { entry_t *ptr; /* Address of IDT */ } PACKED descriptor_t; +void initialize(void); void load_idt(void); +void enable(void); +void disable(void); +bool idt_loaded(void); + extern "C" NORETURN void exception_handler(void); } diff --git a/kernel/kernel/kernel.cc b/kernel/kernel/kernel.cc index 14c59a5..ee7f7cf 100644 --- a/kernel/kernel/kernel.cc +++ b/kernel/kernel/kernel.cc @@ -45,7 +45,7 @@ kernel_main(uint32_t magic, multiboot_info_t *multiboot_info) MemoryMap::load(multiboot_info); PhysicalMM::initialize(); VirtualMM::initialize(); - Interrupts::load_idt(); + Interrupts::initialize(); printk("\nKernel", "Started."); |