diff --git a/kernel/arch/boot.s b/kernel/arch/boot.s index dc31dbc..f5ad26b 100644 --- a/kernel/arch/boot.s +++ b/kernel/arch/boot.s @@ -4,6 +4,7 @@ global loader ; entry symbol for ELF extern kmain +extern gdt_init MAGIC_NUMBER equ 0x1BADB002 ; magic number constant FLAGS equ 0x3 @@ -30,6 +31,8 @@ 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 86db7f4..1b35000 100644 --- a/kernel/arch/gdt/gdt.s +++ b/kernel/arch/gdt/gdt.s @@ -8,12 +8,8 @@ setGdt: mov eax, [esp + 8] mov [gdtr + 2], eax lgdt [gdtr] - ret - -global reloadSegments -reloadSegments: - jmp 0x08:.reload_CS ; 0x08 is a stand in for the code segment -.reload_CS: + 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 6da72b5..1f79dbc 100644 --- a/kernel/arch/gdt/gdt_entry.c +++ b/kernel/arch/gdt/gdt_entry.c @@ -63,11 +63,11 @@ void gdt_init(void) gdt[0] = create_descriptor(0, 0, 0); // null gdt[1] = create_descriptor(0, 0x000FFFFF, (GDT_CODE_PL0)); // kernel code gdt[2] = create_descriptor(0, 0x000FFFFF, (GDT_DATA_PL0)); // kernel data - gdt[3] = create_descriptor(0, 0x000FFFFF, (GDT_CODE_PL3)); // user code - gdt[4] = create_descriptor(0, 0x000FFFFF, (GDT_DATA_PL3)); // user data + //gdt[3] = create_descriptor(0, 0x000FFFFF, (GDT_CODE_PL3)); // user code + //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 e85edb3..5e8b55c 100644 --- a/kernel/arch/idt/idt.c +++ b/kernel/arch/idt/idt.c @@ -24,9 +24,13 @@ void exception_handler(unsigned int i) if (i <= 31) __asm__ volatile ("cli; hlt"); // hangs the computer - if (i == PIC_PIT) { - printf("Sending EOI instruction to PIT\n"); - PIC_sendEOI(0); + if (i == PIC_KEYB) { +#ifdef __TESTING__ + kinfo("Sending EOI instruction to KEYB"); +#endif + printf("Scancode: %x\n", inb(0x60)); // read from kb + + PIC_sendEOI(1); } } diff --git a/kernel/arch/idt/idt_src.s b/kernel/arch/idt/idt_src.s index 4a18477..b144030 100644 --- a/kernel/arch/idt/idt_src.s +++ b/kernel/arch/idt/idt_src.s @@ -6,6 +6,7 @@ isr_stub_%+%1: cld push dword %1 call exception_handler + pop eax ; make sure to pop off the dword!! popad iret %endmacro @@ -16,6 +17,7 @@ isr_stub_%+%1: cld push dword %1 call exception_handler + pop eax popad iret %endmacro diff --git a/kernel/include/kernel/x86/gdt.h b/kernel/include/kernel/x86/gdt.h index 16755b6..4f89d76 100644 --- a/kernel/include/kernel/x86/gdt.h +++ b/kernel/include/kernel/x86/gdt.h @@ -47,7 +47,7 @@ SEG_PRIV(3) | SEG_DATA_RDWR -#define GDT_SIZE 5 +#define GDT_SIZE 3 void setGdt(unsigned short limit, uint64_t* base); diff --git a/kernel/kmain.c b/kernel/kmain.c index 84586d6..41b3726 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__