diff options
| author | Amlal <amlal@el-mahrouss-logic.com> | 2024-09-06 13:49:29 +0200 |
|---|---|---|
| committer | Amlal <amlal@el-mahrouss-logic.com> | 2024-09-06 13:50:47 +0200 |
| commit | 48d5ea1be488018bc4b83be08b9d87b0e259e3f1 (patch) | |
| tree | a97cdde46e3e41db9f66f85db49189aa3c9e4441 | |
| parent | 39d95f7fb429c5c6b71cd7c1e985cadaf4ab7b83 (diff) | |
[ IMP ] Lots of fixes regarding GDT, IDT, HW Threads and Scheduler.
Signed-off-by: Amlal <amlal@el-mahrouss-logic.com>
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx | 6 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx | 17 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm | 23 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalKernelMain.cxx | 39 | ||||
| -rw-r--r-- | dev/ZKA/Sources/ExeMain.cxx | 8 | ||||
| -rw-r--r-- | dev/ZKA/Sources/HardwareThreadScheduler.cxx | 30 | ||||
| -rw-r--r-- | dev/ZKA/Sources/UserProcessScheduler.cxx | 7 |
7 files changed, 58 insertions, 72 deletions
diff --git a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx index 7a6e726a..ab160648 100644 --- a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx +++ b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx @@ -52,6 +52,12 @@ namespace Kernel kcout << "Size of pointer (TIB): " << number(TIB(ptr_bit_set[1])) << endl; kcout << "Address Of Header: " << hex_number((UIntPtr)ptr_bit_set) << endl; + if (rw) + mm_update_pte(base_ptr, eFlagsRw); + + if (user) + mm_update_pte(base_ptr, eFlagsUser); + return (VoidPtr)ptr_bit_set; } } diff --git a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx index 54b62b80..90ee3291 100644 --- a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx +++ b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx @@ -19,7 +19,7 @@ namespace Kernel::HAL auto a2 = HAL::In8(0xa2); HAL::Out8(0x20, 0x11); - + HAL::Out8(0xA0, 0x11); HAL::Out8(0x21, 32); @@ -48,20 +48,7 @@ namespace Kernel::HAL { volatile ::Kernel::UIntPtr** ptr_ivt = (volatile ::Kernel::UIntPtr**)idt.Base; - for (UInt16 idt_indx = 0; idt_indx < 12; ++idt_indx) - { - Detail::kInterruptVectorTable[idt_indx].Selector = kGdtKernelCodeSelector; - Detail::kInterruptVectorTable[idt_indx].Ist = 0; - Detail::kInterruptVectorTable[idt_indx].TypeAttributes = kTrapGate; - Detail::kInterruptVectorTable[idt_indx].OffsetLow = ((UIntPtr)ptr_ivt[idt_indx] & __INT16_MAX__); - Detail::kInterruptVectorTable[idt_indx].OffsetMid = (((UIntPtr)ptr_ivt[idt_indx] >> 16) & __INT16_MAX__); - Detail::kInterruptVectorTable[idt_indx].OffsetHigh = - (((UIntPtr)ptr_ivt[idt_indx] >> 32) & __INT32_MAX__); - - Detail::kInterruptVectorTable[idt_indx].Zero = 0x0; - } - - for (UInt16 idt_indx = 13; idt_indx < kKernelIdtSize; ++idt_indx) + for (UInt16 idt_indx = 0; idt_indx < kKernelIdtSize; ++idt_indx) { Detail::kInterruptVectorTable[idt_indx].Selector = kGdtKernelCodeSelector; Detail::kInterruptVectorTable[idt_indx].Ist = 0; diff --git a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm index 6abd28c9..49e02ee1 100644 --- a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm @@ -155,7 +155,7 @@ IntNormal 49 [extern hal_kernel_call_enter] IntNormal 50 - + __ZKA_INT_51: cli @@ -216,19 +216,28 @@ section .text [global hal_load_gdt] hal_load_gdt: - lgdt [rcx] cli - push 8 - push hal_reload_segments - o64 retf -hal_reload_segments: - mov ax, 16 + + lgdt [rcx] + + mov ax, 0x10 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax + + mov rax, 0x08 + push rax + push hal_reload_segments + + o64 retf + +extern hal_real_init + +hal_reload_segments: sti + jmp hal_real_init ret global hal_load_idt diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx index c73eed5f..8d07e700 100644 --- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx +++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx @@ -54,26 +54,15 @@ namespace Kernel::HAL } // namespace Kernel::HAL Kernel::Property cKernelVersion; -Kernel::User cUserSuper{Kernel::RingKind::kRingSuperUser, kSuperUser}; +Kernel::User cUserSuper{Kernel::RingKind::kRingSuperUser, kSuperUser}; EXTERN_C Kernel::VoidPtr kInterruptVectorTable[]; -Kernel::Void hal_real_init(Kernel::Void) noexcept; +EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept; EXTERN_C void hal_user_code_start(void); EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void); -/* GDT, mostly descriptors for user and kernel segments. */ -STATIC Kernel::HAL::Detail::ZKA_GDT_ENTRY ALIGN(0x1000) cGdt[6] = { - {.fLimitLow = 0, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, // Null entry - {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x9A, .fFlags = 0xA0, .fBaseHigh = 0}, // Kernel code - {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x92, .fFlags = 0xA0, .fBaseHigh = 0}, // Kernel data - {.fLimitLow = 0, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, - {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x9A, .fFlags = 0xA0, .fBaseHigh = 0}, // User code - {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x92, .fFlags = 0xA0, .fBaseHigh = 0}, // User data - // reserve them for later. -}; - EXTERN_C void hal_init_platform( Kernel::HEL::HandoverInformationHeader* HandoverHeader) { @@ -87,11 +76,6 @@ EXTERN_C void hal_init_platform( return; } - hal_real_init(); -} - -Kernel::Void hal_real_init(Kernel::Void) noexcept -{ // get page size. kKernelVirtualSize = kHandoverHeader->f_BitMapSize; @@ -103,6 +87,18 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept kKernelPhysicalStart = reinterpret_cast<Kernel::VoidPtr>( reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_PhysicalStart)); + /* GDT, mostly descriptors for user and kernel segments. */ + STATIC Kernel::HAL::Detail::ZKA_GDT_ENTRY ALIGN(0x08) cGdt[6] = { + {.fLimitLow = 0, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, // Null entry + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x9A, .fFlags = 0xAF, .fBaseHigh = 0}, // Kernel code + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x92, .fFlags = 0xAF, .fBaseHigh = 0}, // Kernel data + {.fLimitLow = 0, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x9A, .fFlags = 0xAF, .fBaseHigh = 0}, // User code + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x92, .fFlags = 0xAF, .fBaseHigh = 0}, // User data + // reserve them for later. + // + }; + // Load memory descriptors. Kernel::HAL::RegisterGDT gdtBase; @@ -114,10 +110,15 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept // Load IDT now. + Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP); +} + +EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept +{ Kernel::HAL::Register64 idtBase; idtBase.Base = (Kernel::UIntPtr)kInterruptVectorTable; idtBase.Limit = sizeof(::Kernel::Detail::AMD64::InterruptDescriptorAMD64) * - (kKernelIdtSize - 1); + (kKernelIdtSize - 1); CONST Kernel::HAL::IDTLoader cIDT; cIDT.Load(idtBase); diff --git a/dev/ZKA/Sources/ExeMain.cxx b/dev/ZKA/Sources/ExeMain.cxx index d8d1ea6e..036c5725 100644 --- a/dev/ZKA/Sources/ExeMain.cxx +++ b/dev/ZKA/Sources/ExeMain.cxx @@ -87,7 +87,7 @@ namespace Kernel::Detail } catalogDir = fNeFS->GetParser()->CreateCatalog(cDirStr[dirIndx], 0, - kNeFSCatalogKindDir); + kNeFSCatalogKindDir); CG::CGDrawStringToWnd(cKernelWnd, "Directory has been created: ", 10 + (10 * (dirIndx + 1)), 10, RGB(0, 0, 0)); CG::CGDrawStringToWnd(cKernelWnd, catalogDir->Name, 10 + (10 * (dirIndx + 1)), 10 + (FONT_SIZE_X * rt_string_len("Directory has been created: ")), RGB(0, 0, 0)); @@ -114,12 +114,14 @@ EXTERN_C ATTRIBUTE(naked) Kernel::Void HangCPU(Kernel::Void) { while (Yes) { + Kernel::Char* p = nullptr; + *p = 4; } } namespace Kernel { - EXTERN UserProcessScheduler* cProcessScheduler; + EXTERN UserProcessScheduler* cProcessScheduler; } /// @brief Application entrypoint. @@ -127,7 +129,7 @@ namespace Kernel /// @return Void EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void) { - Kernel::cProcessScheduler = nullptr; + Kernel::cProcessScheduler = nullptr; CG::CGDrawBackground(); diff --git a/dev/ZKA/Sources/HardwareThreadScheduler.cxx b/dev/ZKA/Sources/HardwareThreadScheduler.cxx index c5d04bbc..134cbb0f 100644 --- a/dev/ZKA/Sources/HardwareThreadScheduler.cxx +++ b/dev/ZKA/Sources/HardwareThreadScheduler.cxx @@ -92,21 +92,23 @@ namespace Kernel !stack_ptr) return false; - if (this->IsBusy()) - return false; - fStack = frame; if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled) { + if (this->IsBusy()) + return false; + this->Busy(true); Bool ret = mp_register_process(fStack); - this->Busy(true); + this->Busy(false); return ret; } else { + kcout << "Switching...\r"; + mp_do_context_switch_pre(); mp_do_context_switch(image, stack_ptr, fStack); @@ -120,16 +122,10 @@ namespace Kernel return fWakeup; } - ///! @brief Internal Hardware Thread list. - STATIC HardwareThread cThreadList[cMaxHWThreads]; - ///! @brief Constructor and destructors. ///! @brief Default constructor. - HardwareThreadScheduler::HardwareThreadScheduler() - { - kcout << "Initializing class done!" << endl; - } + HardwareThreadScheduler::HardwareThreadScheduler() = default; ///! @brief Default destructor. HardwareThreadScheduler::~HardwareThreadScheduler() = default; @@ -163,15 +159,7 @@ namespace Kernel } else if (idx >= cMaxHWThreads) { - static HardwareThread* fakeThread = new HardwareThread(); - - if (!fakeThread) - { - fakeThread = new HardwareThread(); - } - - fakeThread->fKind = kInvalidHart; - + static HardwareThread* fakeThread = nullptr; return {fakeThread}; } @@ -200,6 +188,6 @@ namespace Kernel /// @return the number of cores. SizeT HardwareThreadScheduler::Count() noexcept { - return fThreadList.Count(); + return fThreadList.Capacity(); } } // namespace Kernel diff --git a/dev/ZKA/Sources/UserProcessScheduler.cxx b/dev/ZKA/Sources/UserProcessScheduler.cxx index c68104b9..2501afc2 100644 --- a/dev/ZKA/Sources/UserProcessScheduler.cxx +++ b/dev/ZKA/Sources/UserProcessScheduler.cxx @@ -12,7 +12,6 @@ /// @brief User Process scheduler. /***********************************************************************************/ -#include "HALKit/AMD64/Processor.hxx" #include <KernelKit/UserProcessScheduler.hxx> #include <KernelKit/IPEFDLLObject.hxx> #include <KernelKit/HardwareThreadScheduler.hxx> @@ -424,17 +423,11 @@ namespace Kernel if (!stack || !frame_ptr || !image_ptr || new_pid < 0) return No; - while (Yes) - ; - for (SizeT index = 0UL; index < HardwareThreadScheduler::The().Count(); ++index) { if (HardwareThreadScheduler::The()[index].Leak()->Kind() == kInvalidHart) continue; - if (HardwareThreadScheduler::The()[index].Leak()->IsBusy()) - continue; - if (HardwareThreadScheduler::The()[index].Leak()->Kind() != ThreadKind::kHartBoot && HardwareThreadScheduler::The()[index].Leak()->Kind() != |
