From c79e957f387a47905131d35b002fa3091b243a38 Mon Sep 17 00:00:00 2001 From: Gitea Date: Fri, 18 Dec 2020 12:38:32 -0600 Subject: [PATCH] we got the gdt working! --- arch/i386/gdt.c | 4 ++- arch/i386/gdt.h | 2 +- arch/i386/{gdt.S => gdt_load.S} | 18 +++++-------- arch/i386/init.c | 46 +++++++++++++++++++++++++++++---- arch/i386/make.config | 2 +- include/kernel/init.h | 3 +++ 6 files changed, 56 insertions(+), 19 deletions(-) rename arch/i386/{gdt.S => gdt_load.S} (70%) diff --git a/arch/i386/gdt.c b/arch/i386/gdt.c index b3f9168..8d87c15 100644 --- a/arch/i386/gdt.c +++ b/arch/i386/gdt.c @@ -1,3 +1,5 @@ +#include "gdt.h" + void encode_gdt_entry(unsigned short int * target, struct GDT source) { if((source.limit > 65536) && ((source.limit & 0xFFF) != 0xFFF)) { /* This needs to error out. */ @@ -25,4 +27,4 @@ void encode_gdt_entry(unsigned short int * target, struct GDT source) { /* Encode type */ target[5] = source.type; -} +} \ No newline at end of file diff --git a/arch/i386/gdt.h b/arch/i386/gdt.h index b8581df..0c1315d 100644 --- a/arch/i386/gdt.h +++ b/arch/i386/gdt.h @@ -8,7 +8,7 @@ struct GDT { }; void encode_gdt_entry(unsigned short int *, struct GDT); -extern void set_gdt(void); +extern void set_gdt(unsigned short int[], int); extern void reload_segments(void); #endif diff --git a/arch/i386/gdt.S b/arch/i386/gdt_load.S similarity index 70% rename from arch/i386/gdt.S rename to arch/i386/gdt_load.S index 1a9740a..bf21b63 100644 --- a/arch/i386/gdt.S +++ b/arch/i386/gdt_load.S @@ -6,24 +6,20 @@ gdtr: .int 0 set_gdt: - .fnstart + .func set_gdt mov 4(%esp), %eax - mov %eax, 2($gdtr) + mov %eax, gdtr+2 mov 8(%esp), %ax - mov %ax, $gdtr - lgdt $gdtr + mov %ax, gdtr + lgdt gdtr ret - .fnend + .endfunc .globl reload_segments .type reload_segments,%function reload_segments: - .fnstart - jmp 0x08:reload_CS - .fnend - -reload_CS: + .func reload_segments mov 0x10, %ax mov %ax, %ds mov %ax, %es @@ -31,4 +27,4 @@ reload_CS: mov %ax, %gs mov %ax, %ss ret - + .endfunc diff --git a/arch/i386/init.c b/arch/i386/init.c index 454e159..9b966b3 100755 --- a/arch/i386/init.c +++ b/arch/i386/init.c @@ -3,6 +3,10 @@ #include #include #include +#include +#include "gdt.h" + +int tss[16][2]; int test_libc(void) { int failed = 0; @@ -10,12 +14,8 @@ int test_libc(void) { printf("==Testing stdio.h==\n"); printf("printf(\"%%d\", 10): %d (expected 10)\n", 10); - printf("printf(\"%%d\", -10): %d (expected -10)\n", -10); - printf("printf(\"%%i\", 10): %d (expected 10)\n", 10); - printf("printf(\"%%o\", 014): %o (expected 14)\n", 014); printf("printf(\"%%o\", 14): %o (expected 16)\n", 14); printf("printf(\"%%u\", 10): %u (expected 10)\n", 10); - printf("printf(\"%%x\", 0xC9A): %x (expected c9a)\n", 0xC9A); printf("printf(\"%%x\", 26): %x (expected 1a)\n", 26); printf("printf(\"%%X\", 0xC9A): %x (expected C9A)\n", 0xC9A); printf("printf(\"%%p\", &i): %p (expected 0x[hex])\n", &failed); @@ -95,12 +95,48 @@ int test_libc(void) { } printf("Tests failed: %d\n", failed); - printf("One final test: If you can see this, the TTY can scroll."); return failed; } +void NMI_disable(void) { + outb(0x70, inb(0x70) | 0x80); +} + +void NMI_enable(void) { + outb(0x70, inb(0x70) & 0x7F); +} + +void A20_enable(void) { + unsigned short int a = inb(0x92); + if((a & 2) != 0) { + return; + } + a |= 2; + outb(a, 0x92); +} + +void setup_gdt(void) { + struct GDT gdt[4]; + + gdt[0].base = 0; gdt[0].limit = 0; gdt[0].type = 0; + gdt[1].base = 0; gdt[1].limit = 0xFFFFFFFF; gdt[1].type = 0x9A; + gdt[2].base = 0; gdt[2].limit = 0xFFFFFFFF; gdt[2].type = 0x92; + gdt[3].base = (unsigned int) tss; gdt[3].limit=sizeof(tss); gdt[3].type = 0x89; + + unsigned short int GDT[4]; + encode_gdt_entry(&GDT[0], gdt[0]); + encode_gdt_entry(&GDT[1], gdt[1]); + encode_gdt_entry(&GDT[2], gdt[2]); + encode_gdt_entry(&GDT[3], gdt[3]); + + set_gdt(GDT, sizeof(GDT)); +} + int init(void) { + NMI_disable(); + A20_enable(); + setup_gdt(); printf("Fenix Dev Pre-release v0.0.3\n"); return test_libc(); } diff --git a/arch/i386/make.config b/arch/i386/make.config index e6455c7..377267d 100755 --- a/arch/i386/make.config +++ b/arch/i386/make.config @@ -3,4 +3,4 @@ KERNEL_ARCH_CPPFLAGS= KERNEL_ARCH_LDFLAGS= KERNEL_ARCH_LIBS= -KERNEL_ARCH_OBJS=$(ARCHDIR)/boot.o $(ARCHDIR)/tty.o $(ARCHDIR)/init.o $(ARCHDIR)/cmos.o \ No newline at end of file +KERNEL_ARCH_OBJS=$(ARCHDIR)/boot.o $(ARCHDIR)/tty.o $(ARCHDIR)/init.o $(ARCHDIR)/cmos.o $(ARCHDIR)/gdt.o $(ARCHDIR)/gdt_load.o \ No newline at end of file diff --git a/include/kernel/init.h b/include/kernel/init.h index b411cd7..2fe7138 100755 --- a/include/kernel/init.h +++ b/include/kernel/init.h @@ -3,6 +3,9 @@ #include +extern int tss[16][2]; +extern unsigned short int * GDT; + int test_libc(void); int init(void);