From 8e579133cc27ef87c14a44b133407b483875cb96 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 5 Nov 2022 06:31:45 +0200 Subject: [PATCH] Updated GDT code --- .../amd64/cpu/GlobalDescriptorTable.cpp | 67 +++++++++++++++++-- Architecture/amd64/cpu/gdt.hpp | 34 ++++++++++ 2 files changed, 95 insertions(+), 6 deletions(-) diff --git a/Architecture/amd64/cpu/GlobalDescriptorTable.cpp b/Architecture/amd64/cpu/GlobalDescriptorTable.cpp index 239fe09..764df07 100644 --- a/Architecture/amd64/cpu/GlobalDescriptorTable.cpp +++ b/Architecture/amd64/cpu/GlobalDescriptorTable.cpp @@ -8,12 +8,67 @@ namespace GlobalDescriptorTable { static GlobalDescriptorTableEntries GDTEntries = { - {.Length = 0x0000, .BaseLow = 0x0000, .BaseMiddle = 0x00, .Access = 0b00000000, .Flags = 0b00000000, .BaseHigh = 0x00}, // null - {.Length = 0x0000, .BaseLow = 0x0000, .BaseMiddle = 0x00, .Access = 0b10011010, .Flags = 0b00100000, .BaseHigh = 0x00}, // kernel code - {.Length = 0x0000, .BaseLow = 0x0000, .BaseMiddle = 0x00, .Access = 0b10010010, .Flags = 0b00000000, .BaseHigh = 0x00}, // kernel data - {.Length = 0x0000, .BaseLow = 0x0000, .BaseMiddle = 0x00, .Access = 0b11111010, .Flags = 0b00100000, .BaseHigh = 0x00}, // user code - {.Length = 0x0000, .BaseLow = 0x0000, .BaseMiddle = 0x00, .Access = 0b11110010, .Flags = 0b00000000, .BaseHigh = 0x00}, // user data - {.Length = 0, .Low = 0, .Middle = 0, .Flags1 = 0b10001001, .Flags2 = 0b00000000, .High = 0, .Upper32 = 0, .Reserved = 0}}; // tss + // null + {.Length = 0x0, + .BaseLow = 0x0, + .BaseMiddle = 0x0, + .Access = 0b00000000, + .Flags = 0b00000000, + .BaseHigh = 0x0}, + + // kernel code + {.Length = 0x0, + .BaseLow = 0x0, + .BaseMiddle = 0x0, + .Access = RING0 | + CODE_READABLE | + CODE_SEGMENT | + PRESENT, + .Flags = _64BITS, + .BaseHigh = 0x0}, + + // kernel data + {.Length = 0x0, + .BaseLow = 0x0, + .BaseMiddle = 0x0, + .Access = RING0 | + DATA_WRITEABLE | + DATA_SEGMENT | + PRESENT, + .Flags = 0b00000000, + .BaseHigh = 0x0}, + + // user code + {.Length = 0x0, + .BaseLow = 0x0, + .BaseMiddle = 0x0, + .Access = CODE_READABLE | + CODE_SEGMENT | + RING3 | + PRESENT, + .Flags = _64BITS, + .BaseHigh = 0x0}, + + // user data + {.Length = 0x0, + .BaseLow = 0x0, + .BaseMiddle = 0x0, + .Access = DATA_WRITEABLE | + DATA_SEGMENT | + RING3 | + PRESENT, + .Flags = 0b00000000, + .BaseHigh = 0x0}, + + // tss + {.Length = 0x0, + .Low = 0x0, + .Middle = 0x0, + .Flags1 = 0b10001001, + .Flags2 = 0b00000000, + .High = 0x0, + .Upper32 = 0x0, + .Reserved = 0x0}}; GlobalDescriptorTableDescriptor gdt = {.Length = sizeof(GlobalDescriptorTableEntries) - 1, .Entries = &GDTEntries}; diff --git a/Architecture/amd64/cpu/gdt.hpp b/Architecture/amd64/cpu/gdt.hpp index ed3abda..7bc1d9c 100644 --- a/Architecture/amd64/cpu/gdt.hpp +++ b/Architecture/amd64/cpu/gdt.hpp @@ -5,6 +5,40 @@ namespace GlobalDescriptorTable { + /* https://github.com/nanobyte-dev/nanobyte_os/blob/master/src/kernel/arch/i686/gdt.c */ + /* https://wiki.osdev.org/Global_Descriptor_Table */ + typedef enum + { + CODE_READABLE = 0b00000010, + DATA_WRITEABLE = 0b00000010, + + CODE_CONFORMING = 0b00000100, + DATA_DIRECTION_NORMAL = 0b00000000, + DATA_DIRECTION_DOWN = 0b00000100, + + DATA_SEGMENT = 0b00010000, + CODE_SEGMENT = 0b00011000, + + DESCRIPTOR_TSS = 0b00000000, + + RING0 = 0b00000000, + RING1 = 0b00100000, + RING2 = 0b01000000, + RING3 = 0b01100000, + + PRESENT = 0b10000000 + } AccessFlags; + + typedef enum + { + _64BITS = 0b00100000, + _32BITS = 0b01000000, + _16BITS = 0b00000000, + + GRANULARITY_1B = 0b00000000, + GRANULARITY_4K = 0b10000000 + } GDTFlags; + typedef struct _TaskStateSegmentEntry { uint16_t Length;