PatchworkOS
Loading...
Searching...
No Matches
gdt.h File Reference
#include <kernel/cpu/tss.h>
#include <kernel/defs.h>
#include <stdint.h>

Go to the source code of this file.

Data Structures

struct  gdt_desc_t
 GDT descriptor structure. More...
 
struct  gdt_segment_t
 A single GDT segment descriptor. More...
 
struct  gdt_long_system_segment_t
 A long mode system segment descriptor, used for TSS and LDT. More...
 
struct  gdt_t
 The actual GDT structure. More...
 

Enumerations

enum  gdt_ring_t {
  GDT_RING0 = 0 ,
  GDT_RING1 = 1 ,
  GDT_RING2 = 2 ,
  GDT_RING3 = 3
}
 
enum  gdt_segment_selector_t {
  GDT_NULL = 0 ,
  GDT_KERNEL_CODE = 0x08 ,
  GDT_KERNEL_DATA = 0x10 ,
  GDT_USER_DATA = 0x18 ,
  GDT_USER_CODE = 0x20 ,
  GDT_TSS = 0x28 ,
  GDT_CS_RING0 = GDT_KERNEL_CODE | GDT_RING0 ,
  GDT_SS_RING0 = GDT_KERNEL_DATA | GDT_RING0 ,
  GDT_CS_RING3 = GDT_USER_CODE | GDT_RING3 ,
  GDT_SS_RING3 = GDT_USER_DATA | GDT_RING3
}
 Segment selectors. More...
 
enum  gdt_access_t {
  GDT_ACCESS_ACCESSED = 1 << 0 ,
  GDT_ACCESS_READ_WRITE = 1 << 1 ,
  GDT_ACCESS_DIRECTION_CONFORMING = 1 << 2 ,
  GDT_ACCESS_EXEC = 1 << 3 ,
  GDT_ACCESS_SYSTEM = 0 << 4 ,
  GDT_ACCESS_DATA_CODE = 1 << 4 ,
  GDT_ACCESS_TYPE_LDT = 0x2 ,
  GDT_ACCESS_TYPE_TSS_AVAILABLE = 0x9 ,
  GDT_ACCESS_TYPE_TSS_BUSY = 0xB ,
  GDT_ACCESS_RING0 = 0 << 5 ,
  GDT_ACCESS_RING1 = 1 << 5 ,
  GDT_ACCESS_RING2 = 2 << 5 ,
  GDT_ACCESS_RING3 = 3 << 5 ,
  GDT_ACCESS_PRESENT = 1 << 7
}
 Access byte. More...
 
enum  gdt_flags_t {
  GDT_FLAGS_NONE = 0 ,
  GDT_FLAGS_RESERVED = 1 << 0 ,
  GDT_FLAGS_LONG_MODE = 1 << 1 ,
  GDT_FLAGS_SIZE = 1 << 2 ,
  GDT_FLAGS_4KB = 1 << 3
}
 Flags byte. More...
 

Functions

void gdt_load_descriptor (gdt_desc_t *descriptor)
 Loads a GDT descriptor.
 
void gdt_init (void)
 Initialize the GDT.
 
void gdt_cpu_load (void)
 Load the GDT on the current CPU.
 
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.