From 59f37ac002635171892925f163783689ec23c1fc Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 9 Oct 2025 12:00:49 +0200 Subject: feat: fixes and improvements of the kernel. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/UserProcessScheduler.cc | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) (limited to 'dev/kernel/src/UserProcessScheduler.cc') diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 07c4a572..ad6263c8 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -21,6 +21,7 @@ #include #include #include +#include #include ///! BUGS: 0 @@ -462,15 +463,10 @@ UserProcessScheduler& UserProcessScheduler::The() { /***********************************************************************************/ Void UserProcessScheduler::Remove(ProcessID process_id) { - if (process_id < 0 || process_id > kSchedProcessLimitPerTeam) { - return; - } - - if (this->mTeam.mProcessList[process_id].Status == ProcessStatusKind::kInvalid) { - return; - } + if (process_id < 0 || process_id > kSchedProcessLimitPerTeam) return; + if (this->mTeam.mProcessList[process_id].Status == ProcessStatusKind::kInvalid) return; - mTeam.mProcessList[process_id].Exit(0); + mTeam.mProcessList[process_id].Exit(kErrorSuccess); } /// @brief Is it a user scheduler? -- cgit v1.2.3 From 212c57ea05bf918dc26fe8864ad617f2f6259cea Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 10 Oct 2025 10:30:38 +0200 Subject: feat: kernel: dispatch structures have two new methods. Signed-off-by: Amlal El Mahrouss --- dev/kernel/ArchKit/ArchKit.h | 6 ++++++ dev/kernel/CFKit/GUIDWrapper.h | 5 ++--- dev/kernel/src/UserMgr.cc | 2 +- dev/kernel/src/UserProcessScheduler.cc | 1 - dev/libSystem/src/JailCalls.cc | 4 ++-- dev/libSystem/src/VerifyCalls.cc | 2 +- 6 files changed, 12 insertions(+), 8 deletions(-) (limited to 'dev/kernel/src/UserProcessScheduler.cc') diff --git a/dev/kernel/ArchKit/ArchKit.h b/dev/kernel/ArchKit/ArchKit.h index 2042bded..9c45b6bb 100644 --- a/dev/kernel/ArchKit/ArchKit.h +++ b/dev/kernel/ArchKit/ArchKit.h @@ -75,6 +75,9 @@ struct HAL_DISPATCH_ENTRY final { Kernel::Bool fHooked; rt_syscall_proc fProc; + BOOL IsKernCall() { return NO; } + BOOL IsSysCall() { return YES; } + operator bool() { return fHooked; } }; @@ -86,6 +89,9 @@ struct HAL_KERNEL_DISPATCH_ENTRY final { Kernel::Bool fHooked; rt_kerncall_proc fProc; + BOOL IsKernCall() { return YES; } + BOOL IsSysCall() { return NO; } + operator bool() { return fHooked; } }; diff --git a/dev/kernel/CFKit/GUIDWrapper.h b/dev/kernel/CFKit/GUIDWrapper.h index 05cb4754..14a96fde 100644 --- a/dev/kernel/CFKit/GUIDWrapper.h +++ b/dev/kernel/CFKit/GUIDWrapper.h @@ -16,7 +16,7 @@ /// @brief eXtended Resource Namespace namespace Kernel::CF::XRN { -union GUIDSequence { +union GUIDSequence final { alignas(8) UShort fU8[16]; alignas(8) UShort fU16[8]; alignas(8) UInt fU32[4]; @@ -36,8 +36,7 @@ class GUID final { ~GUID() = default; public: - GUID& operator=(const GUID&) = default; - GUID(const GUID&) = default; + NE_COPY_DEFAULT(GUID) public: GUIDSequence& operator->() noexcept { return fUUID; } diff --git a/dev/kernel/src/UserMgr.cc b/dev/kernel/src/UserMgr.cc index 9db1ca4d..5ee2aa33 100644 --- a/dev/kernel/src/UserMgr.cc +++ b/dev/kernel/src/UserMgr.cc @@ -39,7 +39,7 @@ namespace Detail { kout << "user_fnv_generator: Hashing user password...\r"; const UInt64 kFnvOffsetBasis = 0xcbf29ce484222325ULL; - const UInt64 fFnvPrime = 0x100000001b3ULL; + const UInt64 fFnvPrime = 0x100000001b3ULL; UInt64 hash = kFnvOffsetBasis; diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index ad6263c8..af54799e 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -21,7 +21,6 @@ #include #include #include -#include #include ///! BUGS: 0 diff --git a/dev/libSystem/src/JailCalls.cc b/dev/libSystem/src/JailCalls.cc index 85796e9f..5cb47bb5 100644 --- a/dev/libSystem/src/JailCalls.cc +++ b/dev/libSystem/src/JailCalls.cc @@ -5,13 +5,13 @@ ------------------------------------------- */ #include +#include #include #include -#include #include using namespace LibSystem; IMPORT_C struct JAIL* JailGetCurrent(Void) { - return (struct JAIL*)libsys_syscall_arg_1(SYSCALL_HASH("JailGetCurrent")); + return (struct JAIL*) libsys_syscall_arg_1(SYSCALL_HASH("JailGetCurrent")); } \ No newline at end of file diff --git a/dev/libSystem/src/VerifyCalls.cc b/dev/libSystem/src/VerifyCalls.cc index 83617ae0..078f921b 100644 --- a/dev/libSystem/src/VerifyCalls.cc +++ b/dev/libSystem/src/VerifyCalls.cc @@ -5,8 +5,8 @@ ------------------------------------------- */ #include -#include #include +#include using namespace LibSystem; -- cgit v1.2.3 From 3d8a7b189d3deaaaab948fdb71ed7fedcc16e05c Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 19 Oct 2025 18:08:04 +0200 Subject: feat: kernel: NetworkKit improvements and signal system refactors. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc | 2 +- dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc | 2 +- dev/kernel/NetworkKit/IPC.h | 19 ++++---- dev/kernel/NetworkKit/MAC.h | 2 +- dev/kernel/SignalKit/SignalGen.h | 51 ---------------------- dev/kernel/SignalKit/Signals.h | 51 ++++++++++++++++++++++ dev/kernel/src/UserProcessScheduler.cc | 2 +- 7 files changed, 63 insertions(+), 66 deletions(-) delete mode 100644 dev/kernel/SignalKit/SignalGen.h create mode 100644 dev/kernel/SignalKit/Signals.h (limited to 'dev/kernel/src/UserProcessScheduler.cc') diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc index 7408639c..0cb991f9 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc @@ -8,7 +8,7 @@ #include #include #include -#include +#include EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip); diff --git a/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc b/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc index dd875c63..0c26f4cb 100644 --- a/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc +++ b/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc @@ -8,7 +8,7 @@ #include #include #include -#include +#include EXTERN_C Kernel::Void int_handle_breakpoint(Kernel::UIntPtr rip); EXTERN_C BOOL mp_handle_gic_interrupt_el0(Void); diff --git a/dev/kernel/NetworkKit/IPC.h b/dev/kernel/NetworkKit/IPC.h index 223a112b..c65ec6fb 100644 --- a/dev/kernel/NetworkKit/IPC.h +++ b/dev/kernel/NetworkKit/IPC.h @@ -38,13 +38,10 @@ struct PACKED IPC_ADDR final { // some operators. //////////////////////////////////// - bool operator==(const IPC_ADDR& addr) noexcept; - - bool operator==(IPC_ADDR& addr) noexcept; - - bool operator!=(const IPC_ADDR& addr) noexcept; - - bool operator!=(IPC_ADDR& addr) noexcept; + BOOL operator==(const IPC_ADDR& addr) noexcept; + BOOL operator==(IPC_ADDR& addr) noexcept; + BOOL operator!=(const IPC_ADDR& addr) noexcept; + BOOL operator!=(IPC_ADDR& addr) noexcept; }; typedef struct IPC_ADDR IPC_ADDR; @@ -58,7 +55,7 @@ enum { constexpr inline auto kIPCMsgSize = 6094U; enum { - kIPCLockInvalid, + kIPCLockInvalid = 0, kIPCLockFree = 1, kIPCLockUsed = 2, }; @@ -77,17 +74,17 @@ typedef struct IPC_MSG final { UInt32 IpcLock; /// @brief Passes the message to target, could be anything, HTTP packet, JSON or whatever. static Bool Pass(IPC_MSG* self, IPC_MSG* target) noexcept; -} PACKED IPC_MSG; +} PACKED ALIGN(8) IPC_MSG; /// @brief Sanitize packet function /// @retval true packet is correct. /// @retval false packet is incorrect and process has crashed. -Bool ipc_sanitize_packet(_Input IPC_MSG* pckt_in); +BOOL ipc_sanitize_packet(_Input IPC_MSG* pckt_in); /// @brief Construct packet function /// @retval true packet is correct. /// @retval false packet is incorrect and process has crashed. -Bool ipc_construct_packet(_Output _Input IPC_MSG** pckt_in); +BOOL ipc_construct_packet(_Output _Input IPC_MSG** pckt_in); } // namespace Kernel #endif // INC_IPC_H diff --git a/dev/kernel/NetworkKit/MAC.h b/dev/kernel/NetworkKit/MAC.h index 805f7259..9cfd93c2 100644 --- a/dev/kernel/NetworkKit/MAC.h +++ b/dev/kernel/NetworkKit/MAC.h @@ -10,7 +10,7 @@ #include #include -#define kMACAddrLen (32) +#define kMACAddrLen (32U) namespace Kernel { class MacAddressGetter; diff --git a/dev/kernel/SignalKit/SignalGen.h b/dev/kernel/SignalKit/SignalGen.h deleted file mode 100644 index fdc27161..00000000 --- a/dev/kernel/SignalKit/SignalGen.h +++ /dev/null @@ -1,51 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include - -#define SIGKILL 1 /* kill */ -#define SIGPAUS 2 /* pause */ -#define SIGEXEC 3 /* execute */ -#define SIGTRAP 4 /* trap */ -#define SIGABRT 5 /* abort */ -#define SIGCONT 6 /* continue */ -#define SIGSEG 7 /* process fault */ -#define SIGBREK 8 -#define SIGATCH 9 -#define SIGDTCH 10 - -/// @author Amlal El Mahrouss -/// @brief Signal Generation API. - -namespace Kernel { -typedef SizeT rt_signal_kind; - -/// @brief Standard signal seed for general purpose usage. -inline constexpr auto kUserSignalSeed = 0x0895034fUL; - -/// @brief Special signal seed for kernel usage. -inline constexpr auto kKernelSignalSeed = 0x0895034f9fUL; - -/// @brief Generate signal from **Sig** -template -inline rt_signal_kind sig_generate_unique() { - static_assert(Sig > 0, "Signal is zero (invalid)"); - return Sig ^ Seed; -} - -/// @brief Checks if the signal matches the seed (user_seed or kernel_seed) -template -inline BOOL sig_matches_seed(rt_signal_kind sig) { - return (sig & 0xFF000000) == (Seed & 0xFF000000); -} - -/// @brief Validate signal from **sig** -inline BOOL sig_validate_unique(rt_signal_kind sig) { - return sig > 0; -} -} // namespace Kernel diff --git a/dev/kernel/SignalKit/Signals.h b/dev/kernel/SignalKit/Signals.h new file mode 100644 index 00000000..fdc27161 --- /dev/null +++ b/dev/kernel/SignalKit/Signals.h @@ -0,0 +1,51 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include + +#define SIGKILL 1 /* kill */ +#define SIGPAUS 2 /* pause */ +#define SIGEXEC 3 /* execute */ +#define SIGTRAP 4 /* trap */ +#define SIGABRT 5 /* abort */ +#define SIGCONT 6 /* continue */ +#define SIGSEG 7 /* process fault */ +#define SIGBREK 8 +#define SIGATCH 9 +#define SIGDTCH 10 + +/// @author Amlal El Mahrouss +/// @brief Signal Generation API. + +namespace Kernel { +typedef SizeT rt_signal_kind; + +/// @brief Standard signal seed for general purpose usage. +inline constexpr auto kUserSignalSeed = 0x0895034fUL; + +/// @brief Special signal seed for kernel usage. +inline constexpr auto kKernelSignalSeed = 0x0895034f9fUL; + +/// @brief Generate signal from **Sig** +template +inline rt_signal_kind sig_generate_unique() { + static_assert(Sig > 0, "Signal is zero (invalid)"); + return Sig ^ Seed; +} + +/// @brief Checks if the signal matches the seed (user_seed or kernel_seed) +template +inline BOOL sig_matches_seed(rt_signal_kind sig) { + return (sig & 0xFF000000) == (Seed & 0xFF000000); +} + +/// @brief Validate signal from **sig** +inline BOOL sig_validate_unique(rt_signal_kind sig) { + return sig > 0; +} +} // namespace Kernel diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index af54799e..2306d3e4 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -21,7 +21,7 @@ #include #include #include -#include +#include ///! BUGS: 0 -- cgit v1.2.3 From 744e9aba579a51dcab8f78009cbc091ce3cd8503 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 24 Oct 2025 12:05:40 +0200 Subject: feat: scheduler: process scheduler improvements and wip subsystem. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/IPEFDylibObject.cc | 4 ++++ dev/kernel/src/KernelTaskScheduler.cc | 15 ++++++++++++++- dev/kernel/src/UserProcessScheduler.cc | 10 +++------- 3 files changed, 21 insertions(+), 8 deletions(-) (limited to 'dev/kernel/src/UserProcessScheduler.cc') diff --git a/dev/kernel/src/IPEFDylibObject.cc b/dev/kernel/src/IPEFDylibObject.cc index a24fba72..91f8c88a 100644 --- a/dev/kernel/src/IPEFDylibObject.cc +++ b/dev/kernel/src/IPEFDylibObject.cc @@ -90,6 +90,10 @@ EXTERN_C IDylibRef rtl_init_dylib_pef(USER_PROCESS& process) { EXTERN_C Void rtl_fini_dylib_pef(USER_PROCESS& process, IDylibRef dll_obj, BOOL* successful) { MUST_PASS(successful); + if (!successful) { + return; + } + // sanity check (will also trigger a bug check if this fails) if (dll_obj == nullptr) { *successful = false; diff --git a/dev/kernel/src/KernelTaskScheduler.cc b/dev/kernel/src/KernelTaskScheduler.cc index 1997c175..8bbe5601 100644 --- a/dev/kernel/src/KernelTaskScheduler.cc +++ b/dev/kernel/src/KernelTaskScheduler.cc @@ -15,4 +15,17 @@ /// @author Amlal El Mahrouss (amlal@nekernel.org) /***********************************************************************************/ -namespace Kernel {} // namespace Kernel \ No newline at end of file +namespace Kernel { +EXTERN_C Void hal_switch_kernel_task(HAL::StackFramePtr frame, ProcessID kid); + +Bool KernelTaskHelper::Switch(HAL::StackFramePtr frame_ptr, ProcessID new_kid) { + NE_UNUSED(frame_ptr); + NE_UNUSED(new_kid); + + return NO; +} + +Bool KernelTaskHelper::CanBeScheduled(const KERNEL_TASK& task) { + return task.Kid > 0 && task.Image.HasCode(); +} +} // namespace Kernel \ No newline at end of file diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 2306d3e4..ac25c3d8 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -581,17 +581,13 @@ ErrorOr UserProcessHelper::TheCurrentPID() { /// @retval true can be schedulded. /// @retval false cannot be schedulded. Bool UserProcessHelper::CanBeScheduled(const USER_PROCESS& process) { + if (process.Affinity == AffinityKind::kRealTime) return Yes; + if (process.Status != ProcessStatusKind::kRunning) return No; if (process.Affinity == AffinityKind::kInvalid) return No; if (process.StackSize > kSchedMaxStackSz) return No; if (!process.Name[0]) return No; - - // real time processes shouldn't wait that much. - if (process.Affinity == AffinityKind::kRealTime) return Yes; - - if (process.Signal.SignalID == sig_generate_unique()) { - return No; - } + if (process.Signal.SignalID == sig_generate_unique()) return No; return process.PTime < 1; } -- cgit v1.2.3