summaryrefslogtreecommitdiff
path: root/kernel/src/arch/x86_64/cpu/idt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/arch/x86_64/cpu/idt.cpp')
-rw-r--r--kernel/src/arch/x86_64/cpu/idt.cpp33
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() {