diff --git a/kernel/arch/boot.s b/kernel/arch/boot.s index f5ad26b..5b117ed 100644 --- a/kernel/arch/boot.s +++ b/kernel/arch/boot.s @@ -31,8 +31,6 @@ section .text loader: mov esp, kernel_stack + KERNEL_STACK_SIZE ; move the top of the stack into esp - call gdt_init - call kmain ; pass execution over to our kmain function, where all of the real stuff is done ; Should the system exit, we clear the interrupt flag diff --git a/kernel/arch/gdt/gdt.s b/kernel/arch/gdt/gdt.s index 1b35000..86db7f4 100644 --- a/kernel/arch/gdt/gdt.s +++ b/kernel/arch/gdt/gdt.s @@ -8,8 +8,12 @@ setGdt: mov eax, [esp + 8] mov [gdtr + 2], eax lgdt [gdtr] - jmp 0x08:reload_CS ; 0x08 is a stand in for the code segment -reload_CS: + ret + +global reloadSegments +reloadSegments: + jmp 0x08:.reload_CS ; 0x08 is a stand in for the code segment +.reload_CS: mov ax, 0x10 ; stand in for the data segment mov ds, ax mov es, ax diff --git a/kernel/arch/gdt/gdt_entry.c b/kernel/arch/gdt/gdt_entry.c index 1f79dbc..615ac85 100644 --- a/kernel/arch/gdt/gdt_entry.c +++ b/kernel/arch/gdt/gdt_entry.c @@ -67,7 +67,7 @@ void gdt_init(void) //gdt[4] = create_descriptor(0, 0x000FFFFF, (GDT_DATA_PL3)); // user data setGdt((sizeof(uint64_t) * GDT_SIZE) - 1, &(gdt[0])); // limit, base - //reloadSegments(); + reloadSegments(); #ifdef __TESTING__ kinfo("Initialized the GDT"); dump_gdt(); diff --git a/kernel/arch/idt/idt.c b/kernel/arch/idt/idt.c index 5e8b55c..c0ce9c2 100644 --- a/kernel/arch/idt/idt.c +++ b/kernel/arch/idt/idt.c @@ -17,18 +17,22 @@ static bool vectors[IDT_MAX_DESCRIPTORS]; void exception_handler(unsigned int i) { + if (i <= 31) { // TODO: implement proper handling for each exception, also implement the proper gates & error code checking #ifdef __TESTING__ - kerror("EXCEPTION"); - printf("Exeption: %u\n", i); + kerror("EXCEPTION"); + printf("Exeption: %u\n", i); #endif - if (i <= 31) __asm__ volatile ("cli; hlt"); // hangs the computer + } if (i == PIC_KEYB) { #ifdef __TESTING__ kinfo("Sending EOI instruction to KEYB"); #endif - printf("Scancode: %x\n", inb(0x60)); // read from kb + printf("Scancode: %x\n", inb(0x60)); // read from kb + /** + * TODO: this is a cute temporary fix but lets do a real keyboard driver please? + */ PIC_sendEOI(1); } diff --git a/kernel/kmain.c b/kernel/kmain.c index 41b3726..84586d6 100644 --- a/kernel/kmain.c +++ b/kernel/kmain.c @@ -14,7 +14,7 @@ void kmain(void) terminal_initialize(); serial_initialize(); #endif - //gdt_init(); + gdt_init(); idt_init(); #ifndef __TESTING__