Cucumber/src/Tier0/gdt.c

46 lines
1.3 KiB
C

#include "Tier0/gdt.h"
#include "Tier0/kstdlib.h"
#include "types.h"
// Our GDT will be stored here.
T_GDT_PTR g_gdt_ptr;
T_GDT_ENTRY g_gdt_entries[3];
void gdt_entry_create(u8 Index, u32 Base, u32 Limit, T_GDT_RING Ring, \
T_GDT_EXECUTABLE Executable, T_GDT_RW ReadWrite)
{
g_gdt_entries[Index].BaseLow = (Base & 0xFFFF);
g_gdt_entries[Index].BaseMiddle = ((Base >> 16) & 0xFF);
g_gdt_entries[Index].BaseHigh = ((Base >> 24) & 0xFF);
g_gdt_entries[Index].LimitLow = (Limit & 0xFFFF);
g_gdt_entries[Index].Granularity = ((Limit >> 16) & 0x0F);
// Let's set the granularity and size nibble to 0xC0
g_gdt_entries[Index].Granularity |= 0xC0;
g_gdt_entries[Index].Access = 0b10010000;
g_gdt_entries[Index].Access |= ((((u8)ReadWrite) << 1) & 0b00000010);
g_gdt_entries[Index].Access |= ((((u8)Executable) << 3) & 0b00001000);
g_gdt_entries[Index].Access |= ((((u8)Ring) << 5) & 0b01100000);
}
void gdt_entry_create_null(u8 Index)
{
kmemsetw(&g_gdt_entries[Index], 0, 4);
}
void gdt_create_flat(void)
{
g_gdt_ptr.Size = sizeof(T_GDT_ENTRY) * 6 - 1;
g_gdt_ptr.Address = (u32)&g_gdt_entries;
gdt_entry_create_null(0);
gdt_entry_create(1, 0, 0xFFFFFFFF, GDT_RING0, GDT_EXECUTABLE, GDT_RW);
gdt_entry_create(2, 0, 0xFFFFFFFF, GDT_RING0, GDT_NOT_EXECUTABLE, GDT_RW);
gdt_flush();
}