Kernel: More GDT refactoring

This commit is contained in:
apio 2022-10-12 13:12:46 +02:00
parent c1f9d3323f
commit cf3f61e373

View File

@ -78,14 +78,19 @@ static void set_limit(GDTEntry* entry, uint32_t limit)
entry->limit1_flags = (entry->limit1_flags & 0xF0) | ((limit >> 16) & 0xF); entry->limit1_flags = (entry->limit1_flags & 0xF0) | ((limit >> 16) & 0xF);
} }
static void set_tss_base(GDTEntry* tss1, HighGDTEntry* tss2, uint64_t addr)
{
set_base(tss1, addr & 0xffffffff);
tss2->base_high = (uint32_t)(addr >> 32);
}
static void setup_tss() static void setup_tss()
{ {
memset(&main_tss, 0, sizeof(TSS)); memset(&main_tss, 0, sizeof(TSS));
main_tss.rsp[0] = main_tss.rsp[0] =
(uint64_t)MemoryManager::get_pages(4) + (PAGE_SIZE * 4) - 8; // allocate 16KB for the syscall stack (uint64_t)MemoryManager::get_pages(4) + (PAGE_SIZE * 4) - 8; // allocate 16KB for the syscall stack
main_tss.iomap_base = sizeof(TSS); main_tss.iomap_base = sizeof(TSS);
set_base(&internal_gdt.tss, (uint64_t)&main_tss & 0xffffffff); set_tss_base(&internal_gdt.tss, &internal_gdt.tss2, (uint64_t)&main_tss);
internal_gdt.tss2.base_high = (uint32_t)(((uint64_t)&main_tss >> 32) & 0xffffffff);
set_limit(&internal_gdt.tss, sizeof(TSS) - 1); set_limit(&internal_gdt.tss, sizeof(TSS) - 1);
} }