From 132d3236bb884433bf94e961f6d32264e0334aec Mon Sep 17 00:00:00 2001 From: ornitorrincos Date: Tue, 18 Aug 2026 12:15:05 +0200 Subject: --- kernel/gdt.h | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 kernel/gdt.h (limited to 'kernel/gdt.h') 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 + +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(); -- cgit v1.2.3-70-g09d2