29 lines
804 B
C
29 lines
804 B
C
|
#include <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)
|
||
|
);
|
||
|
}
|