Global Descriptor Table.
The global descriptor table is a legacy feature from the days of 32-bit x86 and older. Most of its features are unused, but is still required in 64-bit mode to specify the current privilage level and to load the TSS.
|
| #define | GDT_RING0 0 |
| | Kernel ring.
|
| |
| #define | GDT_RING1 1 |
| | Unused ring.
|
| |
| #define | GDT_RING2 2 |
| | Unused ring.
|
| |
| #define | GDT_RING3 3 |
| | User ring.
|
| |
| #define | GDT_NULL 0 |
| | Null segment selector, unused but the gdt must start with it.
|
| |
| #define | GDT_KERNEL_CODE 0x08 |
| | Kernel code segment selector.
|
| |
| #define | GDT_KERNEL_DATA 0x10 |
| | Kernel data segment selector.
|
| |
| #define | GDT_USER_DATA 0x18 |
| | User data segment selector.
|
| |
| #define | GDT_USER_CODE 0x20 |
| | User code segment selector.
|
| |
| #define | GDT_TSS 0x28 |
| | TSS segment selector.
|
| |
| #define | GDT_CS_RING0 (GDT_KERNEL_CODE | GDT_RING0) |
| | Value to load into the CS register for kernel code.
|
| |
| #define | GDT_SS_RING0 (GDT_KERNEL_DATA | GDT_RING0) |
| | Value to load into the SS register for kernel data.
|
| |
| #define | GDT_CS_RING3 (GDT_USER_CODE | GDT_RING3) |
| | Value to load into the CS register for user code.
|
| |
| #define | GDT_SS_RING3 (GDT_USER_DATA | GDT_RING3) |
| | Value to load into the SS register for user data.
|
| |
| #define | GDT_ACCESS_ACCESSED (1 << 0) |
| | Will be set to 1 when accessed, but its best to set it to 1 manually.
|
| |
| #define | GDT_ACCESS_READ_WRITE (1 << 1) |
| | If set on a code segment, its readable. If set on a data segment, its writable./*#end#*/.
|
| |
| #define | GDT_ACCESS_DIRECTION_CONFORMING (1 << 2) |
| | If set on a data segment, the segment grows downwards. If set on a code segment, conforming./*#end#*/.
|
| |
| #define | GDT_ACCESS_EXEC (1 << 3) |
| | If set, the segment is a code segment. If clear, its a data segment.
|
| |
| #define | GDT_ACCESS_SYSTEM (0 << 4) |
| | Is a system segment.
|
| |
| #define | GDT_ACCESS_DATA_CODE (1 << 4) |
| | Is a data or code segment.
|
| |
| #define | GDT_ACCESS_TYPE_LDT 0x2 |
| | Local Descriptor Table. Only used if the SYSTEM bit is 0.
|
| |
| #define | GDT_ACCESS_TYPE_TSS_AVAILABLE 0x9 |
| | Available 64-bit Task State Segment. Only used if the SYSTEM bit is 0.
|
| |
| #define | GDT_ACCESS_TYPE_TSS_BUSY 0xB |
| | Busy 64-bit Task State Segment. Only used if the SYSTEM bit is 0.
|
| |
| #define | GDT_ACCESS_RING0 (0 << 5) |
| | Descriptor Privilege Level 0 (kernel).
|
| |
| #define | GDT_ACCESS_RING1 (1 << 5) |
| | Descriptor Privilege Level 1, unused.
|
| |
| #define | GDT_ACCESS_RING2 (2 << 5) |
| | Descriptor Privilege Level 2, unused.
|
| |
| #define | GDT_ACCESS_RING3 (3 << 5) |
| | Descriptor Privilege Level 3 (user).
|
| |
| #define | GDT_ACCESS_PRESENT (1 << 7) |
| | Must be 1 for all valid segments.
|
| |
| #define | GDT_FLAGS_NONE 0 |
| | No flags set.
|
| |
| #define | GDT_FLAGS_RESERVED (1 << 0) |
| | Must be 0.
|
| |
| #define | GDT_FLAGS_LONG_MODE (1 << 1) |
| | If set, its a 64-bit code segment.
|
| |
| #define | GDT_FLAGS_SIZE (1 << 2) |
| | If set, its a 32-bit segment. If clear, its a 16-bit segment. Ignored in 64-bit mode./*#end#*/.
|
| |
| #define | GDT_FLAGS_4KB (1 << 3) |
| | If set, the limit is in 4KiB blocks. If clear, the limit is in bytes.
|
| |
| 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.
Note that the actual TTS descriptor in the GDT can be shared between CPUs, as its only used while loading the TSS, after that its just useless.
- Parameters
-
Definition at line 64 of file gdt.c.