#include void write_tss(struct tss_entry *tss, struct gdt_entry *gdt, int num, uint16_t ss0, uint32_t esp0) { uint32_t base = (uint32_t)tss; uint32_t limit = base + sizeof(struct tss_entry); gdt[num].base_low = base & 0xFFFF; gdt[num].base_middle = (base >> 16) & 0xFF; gdt[num].base_high = (base >> 24) & 0xFF; gdt[num].limit_low = limit & 0xFFFF; gdt[num].granularity = (limit >> 16) & 0x0F; gdt[num].granularity |= 0x40; gdt[num].access = 0x89; memset(&tss, 0, sizeof(struct tss_entry)); tss->ss0 = ss0; tss->esp0 = esp0; tss->cs = 0x0b; tss->ss = tss->ds = tss->es = tss->fs = tss->gs = 0x13; } void tss_flush(uint16_t tss_selector) { asm volatile ( "ltr %0" : // no output : "r" (tss_selector) ); }