From b55f22d6a4f85751e0054dbf17eefe438a21b048 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 15 May 2025 23:50:06 +0200 Subject: feat(kernel/sched): fixes and improvements on the scheduler's implementation. why? - The previous one wasn't entierly correct on some parts. Signed-off-by: Amlal El Mahrouss --- .../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | 35 +++++++--------------- dev/kernel/HALKit/AMD64/HalInterruptAPI.asm | 10 +++---- dev/kernel/HALKit/AMD64/HalKernelMain.cc | 6 ++-- dev/kernel/KernelKit/CoreProcessScheduler.h | 4 +-- dev/kernel/src/HardwareThreadScheduler.cc | 2 ++ dev/kernel/src/UserProcessScheduler.cc | 18 ++++++----- 6 files changed, 33 insertions(+), 42 deletions(-) diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc index 2c2bf5ff..ff283141 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc @@ -9,16 +9,12 @@ #include #include -STATIC BOOL kIsScheduling = NO; - EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip); /// @brief Handle GPF fault. /// @param rsp EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) { - auto process = Kernel::UserProcessScheduler::The().CurrentProcess(); - - kIsScheduling = NO; + auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); Kernel::kout << "Kernel: General Protection Fault.\r"; @@ -36,9 +32,7 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) { /// @brief Handle page fault. /// @param rsp EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { - auto process = Kernel::UserProcessScheduler::The().CurrentProcess(); - - kIsScheduling = NO; + auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); Kernel::kout << "Kernel: Page Fault.\r"; Kernel::kout << "Kernel: SIGKILL\r"; @@ -55,20 +49,13 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { /// @brief Handle scheduler interrupt. EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) { NE_UNUSED(rsp); - - Kernel::kout << "Kernel: Scheduler interrupt.\r"; - - kIsScheduling = YES; Kernel::UserProcessHelper::StartScheduling(); - kIsScheduling = NO; } /// @brief Handle math fault. /// @param rsp EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { - auto process = Kernel::UserProcessScheduler::The().CurrentProcess(); - - kIsScheduling = NO; + auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); Kernel::kout << "Kernel: Math error (division by zero?).\r"; @@ -86,11 +73,10 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { /// @brief Handle any generic fault. /// @param rsp EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { - auto process = Kernel::UserProcessScheduler::The().CurrentProcess(); - - kIsScheduling = NO; + auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); - Kernel::kout << "Kernel: Generic Process Fault.\r"; + (Void)(Kernel::kout << "Kernel: Process RSP: " << Kernel::hex_number(rsp) << Kernel::kendl); + Kernel::kout << "Kernel: Access Process Fault.\r"; process.Leak().Signal.SignalArg = rsp; process.Leak().Signal.SignalID = SIGKILL; @@ -104,11 +90,10 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { } EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) { - auto process = Kernel::UserProcessScheduler::The().CurrentProcess(); - - kIsScheduling = NO; + auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); (Void)(Kernel::kout << "Kernel: Process RIP: " << Kernel::hex_number(rip) << Kernel::kendl); + Kernel::kout << "Kernel: SIGTRAP\r"; process.Leak().Signal.SignalArg = rip; @@ -124,9 +109,9 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) { /// @brief Handle #UD fault. /// @param rsp EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { - auto process = Kernel::UserProcessScheduler::The().CurrentProcess(); + NE_UNUSED(rsp); - kIsScheduling = NO; + auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); Kernel::kout << "Kernel: Undefined Opcode.\r"; diff --git a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm index 60a20b77..189b2976 100644 --- a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm @@ -164,7 +164,6 @@ __NE_INT_8: cld mov al, 0x20 - out 0xA0, al out 0x20, al push rcx @@ -185,7 +184,6 @@ __NE_INT_13: cld mov al, 0x20 - out 0xA0, al out 0x20, al push rcx @@ -200,7 +198,6 @@ __NE_INT_14: cld mov al, 0x20 - out 0xA0, al out 0x20, al push rcx @@ -235,13 +232,16 @@ IntNormal 31 [extern kApicBaseAddress] __NE_INT_32: + mov al, 0x20 + out 0x20, al + + mov dword [kApicBaseAddress+0xB0], 0 + push rax mov rcx, rsp call idt_handle_scheduler pop rax - mov dword [kApicBaseAddress+0xB0], 0 - o64 iret IntNormal 33 diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index 722c9cb5..b7ff3038 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -106,9 +106,9 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { EXTERN_C void rtl_ne_task(void); EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { - Kernel::rtl_create_user_process(rtl_ne_task, "NeTask"); - Kernel::rtl_create_user_process(rtl_ne_task, "NeTask#2"); - Kernel::rtl_create_user_process(rtl_ne_task, "NeTask#3"); + Kernel::rtl_create_user_process(rtl_ne_task, "MGMTCTL"); + Kernel::rtl_create_user_process(rtl_ne_task, "LAUNCHCTL"); + Kernel::rtl_create_user_process(rtl_ne_task, "SECURITYCTL"); Kernel::HAL::Register64 idt_reg; idt_reg.Base = reinterpret_cast(kInterruptVectorTable); diff --git a/dev/kernel/KernelKit/CoreProcessScheduler.h b/dev/kernel/KernelKit/CoreProcessScheduler.h index f9d11459..6cb17261 100644 --- a/dev/kernel/KernelKit/CoreProcessScheduler.h +++ b/dev/kernel/KernelKit/CoreProcessScheduler.h @@ -128,8 +128,8 @@ enum class ProcessStatusKind : Int32 { //! @brief Affinity is the amount of nano-seconds this process is going to run. /***********************************************************************************/ enum class AffinityKind : Int32 { - kRealTime = 500, - kVeryHigh = 250, + kRealTime = 50, + kVeryHigh = 150, kHigh = 200, kStandard = 1000, kLowUsage = 1500, diff --git a/dev/kernel/src/HardwareThreadScheduler.cc b/dev/kernel/src/HardwareThreadScheduler.cc index 1df5ad7a..6cb83b3d 100644 --- a/dev/kernel/src/HardwareThreadScheduler.cc +++ b/dev/kernel/src/HardwareThreadScheduler.cc @@ -105,6 +105,8 @@ Void HardwareThread::Wake(const bool wakeup) noexcept { /// @retval false stack is invalid, previous code is running. /***********************************************************************************/ Bool HardwareThread::Switch(HAL::StackFramePtr frame, const ThreadID& pid) { + if (this->IsBusy()) return NO; + this->fStack = frame; this->fPID = pid; diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 24869d63..fe1a95ae 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -491,7 +491,7 @@ SizeT UserProcessScheduler::Run() noexcept { continue; } - kout << process.Name << " is being scheduled to run...\r"; + kout << ((*process.Name) ? process.Name : "USER_PROCESS") << " will be scheduled...\r"; this->CurrentProcess() = process; @@ -499,17 +499,21 @@ SizeT UserProcessScheduler::Run() noexcept { if (process.PTime < process.RTime) { if (process.RTime < (Int32) AffinityKind::kVeryHigh) - process.PTime = (Int32) AffinityKind::kLowUsage; + process.RTime = (Int32) AffinityKind::kLowUsage; else if (process.RTime < (Int32) AffinityKind::kHigh) - process.PTime = (Int32) AffinityKind::kStandard; + process.RTime = (Int32) AffinityKind::kStandard; else if (process.RTime < (Int32) AffinityKind::kStandard) - process.PTime = (Int32) AffinityKind::kHigh; + process.RTime = (Int32) AffinityKind::kHigh; + + process.PTime += process.RTime; process.RTime = 0UL; - } else { - ++process.RTime; + } + + if (!UserProcessHelper::Switch(process.StackFrame, process.ProcessId)) { + continue; } } else { - kout << process.Name << " won't be scheduled to run...\r"; + ++process.RTime; --process.PTime; } } -- cgit v1.2.3