From 33cf55c0f5855a55e54a83eb3fee58776e789ed8 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sat, 7 Mar 2026 19:50:39 +0100 Subject: [CHORE] KernelTask system for DDK drivers. Signed-off-by: Amlal El Mahrouss --- src/kernel/KernelKit/CodeMgr.h | 6 ++-- src/kernel/KernelKit/KernelTask.h | 49 ++++++++++++++++++++++++++++ src/kernel/KernelKit/KernelTaskScheduler.h | 52 ------------------------------ src/kernel/KernelKit/ProcessScheduler.h | 2 +- src/kernel/NeKit/Stream.h | 2 +- src/kernel/src/ACPIFactoryInterface.cpp | 2 +- src/kernel/src/CodeMgr.cpp | 8 ++--- src/kernel/src/KernelTask.cpp | 35 ++++++++++++++++++++ src/kernel/src/KernelTaskScheduler.cpp | 32 ------------------ 9 files changed, 95 insertions(+), 93 deletions(-) create mode 100644 src/kernel/KernelKit/KernelTask.h delete mode 100644 src/kernel/KernelKit/KernelTaskScheduler.h create mode 100644 src/kernel/src/KernelTask.cpp delete mode 100644 src/kernel/src/KernelTaskScheduler.cpp (limited to 'src') diff --git a/src/kernel/KernelKit/CodeMgr.h b/src/kernel/KernelKit/CodeMgr.h index 85c2a44f..c74d3a5e 100644 --- a/src/kernel/KernelKit/CodeMgr.h +++ b/src/kernel/KernelKit/CodeMgr.h @@ -1,4 +1,4 @@ -// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) +// Copyright 2024-2026, Amlal El Mahrouss (amlal@nekernel.org) // Licensed under the Apache License, Version 2.0 (see LICENSE file) // Official repository: https://github.com/ne-foss-org/nekernel @@ -18,6 +18,8 @@ namespace Kernel { /// @brief Image process entrypoint. typedef void (*rtl_start_kind)(void); +typedef void (*rtl_kstart_kind)(VoidPtr); + /// @brief C++ Constructor entrypoint. typedef void (*rtl_cxx_ctor_kind)(void); @@ -29,7 +31,7 @@ typedef void (*rtl_cxx_dtor_kind)(void); /// accessible. /// @param main the start of the process. /// @return The team's process id. -BOOL rtl_create_kernel_task(HAL::StackFramePtr main, const KID kid); +BOOL rtl_create_kernel_task(KernelTask& main, const KID& kid); /// @brief Executes a new process from a function. User code only. /// @note This sets up a new stack, anything on the main function that calls the Kernel will not be diff --git a/src/kernel/KernelKit/KernelTask.h b/src/kernel/KernelKit/KernelTask.h new file mode 100644 index 00000000..1b94a9fc --- /dev/null +++ b/src/kernel/KernelKit/KernelTask.h @@ -0,0 +1,49 @@ +// Copyright 2024-2026, Amlal El Mahrouss (amlal@nekernel.org) +// Licensed under the Apache License, Version 2.0 (see LICENSE file) +// Official repository: https://github.com/ne-foss-org/nekernel + +#ifndef KERNELKIT_KERNELTASKSCHEDULER_H +#define KERNELKIT_KERNELTASKSCHEDULER_H + +/// @file KernelTaskScheduler.h +/// @brief Kernel Task Scheduler backend file. +/// @author Amlal El Mahrouss (amlal@nekernel.org) + +#include +#include +#include + +namespace Kernel { + +class KernelTaskHelper; + +using KID = ProcessID; + +/// @brief Equivalent of UserProcess, but for kernel tasks. +/// @author Amlal +class KernelTask final { + public: + Char Name[kSchedNameLen] = {"KernelTask"}; + ProcessSubsystem SubSystem{ProcessSubsystem::kProcessSubsystemKernel}; + HAL::StackFramePtr StackFrame{nullptr}; + UInt8* StackReserve{nullptr}; + SizeT StackSize{kSchedMaxStackSz}; + ProcessImage Image{}; + + /// @brief a KID is a Kernel ID, it is used to find a task running within the kernel. + KID Kid{}; + + NE_NON_VETTABLE; +}; + +/// @brief Equivalent of UserProcessHelper, but for kernel tasks. +/// @author Amlal +class KernelTaskHelper final { + public: + STATIC Bool Start(KernelTask& task_ref, const KID& kid); + STATIC Bool CanBeStarted(const KernelTask& task_ref); +}; + +} // namespace Kernel + +#endif diff --git a/src/kernel/KernelKit/KernelTaskScheduler.h b/src/kernel/KernelKit/KernelTaskScheduler.h deleted file mode 100644 index cdd65522..00000000 --- a/src/kernel/KernelKit/KernelTaskScheduler.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2024-2026, Amlal El Mahrouss (amlal@nekernel.org) -// Licensed under the Apache License, Version 2.0 (see LICENSE file) -// Official repository: https://github.com/ne-foss-org/nekernel - -#ifndef KERNELKIT_KERNELTASKSCHEDULER_H -#define KERNELKIT_KERNELTASKSCHEDULER_H - -/// @file KernelTaskScheduler.h -/// @brief Kernel Task Scheduler backend file. -/// @author Amlal El Mahrouss (amlal@nekernel.org) - -#include -#include -#include - -namespace Kernel { - -class KernelTaskHelper; - -using KID = ProcessID; - -/// @brief Equivalent of UserProcess, but for kernel tasks. -/// @author Amlal -class KernelTask final { - public: - Char Name[kSchedNameLen] = {"KernelTask"}; - ProcessSubsystem SubSystem{ProcessSubsystem::kProcessSubsystemKernel}; - HAL::StackFramePtr StackFrame{nullptr}; - UInt8* StackReserve{nullptr}; - SizeT StackSize{kSchedMaxStackSz}; - ProcessImage Image{}; - - /// @brief a KID is a Kernel ID, it is used to find a task running within the kernel. - KID Kid{}; - - NE_NON_VETTABLE; -}; - -/// @brief Equivalent of UserProcessHelper, but for kernel tasks. -/// @author Amlal -class KernelTaskHelper final { - public: - STATIC Bool Add(HAL::StackFramePtr frame_ptr, KID kid); - STATIC Bool Remove(const KID kid); - STATIC Bool CanBeScheduled(const KernelTask& process); - STATIC ErrorOr TheCurrentKID(); - STATIC SizeT StartScheduling(); -}; - -} // namespace Kernel - -#endif diff --git a/src/kernel/KernelKit/ProcessScheduler.h b/src/kernel/KernelKit/ProcessScheduler.h index b568c290..c5ef6b5d 100644 --- a/src/kernel/KernelKit/ProcessScheduler.h +++ b/src/kernel/KernelKit/ProcessScheduler.h @@ -5,7 +5,7 @@ #ifndef KERNELKIT_PROCESS_SCHEDULER_H #define KERNELKIT_PROCESS_SCHEDULER_H -#include +#include #include #ifdef __NEOSKRNL__ diff --git a/src/kernel/NeKit/Stream.h b/src/kernel/NeKit/Stream.h index ad458d5a..8ef82e6c 100644 --- a/src/kernel/NeKit/Stream.h +++ b/src/kernel/NeKit/Stream.h @@ -27,7 +27,7 @@ class Stream final { template friend Stream& operator<<(Stream& Ks, Ref& Buf) { - *Ks = Ks.fStream->Out(Buf.Leak()); + *Ks = Ks.fStream->Out(Buf.Leak()); Ks.fKind = Buf; return *Ks; } diff --git a/src/kernel/src/ACPIFactoryInterface.cpp b/src/kernel/src/ACPIFactoryInterface.cpp index 14c5bc0e..348e800f 100644 --- a/src/kernel/src/ACPIFactoryInterface.cpp +++ b/src/kernel/src/ACPIFactoryInterface.cpp @@ -78,7 +78,7 @@ bool ACPIFactoryInterface::Checksum(const Char* checksum, SSizeT len) { Char chr = 0; - for (SSizeT index = 0L; index < len; ++index) { + for (SSizeT index{}; index < len; ++index) { chr += checksum[index]; } diff --git a/src/kernel/src/CodeMgr.cpp b/src/kernel/src/CodeMgr.cpp index 0a8cb944..f6f7e920 100644 --- a/src/kernel/src/CodeMgr.cpp +++ b/src/kernel/src/CodeMgr.cpp @@ -1,4 +1,4 @@ -// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) +// Copyright 2024-2026, Amlal El Mahrouss (amlal@nekernel.org) // Licensed under the Apache License, Version 2.0 (see LICENSE file) // Official repository: https://github.com/ne-foss-org/nekernel @@ -14,9 +14,9 @@ namespace Kernel { /// @param main the start of the process. /// @param kid the Kernel ID of the new task. /// @return The process started or not. -BOOL rtl_create_kernel_task(HAL::StackFramePtr task, const KID kid) { - if (!kid || task == nullptr) return FALSE; - return KernelTaskHelper::Add(task, kid); +BOOL rtl_create_kernel_task(KernelTask& task, const KID& kid) { + if (!kid) return FALSE; + return KernelTaskHelper::Start(task, kid); } /***********************************************************************************/ diff --git a/src/kernel/src/KernelTask.cpp b/src/kernel/src/KernelTask.cpp new file mode 100644 index 00000000..f415b114 --- /dev/null +++ b/src/kernel/src/KernelTask.cpp @@ -0,0 +1,35 @@ +// Copyright 2024-2026, Amlal El Mahrouss (amlal@nekernel.org) +// Licensed under the Apache License, Version 2.0 (see LICENSE file) +// Official repository: https://github.com/ne-foss-org/nekernel + +#include +#include + +/***********************************************************************************/ +/// @file KernelTaskScheduler.cc +/// @brief Kernel Task scheduler. +/// @author Amlal El Mahrouss (amlal@nekernel.org) +/***********************************************************************************/ + +namespace Kernel { + +/// @internal @brief Calls the DDK stub to initialize the stack_frame of the driver. +EXTERN_C Int32 kt_kernel_task_start(HAL::StackFramePtr stack_frame, VoidPtr code) { + MUST_PASS(stack_frame && code); + ((rtl_kstart_kind)(code))(stack_frame); + + return stack_frame->R8; +} + +Bool KernelTaskHelper::Start(KernelTask& task_ptr, const KID& kid) { + if (!kid) return NO; + + auto ret = kt_kernel_task_start(task_ptr.StackFrame, task_ptr.Image.LeakImage().Leak().Leak()); + return ret == kErrorSuccess; +} + +Bool KernelTaskHelper::CanBeStarted(const KernelTask& task) { + return task.StackSize > 0 && task.Image.HasCode(); +} + +} // namespace Kernel diff --git a/src/kernel/src/KernelTaskScheduler.cpp b/src/kernel/src/KernelTaskScheduler.cpp deleted file mode 100644 index 9f9fa9d3..00000000 --- a/src/kernel/src/KernelTaskScheduler.cpp +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) -// Licensed under the Apache License, Version 2.0 (see LICENSE file) -// Official repository: https://github.com/ne-foss-org/nekernel - -#include - -/***********************************************************************************/ -/// @file KernelTaskScheduler.cc -/// @brief Kernel Task scheduler. -/// @author Amlal El Mahrouss (amlal@nekernel.org) -/***********************************************************************************/ - -namespace Kernel { - -Bool KernelTaskHelper::Add(HAL::StackFramePtr frame_ptr, KID kid) { - NE_UNUSED(frame_ptr); - NE_UNUSED(kid); - - return NO; -} - -Bool KernelTaskHelper::Remove(const KID kid) { - NE_UNUSED(kid); - - return NO; -} - -Bool KernelTaskHelper::CanBeScheduled(const KernelTask& task) { - return task.Kid > 0 && task.Image.HasCode(); -} - -} // namespace Kernel -- cgit v1.2.3