From 975a9ec96e282e437ccc1bdf1e660dcbf4542791 Mon Sep 17 00:00:00 2001 From: EmulatedSeasons <89668582+EmulatedSeasons@users.noreply.github.com> Date: Fri, 10 May 2024 01:44:59 -0400 Subject: Added GDT and basic IDT as well as a bitmap drawing function --- kernel/arch/x86_64/gdt.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 kernel/arch/x86_64/gdt.cpp (limited to 'kernel/arch/x86_64/gdt.cpp') diff --git a/kernel/arch/x86_64/gdt.cpp b/kernel/arch/x86_64/gdt.cpp new file mode 100644 index 0000000..19ec98e --- /dev/null +++ b/kernel/arch/x86_64/gdt.cpp @@ -0,0 +1,34 @@ +#include +#include "gdt.h" + +void gdt_entry(SegDesc* seg, uint32_t base, uint32_t limit, uint8_t access, uint8_t flags) { + // setting each part of the base by masking the part being set and shifting it to the right position + seg->base_low = base & 0xFFFF; + seg->base_mid = (base & 0xFF0000) >> 16; + seg->base_high = (base & 0xFF000000) >> 24; + + seg->limit_low = limit & 0xFFFF; + seg->flag_limit_high = (limit & 0xF0000) >> 16; + + // shifts flags to the right position and ors it with limit + seg->flag_limit_high |= (flags & 0xF) << 4; + + seg->access = access; +} + +void gdt_tss_entry(TssSegDesc* seg, uint64_t base, uint32_t limit, uint8_t access, uint8_t flags) { + // setting each part of the base by masking the part being set and shifting it to the right position + seg->base1 = base & 0xFFFF; + seg->base2 = (base & 0xFF0000) >> 16; + seg->base3 = (base & 0xFF000000) >> 24; + seg->base4 = (base & 0xFFFFFFFF00000000) >> 32; + + seg->limit_low = limit & 0xFFFF; + seg->flag_limit_high = (limit & 0xF0000) >> 16; + + // shifts flags to the right position and ors it with limit + seg->flag_limit_high |= (flags & 0xF) << 4; + + seg->access = access; + seg->reserved = 0; +} \ No newline at end of file -- cgit v1.2.3-70-g09d2