From 83d870e58457a1d335a1d9b9966a6a1887cc297b Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 24 Nov 2025 03:02:43 +0100 Subject: feat! breaking changes on kernel sources. Signed-off-by: Amlal El Mahrouss --- src/kernel/KernelKit/CoreProcessScheduler.h | 273 ++++++++++++++++++++++++++++ 1 file changed, 273 insertions(+) create mode 100644 src/kernel/KernelKit/CoreProcessScheduler.h (limited to 'src/kernel/KernelKit/CoreProcessScheduler.h') diff --git a/src/kernel/KernelKit/CoreProcessScheduler.h b/src/kernel/KernelKit/CoreProcessScheduler.h new file mode 100644 index 00000000..54a0614a --- /dev/null +++ b/src/kernel/KernelKit/CoreProcessScheduler.h @@ -0,0 +1,273 @@ +/* ======================================== + + Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license. + +======================================== */ + +#pragma once + +#include +#include + +/// @file CoreProcessScheduler.h +/// @brief Core Process Scheduler header file. +/// @author Amlal El Mahrouss (amlal@nekernel.org) + +#define kSchedMinMicroTime (AffinityKind::kStandard) +#define kSchedInvalidPID (-1) +#define kSchedProcessLimitPerTeam (32U) +#define kSchedTeamCount (256U) + +#define kSchedMaxMemoryLimit (gib_cast(128)) /* max physical memory limit */ +#define kSchedMaxStackSz (kib_cast(8)) /* maximum stack size */ + +#define kSchedNameLen (128U) + +EXTERN_C void sched_idle_task(void); + +namespace Kernel { +class USER_PROCESS; +class KERNEL_TASK; +class KernelTaskScheduler; +class UserProcessScheduler; +class UserProcessTeam; + +template +struct PROCESS_HEAP_TREE; + +template +struct PROCESS_SPECIAL_TREE; + +template +struct PROCESS_FILE_TREE; + +enum { + kInvalidTreeKind = 0U, + kRedTreeKind = 100U, + kBlackTreeKind = 101U, + kTreeKindCount = 3U, +}; + +template +struct PROCESS_HEAP_TREE { + static constexpr auto kHeap = true; + static constexpr auto kFile = false; + static constexpr auto kSpecial = false; + + T Entry{nullptr}; + SizeT EntrySize{0UL}; + SizeT EntryPad{0UL}; + + UInt32 Color{kBlackTreeKind}; + + struct PROCESS_HEAP_TREE* Parent { + nullptr + }; + struct PROCESS_HEAP_TREE* Child { + nullptr + }; + + struct PROCESS_HEAP_TREE* Prev { + nullptr + }; + struct PROCESS_HEAP_TREE* Next { + nullptr + }; +}; + +template +struct PROCESS_FILE_TREE { + static constexpr auto kHeap = false; + static constexpr auto kFile = true; + static constexpr auto kSpecial = false; + + T Entry{nullptr}; + SizeT EntrySize{0UL}; + SizeT EntryPad{0UL}; + + UInt32 Color{kBlackTreeKind}; + + struct PROCESS_FILE_TREE* Parent { + nullptr + }; + + struct PROCESS_FILE_TREE* Child { + nullptr + }; + + struct PROCESS_FILE_TREE* Prev { + nullptr + }; + + struct PROCESS_FILE_TREE* Next { + nullptr + }; +}; + +using ProcessCtx = UInt32; + +template +struct PROCESS_SPECIAL_TREE { + static constexpr auto kHeap = false; + static constexpr auto kFile = false; + static constexpr auto kSpecial = true; + + T Entry{nullptr}; + SizeT EntrySize{0UL}; + SizeT EntryPad{0UL}; + + /// @brief a context is where the resource comes from. + ProcessCtx EntryContext{0UL}; // could be a socket, printer, device... + + UInt32 Color{kBlackTreeKind}; + + struct PROCESS_SPECIAL_TREE* Parent { + nullptr + }; + + struct PROCESS_SPECIAL_TREE* Child { + nullptr + }; + + struct PROCESS_SPECIAL_TREE* Prev { + nullptr + }; + + struct PROCESS_SPECIAL_TREE* Next { + nullptr + }; +}; + +/***********************************************************************************/ +/// @brief Subsystem enum type. +/***********************************************************************************/ + +enum class ProcessSubsystem : Int32 { + kProcessSubsystemSecurity = 100, + kProcessSubsystemUser, + kProcessSubsystemService, + kProcessSubsystemDriver, + kProcessSubsystemKernel, + kProcessSubsystemCount = kProcessSubsystemKernel - kProcessSubsystemSecurity + 1, + kProcessSubsystemInvalid = 0xFFFFFFF, +}; + +/***********************************************************************************/ +//! @brief Local Process status enum. +/***********************************************************************************/ +enum class ProcessStatusKind : Int32 { + kInvalid = 0, + kStarting = 100, + kRunning, + kKilled, + kFrozen, + kFinished, + kCount = kFinished - kStarting + 1, +}; + +/***********************************************************************************/ +//! @brief Affinity is the amount of nano-seconds this process is going to run. +/***********************************************************************************/ +enum class AffinityKind : Int32 { + kInvalid = 0, + kRealTime = 100, + kVeryHigh = 150, + kHigh = 200, + kStandard = 1000, + kLowUsage = 1500, + kVeryLowUsage = 2000, +}; + +/***********************************************************************************/ +//! Operators for AffinityKind +/***********************************************************************************/ + +inline bool operator<(AffinityKind lhs, AffinityKind rhs) { + Int32 lhs_int = static_cast(lhs); + Int32 rhs_int = static_cast(rhs); + + return lhs_int < rhs_int; +} + +inline bool operator>(AffinityKind lhs, AffinityKind rhs) { + Int32 lhs_int = static_cast(lhs); + Int32 rhs_int = static_cast(rhs); + + return lhs_int > rhs_int; +} + +inline bool operator<=(AffinityKind lhs, AffinityKind rhs) { + Int32 lhs_int = static_cast(lhs); + Int32 rhs_int = static_cast(rhs); + + return lhs_int <= rhs_int; +} + +inline bool operator>=(AffinityKind lhs, AffinityKind rhs) { + Int32 lhs_int = static_cast(lhs); + Int32 rhs_int = static_cast(rhs); + + return lhs_int >= rhs_int; +} + +using PTime = UInt64; +using ProcessTime = PTime; + +/***********************************************************************************/ +//! @brief Local Process Identifier type. +/***********************************************************************************/ +using ProcessID = Int64; + +/***********************************************************************************/ +/// @note For User manager, tells where we run the code. +/***********************************************************************************/ +enum class ProcessLevelRing : Int32 { + kRingStdUser = 1, + kRingSuperUser = 2, + kRingGuestUser = 5, + kRingCount = 3, +}; + +/***********************************************************************************/ +/// @brief Helper type to describe a code image. +/***********************************************************************************/ +using ImagePtr = VoidPtr; + +/***********************************************************************************/ +/// @brief Helper class to contain a process's image and blob. +/***********************************************************************************/ +struct ProcessImage final { + explicit ProcessImage() = default; + + private: + friend USER_PROCESS; + friend KERNEL_TASK; + + friend UserProcessScheduler; + friend KernelTaskScheduler; + + ImagePtr fCode{}; + ImagePtr fBlob{}; + + public: + Bool HasCode() const { return this->fCode != nullptr; } + + Bool HasImage() const { return this->fBlob != nullptr; } + + ErrorOr LeakImage() { + if (this->fCode) { + return ErrorOr{this->fCode}; + } + + return ErrorOr{kErrorInvalidData}; + } + + ErrorOr LeakBlob() { + if (this->fBlob) { + return ErrorOr{this->fBlob}; + } + + return ErrorOr{kErrorInvalidData}; + } +}; +} // namespace Kernel -- cgit v1.2.3