Cucumber/Kernel/src/Tier0/gdt.c

59 lines
1.7 KiB
C

#include "Tier0/gdt.h"
#include "Tier0/kstdlib.h"
#include "Tier0/kstdio.h"
#include "types.h"
// Our GDT will be stored here.
T_GDT_PTR g_GDTPointer;
T_GDT_SEGMENT g_GDTEntries[5];
void gdt_entry_create(u8 Index, u32 Base, u32 Limit, T_GDT_RING DPL, \
T_GDT_EXECUTABLE Code, T_GDT_RW ReadWrite, u8 Long)
{
g_GDTEntries[Index].LimitLow = Limit & 0xFFFF;
g_GDTEntries[Index].BaseLow = Base & 0xFFFF;
g_GDTEntries[Index].BaseMiddle = (Base >> 16) & 0xFF;
g_GDTEntries[Index].SegmentType = ((u8)Code << 3);
g_GDTEntries[Index].SegmentType |= ((u8)ReadWrite << 1);
g_GDTEntries[Index].DescriptorType = 1;
g_GDTEntries[Index].DPL = DPL;
g_GDTEntries[Index].Present = 1;
g_GDTEntries[Index].LimitMiddle = Limit >> 16;
g_GDTEntries[Index].SystemAvailable = 0;
g_GDTEntries[Index].LongMode = Long;
g_GDTEntries[Index].OperationSize = !Long;
g_GDTEntries[Index].Granularity = 1;
g_GDTEntries[Index].BaseHigh = Base >> 24;
}
void gdt_entry_create_null(u8 Index)
{
kmemset(&g_GDTEntries[Index], 0, 8);
}
void gdt_create_flat(void)
{
g_GDTPointer.Size = sizeof(T_GDT_SEGMENT) * 5 - 1;
g_GDTPointer.Address = (u64)&g_GDTEntries;
gdt_entry_create_null(0);
gdt_entry_create(1, 0, 0xFFFFFFFF, GDT_RING0, GDT_EXECUTABLE, GDT_RW, 0);
gdt_entry_create(2, 0, 0xFFFFFFFF, GDT_RING0, GDT_NOT_EXECUTABLE, GDT_RW, 0);
gdt_entry_create(3, 0, 0xFFFFFFFF, GDT_RING0, GDT_EXECUTABLE, GDT_RW, 1);
gdt_entry_create(4, 0, 0xFFFFFFFF, GDT_RING0, GDT_NOT_EXECUTABLE, GDT_RW, 1);
kprintf("[i] Setting GDT:\n");
for (u32 i = 0; i < 5; i++)
{
kprintf("%x", *((u32 *)g_GDTEntries + 2 * i + 1));
kprintf("%x\n", *((u32 *)g_GDTEntries + 2 * i));
}
// gdt_flush();
}