diff options
| author | 2026-08-18 12:15:05 +0200 | |
|---|---|---|
| committer | 2026-08-18 12:15:05 +0200 | |
| commit | 132d3236bb884433bf94e961f6d32264e0334aec (patch) | |
| tree | 06638976b06f019ea4037175ff228f8271057c44 /kernel/gdt.h | |
Diffstat (limited to 'kernel/gdt.h')
| -rw-r--r-- | kernel/gdt.h | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/kernel/gdt.h b/kernel/gdt.h new file mode 100644 index 0000000..c0ba677 --- /dev/null +++ b/kernel/gdt.h @@ -0,0 +1,93 @@ +#pragma once + +#include <stdint.h> + +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(); |
