29#define GDT_KERNEL_CODE 0x08
30#define GDT_KERNEL_DATA 0x10
31#define GDT_USER_DATA 0x18
32#define GDT_USER_CODE 0x20
35#define GDT_CS_RING0 (GDT_KERNEL_CODE | GDT_RING0)
36#define GDT_SS_RING0 (GDT_KERNEL_DATA | GDT_RING0)
38#define GDT_CS_RING3 (GDT_USER_CODE | GDT_RING3)
39#define GDT_SS_RING3 (GDT_USER_DATA | GDT_RING3)
41#define GDT_ACCESS_ACCESSED (1 << 0)
42#define GDT_ACCESS_READ_WRITE \
44#define GDT_ACCESS_DIRECTION_CONFORMING \
46#define GDT_ACCESS_EXEC (1 << 3)
47#define GDT_ACCESS_SYSTEM (0 << 4)
48#define GDT_ACCESS_DATA_CODE (1 << 4)
50#define GDT_ACCESS_TYPE_LDT 0x2
51#define GDT_ACCESS_TYPE_TSS_AVAILABLE 0x9
52#define GDT_ACCESS_TYPE_TSS_BUSY 0xB
54#define GDT_ACCESS_RING0 (0 << 5)
55#define GDT_ACCESS_RING1 (1 << 5)
56#define GDT_ACCESS_RING2 (2 << 5)
57#define GDT_ACCESS_RING3 (3 << 5)
59#define GDT_ACCESS_PRESENT (1 << 7)
61#define GDT_FLAGS_NONE 0
62#define GDT_FLAGS_RESERVED (1 << 0)
63#define GDT_FLAGS_LONG_MODE (1 << 1)
64#define GDT_FLAGS_SIZE \
66#define GDT_FLAGS_4KB (1 << 3)
void gdt_cpu_tss_load(tss_t *tss)
Load a TSS into the GDT and load it using the ltr instruction on the current CPU.
void gdt_init(void)
Initialize the GDT.
void gdt_load_descriptor(gdt_desc_t *descriptor)
Loads a GDT descriptor.
void gdt_cpu_load(void)
Load the GDT on the current CPU.
#define PACKED
GCC packed attribute.
GDT descriptor structure.
uint64_t offset
Address of the GDT.
uint16_t size
Size of the GDT - 1.
A long mode system segment descriptor, used for TSS and LDT.
uint8_t flagsAndLimitHigh
A single GDT segment descriptor.
uint8_t flagsAndLimitHigh
The actual GDT structure.
gdt_long_system_segment_t tssDesc
Task State Segment structure.