#include "gdt.h" tss_entry tss = tss_entry_init(0xfffff800, 0x10, 0x0b, 0x13); gdt_entry gdt[] = { gdt_entry_init(0, 0, 0), gdt_entry_init(0, 0xfffff, 0xc09a), // Code segment. gdt_entry_init(0, 0xfffff, 0xc092), // Data segment. gdt_entry_init(0, 0xfffff, 0xc0fa), // User mode code segment. gdt_entry_init(0, 0xfffff, 0xc0f2), // User mode data segment. gdt_entry_init(0, sizeof(tss_entry), 0x00e9), // TSS. }; gdt_ptr gdtr = { .base = gdt, .limit = sizeof(gdt) - 1 }; void gdt_init() { gdt[5].base_low = (uint32_t)&tss & 0xffff; gdt[5].base_mid = (uint32_t)&tss >> 16 & 0xff; gdt[5].base_high = (uint32_t)&tss >> 24 & 0xff; asm volatile( "lgdt (%0)\n" "mov %w1, %%ds\n" "mov %w1, %%es\n" "mov %w1, %%fs\n" "mov %w1, %%gs\n" "mov %w1, %%ss\n" "ljmp $0x08, $.flush\n" ".flush:\n" "ltr %w2\n" : : "r" (&gdtr), "r" (0x10), "r" (0x28) ); }