aboutsummaryrefslogtreecommitdiff
path: root/src/core/idt.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/idt.cc')
-rw-r--r--src/core/idt.cc28
1 files changed, 14 insertions, 14 deletions
diff --git a/src/core/idt.cc b/src/core/idt.cc
index a73d92c..25264b6 100644
--- a/src/core/idt.cc
+++ b/src/core/idt.cc
@@ -1,14 +1,16 @@
#include "idt.hpp"
+#include "core/paging.hpp"
#include "libs/string.hpp"
-IDT_REGISTER IDTR = {
- IDT_GATE_SIZE*IDT_MAX_ENTRIES,
- IDT_ADDR
-};
+u32 idt[IDT_MAX_ENTRIES][4] __attribute__((aligned(4096)));;
+IDT_REGISTER IDTR;
extern u64 INT_DEFAULT,INT_0,INT_14,INT_KBD;
void idt_enable_interrupt(void){
+ IDTR.base=((u64)idt);
+ IDTR.limit=sizeof(idt);
+
IDT_DESCRIPTOR d;
d.ign=0;
d.ist=0;
@@ -25,7 +27,7 @@ void idt_enable_interrupt(void){
d.offset=(u64)&INT_14;
idt_write_descriptor(d, i);
}
- else if(i==60){ // Page fault
+ else if(i==60){ // Keyboard
d.offset=(u64)&INT_KBD;
idt_write_descriptor(d, i);
}
@@ -34,12 +36,11 @@ void idt_enable_interrupt(void){
idt_write_descriptor(d, i);
}
}
-
+
// Enable interrupts
asm(
- "lidt (IDTR) \n\t"
- "sti \n\t"
- );
+ "lidt (IDTR) \n\t"
+ "sti \n\t ");
}
void idt_write_descriptor(IDT_DESCRIPTOR desc, u16 index){
@@ -47,9 +48,8 @@ void idt_write_descriptor(IDT_DESCRIPTOR desc, u16 index){
u32 desc32_63=desc.ist | desc.options | (desc.offset&0xFFFF0000);
u32 desc64_95=desc.offset>>32;
u32 desc96_127=desc.ign;
- u32* dst=(u32*)(IDTR.base+index*IDT_GATE_SIZE);
- *dst=desc0_31;
- *(dst+1)=desc32_63;
- *(dst+2)=desc64_95;
- *(dst+3)=desc96_127;
+ idt[index][0]=desc0_31;
+ idt[index][1]=desc32_63;
+ idt[index][2]=desc64_95;
+ idt[index][3]=desc96_127;
} \ No newline at end of file