void tss::write(int32_t num, uint16_t ss0, uint32_t esp0) { uint32_t base = (uint32_t)&tss_entry; uint32_t limit = base + sizeof(tss_entry); gdt::set_gate(num, base, limit, 0xE9, 0x00); memset_v(&tss_entry, 0x0, sizeof(tss_entry)); tss_entry.ss0 = ss0; tss_entry.esp0 = esp0; tss_entry.cs = 0x0b; tss_entry.ss = tss_entry.ds = tss_entry.es = tss_entry.fs = tss_entry.gs = 0x13; }
int main(void) { char test[512]; static void *(*const volatile memset_v)(void *, int, size_t) = &memset; memset_v(test, 0, 512); return 0; }