diff options
| author | cpplover0 <osdev555@yandex.com> | 2026-03-12 07:23:06 +0300 |
|---|---|---|
| committer | cpplover0 <osdev555@yandex.com> | 2026-03-12 07:23:06 +0300 |
| commit | e31de642e987664a9765fb76fd782b9d7f838bda (patch) | |
| tree | 1ea6f14d0abfdc2ed601507bb28464aa0e222cd5 /kernel/src/arch/x86_64/cpu/idt.cpp | |
| parent | a79fa41862d2f81e2a8d505fa994c16234e7e41b (diff) | |
x2apic, poweroff, nvme driver, mp, powerbutton
Diffstat (limited to 'kernel/src/arch/x86_64/cpu/idt.cpp')
| -rw-r--r-- | kernel/src/arch/x86_64/cpu/idt.cpp | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/kernel/src/arch/x86_64/cpu/idt.cpp b/kernel/src/arch/x86_64/cpu/idt.cpp index 19cbbcf..c62b1e6 100644 --- a/kernel/src/arch/x86_64/cpu/idt.cpp +++ b/kernel/src/arch/x86_64/cpu/idt.cpp @@ -4,6 +4,7 @@ #include <utils/bitmap.hpp> #include <klibc/stdio.hpp> #include <arch/x86_64/cpu/lapic.hpp> +#include <utils/assert.hpp> x86_64::idt::idt_entry_t idt_entries[255]; utils::bitmap* idt_bitmap; @@ -12,29 +13,37 @@ x86_64::idt::idtr_t idtr; extern "C" void* isrTable[]; extern "C" void ignoreStubC() { + assert(0,"ignore stub"); x86_64::lapic::eoi(); + } void x86_64::idt::init() { - klibc::memset(idt_entries,0,sizeof(idt_entries)); - idt_bitmap = new utils::bitmap(255); - idtr.base = (std::uint64_t)idt_entries; - idtr.limit = (std::uint16_t)sizeof(idt_entry_t) * 256 - 1; + static bool is_print = 0; - for(uint8_t vec = 0;vec <32;vec++){ - set_entry((std::uint64_t)isrTable[vec],vec,0x8E,1); - } + if(!is_print) { + klibc::memset(idt_entries,0,sizeof(idt_entries)); + idt_bitmap = new utils::bitmap(255); + + idtr.base = (std::uint64_t)idt_entries; + idtr.limit = (std::uint16_t)sizeof(idt_entry_t) * 256 - 1; + + for(uint8_t vec = 0;vec <32;vec++){ + set_entry((std::uint64_t)isrTable[vec],vec,0x8E,1); + } + + for(uint8_t vec = 32; vec < 255; vec++) { + set_entry((std::uint64_t)ignoreStub,vec,0x8E,4); + idt_bitmap->clear(vec); + } - for(uint8_t vec = 32; vec < 255; vec++) { - set_entry((std::uint64_t)ignoreStub,vec,0x8E,4); - idt_bitmap->clear(vec); + idt_bitmap->set(32); } - idt_bitmap->set(32); load(); - klibc::printf("IDT: IDTR is 0x%p\r\n",&idtr); + if(!is_print) {klibc::printf("IDT: IDTR is 0x%p\r\n",&idtr); is_print = 1;} } void x86_64::idt::load() { |
