Go to the documentation of this file.
9 #define GDT_SET(entry, t, d, b, l) \
11 unsigned long limit; \
20 (entry).base0 = (b) & 0x0000FFFFu; \
21 (entry).base1 = ((b) & 0x00FF0000u) >> 16; \
22 (entry).base2 = ((b) >> 24) & 0x0FFu; \
23 limit = (entry).g ? ((l) >> 12) : ((l) & 0x000FFFFF); \
24 (entry).limit0 = limit & 0x0000FFFFu; \
25 (entry).limit1 = (limit >> 16) & 0x0000000Fu; \
28 #define TSS_SET(entry, d, b, l) \
30 unsigned long limit; \
31 (entry).type = 0x09; \
38 (entry).base_low = (b) & 0x0000FFFF; \
39 (entry).base_high_low = ((b) & 0x00FF0000) >> 16; \
40 (entry).base_high_high= ((b) >> 24) & 0x000000FF; \
41 limit = (entry).g ? ((l) >> 12) : ((l) & 0x000FFFFF); \
42 (entry).segment_limit_low = limit & 0x0000FFFFu; \
43 (entry).segment_limit_high = (limit >> 16) & 0x0000000Fu; \
47 static struct tss32 s_tss = {
49 .io_bitmap = {
'\0', },
57 memset(s_gdt + 0, 0,
sizeof(*s_gdt));
67 tss = (
struct tss*)(s_gdt +
DESC_TSS);
70 gdtr.
base = (
unsigned long)s_gdt;
71 gdtr.
limit =
sizeof(s_gdt) - 1;
73 asm volatile (
"lgdt (%0)"::
"g"(&gdtr));