From 49cfee4e370892df8404e56d53b04dde196f82f2 Mon Sep 17 00:00:00 2001 From: Alexey Gavrilov Date: Sun, 31 Mar 2024 14:39:51 +0700 Subject: IDT + uintptr update --- arch/x86/gdt/Gdt.cpp | 60 ++++++++++++++++++++++++++++------------------------ arch/x86/gdt/Gdt.h | 27 ++++++++++++++--------- 2 files changed, 49 insertions(+), 38 deletions(-) (limited to 'arch/x86/gdt') diff --git a/arch/x86/gdt/Gdt.cpp b/arch/x86/gdt/Gdt.cpp index 21941b4..70f30cd 100755 --- a/arch/x86/gdt/Gdt.cpp +++ b/arch/x86/gdt/Gdt.cpp @@ -2,6 +2,21 @@ uint64 MngGdt::gdt[MngGdt::size]; +bool MngGdt::isInitialize = false; +bool MngGdt::gdtLoaded = false; +MngGdt mngGdt; + +MngGdt::MngGdt() +{ + if(!isInitialize) + { + MemoryOperations::set(gdt, 0, sizeof(uint64) * size); + currIdx = 1; + gdtLoaded = false; + isInitialize = true; + codeSegmentKern = NULL; + } +}; DescSeg32::DescSeg32(uint32 base, uint32 limit, uint8 access, uint8 flags) { @@ -57,59 +72,48 @@ uint64 DescSeg32::flatDataUser() , PAGEGRAN | HIGHSIZE).getDescriptor(); }; -MngGdt::MngGdt() -{ - gdt[0] = 0; - currIdx = 1; - isGdtLoaded = 0; -}; - bool MngGdt::addDescriptor(uint64 desc) { - if(currIdx >= size || currIdx == 0) + if(currIdx >= size or currIdx == 0 or gdtLoaded) { return false; } + if(desc == DescSeg32::flatCodeKernel()) codeSegmentKern = currIdx * 8; this->gdt[currIdx++] = desc; return true; }; bool MngGdt::loadGdt() { - if(isGdtLoaded) + if(gdtLoaded) { return false; } - uint64 pointer = 0; + // Set pointer + uint64 descriptor = 0; uint16 size = sizeof(uint64) * this->size - 1; - uint32 offset = (uint32)((void *)(&gdt)); + uint32 offset = (uint32)(&gdt); - pointer |= offset; - pointer <<= 16; - pointer |= size; + descriptor |= offset; + descriptor <<= 16; + descriptor |= size; - SWITCHTOGDT(pointer); + SWITCHTOGDT(descriptor); - isGdtLoaded = 1; + gdtLoaded = 1; return true; }; -bool MngGdt::getIsGdtLoaded() +// Get static instance of MngGdt initialized once +MngGdt &MngGdt::getInstance() { - return isGdtLoaded; + if(!isInitialize) mngGdt = MngGdt(); + return mngGdt; }; -void MngGdt::operator=(const MngGdt& src) +uint16 MngGdt::getCodeSegmentKernel() { - if(this->isGdtLoaded == 1 || src.isGdtLoaded == 1) - { - return; - } - - // Fix it. Write method to copy from ... to ... - for(int i = 0; i < this->size; i++) this->gdt[i] = src.gdt[i]; - this->isGdtLoaded = src.isGdtLoaded; - this->currIdx = src.currIdx; + return codeSegmentKern; }; diff --git a/arch/x86/gdt/Gdt.h b/arch/x86/gdt/Gdt.h index 6667d93..321d67c 100755 --- a/arch/x86/gdt/Gdt.h +++ b/arch/x86/gdt/Gdt.h @@ -2,6 +2,7 @@ #define GDT_H #include +#include // Define access options @@ -59,7 +60,7 @@ class DescSeg32 // Segment descriptor #ifdef __cplusplus extern "C" { #endif -extern void SWITCHTOGDT(uint64 pointer); +extern void SWITCHTOGDT(uint64 descriptor); #ifdef __cplusplus }; #endif @@ -67,17 +68,23 @@ extern void SWITCHTOGDT(uint64 pointer); class MngGdt { private: - const static uint8 size = 10; - static uint64 gdt[size]; - uint8 currIdx; - bool isGdtLoaded; + const static uint8 size = 10; + static uint64 gdt[size]; + static bool isInitialize; + static bool gdtLoaded; + uint16 codeSegmentKern; + uint8 currIdx; + MngGdt &operator=(const MngGdt &) = default; public: - MngGdt(); - void operator=(const MngGdt& src); - bool addDescriptor(uint64 desc); // 0 - not set descriptor, 1 - set - bool loadGdt(); // 0 - if GDT is not loaded, 1 - loaded - bool getIsGdtLoaded(); + MngGdt(); + MngGdt(const MngGdt &) = delete; + bool addDescriptor(uint64 desc); // 0 - not set descriptor, 1 - set + bool loadGdt(); // 0 - if GDT is not loaded, 1 - loaded + uint16 getCodeSegmentKernel(); + static MngGdt &getInstance(); }; +extern MngGdt mngGdt; + #endif -- cgit v1.2.3