#pragma once #include typedef struct __attribute__((packed)) { uint16_t size; uint64_t ptr; } gdt_load; typedef struct __attribute__((packed)) { uint64_t limit: 16; uint64_t base_low: 16; uint64_t base_mid: 8; uint64_t A: 1; uint64_t R: 1; uint64_t C: 1; uint64_t one0: 1; uint64_t one1: 1; uint64_t DPL: 2; uint64_t P: 1; uint64_t limit_high: 4; uint64_t AVL: 1; uint64_t L: 1; uint64_t D: 1; uint64_t G: 1; uint64_t base_high: 8; } code_segment; typedef struct __attribute__((packed)) { uint64_t limit: 16; uint64_t base_low: 16; uint64_t base_mid: 8; uint64_t A: 1; uint64_t W: 1; uint64_t E: 1; uint64_t zero: 1; uint64_t one: 1; uint64_t DPL: 2; uint64_t P: 1; uint64_t limit_high: 4; uint64_t AVL: 1; uint64_t L: 1; uint64_t D: 1; uint64_t G: 1; uint64_t base_high: 8; } data_segment; typedef struct __attribute__((packed)) { uint64_t limit_low: 16; uint64_t base_low: 24; uint64_t type: 4; uint64_t zero0: 1; uint64_t DPL: 2; uint64_t P: 1; uint64_t limit_high: 4; uint64_t AVL: 1; uint64_t zero1: 1; uint64_t zero2: 1; uint64_t G: 1; uint64_t base_high: 40; uint64_t rsv1: 8; uint64_t zero3: 5; uint64_t rsv2: 19; } tss_segment; typedef struct __attribute__((packed)) { uint32_t rsv0; uint64_t rsp0; uint64_t rsp1; uint64_t rsp2; uint64_t rsv1; uint64_t ist1; uint64_t ist2; uint64_t ist3; uint64_t ist4; uint64_t ist5; uint64_t ist6; uint64_t ist7; uint64_t rsv2; uint16_t rsv3; uint16_t io_base; } tss; int init_gdt(); uint64_t create_descriptor(uint32_t base, uint32_t limit, uint8_t access_byte, uint16_t flag); uint64_t convert_code_segment(code_segment* segment); uint64_t convert_data_segment(data_segment* segment); void create_system_segment_descriptor();