aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/gdt.h
diff options
context:
space:
mode:
authorGravatar ornitorrincos 2026-08-18 12:15:05 +0200
committerGravatar ornitorrincos 2026-08-18 12:15:05 +0200
commit132d3236bb884433bf94e961f6d32264e0334aec (patch)
tree06638976b06f019ea4037175ff228f8271057c44 /kernel/gdt.h
Diffstat (limited to 'kernel/gdt.h')
-rw-r--r--kernel/gdt.h93
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();