Browse Source

fix: not disabling interrupt while setting up gdt

greatbridf 2 years ago
parent
commit
b021d6d93d
6 changed files with 11 additions and 3 deletions
  1. 1 1
      Makefile
  2. 3 0
      include/asm/sys.h
  3. 4 0
      src/asm/sys.s
  4. 0 1
      src/kernel/hw/timer.c
  5. 2 1
      src/kernel/mem.c
  6. 1 0
      src/kernel_main.c

+ 1 - 1
Makefile

@@ -1,5 +1,5 @@
 # disable kvm to debug triple faults
-QEMU_ARGS=-drive file=build/boot.img,format=raw -no-reboot -no-shutdown -d cpu_reset,int # -enable-kvm
+QEMU_ARGS=-drive file=build/boot.img,format=raw -no-reboot -no-shutdown -enable-kvm #-d cpu_reset,int
 .PHONY: run
 run: build
 	qemu-system-i386 $(QEMU_ARGS) -display curses -S -s

+ 3 - 0
include/asm/sys.h

@@ -11,6 +11,9 @@ void asm_enable_paging(page_directory_entry* pd_addr);
 
 // the limit should be set on the higher 16bit
 // e.g. (n * sizeof(segment_descriptor) - 1) << 16
+// the lower bit off the limit is either 0 or 1
+// indicating whether or not to enable interrupt
+// after loading gdt
 void asm_load_gdt(uint32_t limit, phys_ptr_t addr);
 
 void asm_load_tr(uint16_t index);

+ 4 - 0
src/asm/sys.s

@@ -24,7 +24,11 @@ asm_load_gdt:
     lgdt (%eax)
     ljmp $0x08, $_asm_load_gdt_fin
 _asm_load_gdt_fin:
+	movw 4(%esp), %ax
+	cmpw $0, %ax
+	je _asm_load_gdt_fin_ret
     sti
+_asm_load_gdt_fin_ret:
     ret
 
 .global asm_load_tr

+ 0 - 1
src/kernel/hw/timer.c

@@ -17,7 +17,6 @@ void init_pit(void)
 
 void inc_tick(void)
 {
-    tty_print(console, "tick");
     ++_current_ticks;
 }
 

+ 2 - 1
src/kernel/mem.c

@@ -338,7 +338,8 @@ void init_gdt_with_tss(void* kernel_esp, uint16_t kernel_ss)
     _tss.esp0 = (uint32_t)kernel_esp;
     _tss.ss0 = kernel_ss;
 
-    asm_load_gdt((6 * sizeof(segment_descriptor) - 1) << 16, (uint32_t)gdt);
+    // +1 for enabling interrupt
+    asm_load_gdt(((6 * sizeof(segment_descriptor) - 1) << 16) + 1, (uint32_t)gdt);
     asm_load_tr((6 - 1) * 8);
 }
 

+ 1 - 0
src/kernel_main.c

@@ -131,6 +131,7 @@ void load_new_gdt(void)
     create_segment_descriptor(new_gdt+3, 0, ~0, 0b1100, SD_TYPE_CODE_USER);
     create_segment_descriptor(new_gdt+4, 0, ~0, 0b1100, SD_TYPE_DATA_USER);
     asm_load_gdt((5 * 8 - 1) << 16, (phys_ptr_t)new_gdt);
+    asm_cli();
 }
 
 void kernel_main(void)