rk/kernel/gdt.c
2024-05-26 01:33:18 -05:00

29 lines
811 B
C

#include <kernel/gdt.h>
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)
);
}