aboutsummaryrefslogtreecommitdiff
path: root/src/core/idt.cc
diff options
context:
space:
mode:
authorLoic Guegan <manzerbredes@mailbox.org>2021-05-02 14:46:18 +0200
committerLoic Guegan <manzerbredes@mailbox.org>2021-05-02 14:46:18 +0200
commite59104ffb55abe522c82d658f1f285149cca2cb1 (patch)
treeeb3cc1e46d0dd5b684864903b95ae32e245010da /src/core/idt.cc
parent4f08ba2b1d0ad7ea90d4d97a483b56b891b9c902 (diff)
Debug GDT enable multitasking
Diffstat (limited to 'src/core/idt.cc')
-rw-r--r--src/core/idt.cc18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/core/idt.cc b/src/core/idt.cc
index 495b332..b8b57c7 100644
--- a/src/core/idt.cc
+++ b/src/core/idt.cc
@@ -6,7 +6,7 @@
u32 idt[IDT_MAX_ENTRIES][4] __attribute__((aligned(4096)));;
IDT_REGISTER IDTR;
-extern u64 INT_DEFAULT,INT_0,INT_14,INT_KBD,INT_CLK;
+extern u64 INT_DEFAULT,INT_0,INT_10,INT_14,INT_KBD,INT_CLK,INT_SYSCALL;
void idt_enable_interrupt(void){
IDTR.base=((u64)idt);
@@ -28,6 +28,10 @@ void idt_enable_interrupt(void){
d.offset=(u64)&INT_14;
idt_write_descriptor(d, i);
}
+ else if(i==10){
+ d.offset=(u64)&INT_10;
+ idt_write_descriptor(d, i);
+ }
else if(i==60){ // Keyboard
d.offset=(u64)&INT_KBD;
idt_write_descriptor(d, i);
@@ -36,12 +40,20 @@ void idt_enable_interrupt(void){
d.offset=(u64)&INT_CLK;
idt_write_descriptor(d, i);
}
+ else if(i==0x30){ // Syscall
+ IDT_DESCRIPTOR d2;
+ d2.ign=0;
+ d2.ist=0;
+ d2.selector=0x08;
+ d2.options=IDT_OPT_P|IDT_OPT_PRVL_3|IDT_OPT_TYPE_INT;
+ d2.offset=(u64)&INT_SYSCALL;
+ idt_write_descriptor(d2, i);
+ }
else {
d.offset=(u64)&INT_DEFAULT;
idt_write_descriptor(d, i);
}
- }
-
+ }
// Enable interrupts
asm(
"lidt (IDTR) \n\t"