#ifndef SOCKS_X86_64__GDT_H_ #define SOCKS_X86_64__GDT_H_ #include #include #define NR_GDT_ENTRIES 5 #define GDT_A_PRESENT (1 << 7) #define GDT_A_USER (3 << 5) #define GDT_A_CODE (3 << 3) #define GDT_A_DATA (8 << 1) #define GDT_A_RPLK (1 << 5) #define GDT_A_CODEREAD (1 << 1) #define GDT_A_DATAWRITE (1 << 1) #define GDT_A_GROWUP (1 << 5) #define GDT_F_64BIT (0x2F) #define GDT_F_32BIT (0x4F) #define GDT_F_16BIT (0xF) struct gdt_entry { uint16_t ge_limit_low; uint16_t ge_base_low; uint8_t ge_base_mid; uint8_t ge_access; uint8_t ge_gran; uint8_t ge_base_hi; } __packed; struct gdt { struct gdt_entry g_entries[NR_GDT_ENTRIES]; } __packed; struct gdt_ptr { uint16_t g_limit; uint64_t g_ptr; } __packed; extern int gdt_init(struct gdt *gdt, struct gdt_ptr *gdtp); extern int gdt_load(struct gdt_ptr *gdtp); #endif