diff --git a/src/arch/x86_64/gdt.c b/src/arch/x86_64/gdt.c index 2a0eab10..75fdf395 100644 --- a/src/arch/x86_64/gdt.c +++ b/src/arch/x86_64/gdt.c @@ -3,18 +3,37 @@ #include static void setseg(segdesc __seg_gs *seg, uint32_t limit, uint32_t offset, uint8_t flags, uint8_t access){ + + seg->limit = limit & 0xFFFF; + seg->offset1 = offset & 0xFFFF; + seg->offset2 = (offset >> 16) & 0xFF; + seg->access = access; + seg->flags = flags << 4; + seg->flags |= (limit >> 16) & 0xFF; + seg->offset3 = (offset >> 24) & 0xFF; } static void setsys64(sys64 __seg_gs *e, uint32_t limit, uint64_t offset, uint8_t flags, uint8_t access){ + e->limit = limit & 0xFFFF; + e->offset1 = offset & 0xFFFF; + e->offset2 = (offset >> 16) & 0xFF; + e->access = access; + e->flags = flags << 4; + e->flags |= (limit >> 16) & 0xFF; + e->offset3 = (offset >> 24) & 0xFF; + e->offset4 = (offset >> 32) & 0xFFFFFFFF; + e->reserved = 0; } -static void reloadgdtr(){ - gdtr_t gdtr; - gdtr.offset = (uint64_t)&cls->gdt + arch_getcls(); - gdtr.size = sizeof(gdt_t) - 1; +gdtr_t gdtr; + +static void reloadgdtr(){ + +gdtr.offset = (uint64_t)&cls->gdt + arch_getcls(); +gdtr.size = sizeof(gdt_t) - 1; asm("lgdt (%%rax)" : : "a"(&gdtr) : "memory"); } @@ -28,18 +47,18 @@ void gdt_bspinit(){ setseg(&gdt->kdata16, 0xFFFFF, 0, FLAGS_PAGE_GRANULARITY, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_DATA_WRITE); - setseg(&gdt->kcode32, 0xFFFFF, 0, FLAGS_PAGE_GRANULARITY | FLAGS_PMODE, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_CODE_READ); + setseg(&gdt->kcode32, 0xFFFFF, 0, FLAGS_PAGE_GRANULARITY | FLAGS_PMODE, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_EXEC | ACCESS_CODE_READ); setseg(&gdt->kdata32, 0xFFFFF, 0, FLAGS_PAGE_GRANULARITY | FLAGS_PMODE, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_DATA_WRITE); - setseg(&gdt->kcode64, 0, 0, FLAGS_PAGE_GRANULARITY | FLAGS_LONG, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_EXEC | ACCESS_CODE_READ); + setseg(&gdt->kcode64, 0xFFFFF, 0, FLAGS_PAGE_GRANULARITY | FLAGS_LONG, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_EXEC | ACCESS_CODE_READ); - setseg(&gdt->kdata64, 0, 0, FLAGS_PAGE_GRANULARITY | FLAGS_LONG, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_DATA_WRITE); + setseg(&gdt->kdata64, 0xFFFFF, 0, FLAGS_PAGE_GRANULARITY | FLAGS_LONG, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_DATA_WRITE); - setseg(&gdt->kcode64, 0, 0, FLAGS_PAGE_GRANULARITY | FLAGS_LONG, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_EXEC | ACCESS_CODE_READ | ACCESS_DPL3); + setseg(&gdt->ucode64, 0xFFFFF, 0, FLAGS_PAGE_GRANULARITY | FLAGS_LONG, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_EXEC | ACCESS_CODE_READ | ACCESS_DPL3); - setseg(&gdt->kdata64, 0, 0, FLAGS_PAGE_GRANULARITY | FLAGS_LONG, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_DATA_WRITE | ACCESS_DPL3); + setseg(&gdt->udata64, 0xFFFFF, 0, FLAGS_PAGE_GRANULARITY | FLAGS_LONG, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_DATA_WRITE | ACCESS_DPL3); // TODO get this working right diff --git a/src/arch/x86_64/include/arch/gdt.h b/src/arch/x86_64/include/arch/gdt.h index 7e750506..1e0a5cb1 100644 --- a/src/arch/x86_64/include/arch/gdt.h +++ b/src/arch/x86_64/include/arch/gdt.h @@ -51,6 +51,8 @@ typedef struct{ segdesc kdata32; segdesc kcode64; segdesc kdata64; + segdesc ucode64; + segdesc udata64; sys64 ist; } gdt_t;