2011-08-27 20:08:59 +00:00
|
|
|
#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));
|
|
|
|
}
|
|
|
|
|
2012-05-17 09:33:34 +00:00
|
|
|
// gdt_flush();
|
2011-08-27 20:08:59 +00:00
|
|
|
}
|
|
|
|
|