diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-05-17 09:59:40 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-05-17 09:59:40 +0200 |
| commit | e42b9ddb9121cd69cfb6b5bc0d7efc31653b72a0 (patch) | |
| tree | de3eb3c2ce986800c91bae153db2027cc24d91e2 /dev | |
| parent | 65a97e32ef586e073988186f1f4932c0193b3409 (diff) | |
feat(kernel): don't schedule process when it's under signals such as:
ABRT, KILL, TRAP.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | 42 | ||||
| -rw-r--r-- | dev/kernel/KernelKit/KPC.h | 11 | ||||
| -rw-r--r-- | dev/kernel/KernelKit/ThreadLocalStorage.inl | 4 | ||||
| -rw-r--r-- | dev/kernel/KernelKit/UserProcessScheduler.h | 7 | ||||
| -rw-r--r-- | dev/kernel/NewKit/Utils.h | 8 | ||||
| -rw-r--r-- | dev/kernel/src/PEFCodeMgr.cc | 4 | ||||
| -rw-r--r-- | dev/kernel/src/UserProcessScheduler.cc | 45 | ||||
| -rw-r--r-- | dev/kernel/src/UtfUtils.cc | 12 |
8 files changed, 94 insertions, 39 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc index f52a7167..00c206f0 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc @@ -35,7 +35,12 @@ STATIC void hal_idt_send_eoi(UInt8 vector) { EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp) { hal_idt_send_eoi(13); - auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); + auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); + + if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT || + process.Leak().Signal.SignalID == SIGTRAP) { + dbg_break_point(); + } Kernel::kout << "Kernel: General Access Fault.\r"; @@ -55,7 +60,12 @@ EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp) { EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { hal_idt_send_eoi(14); - auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); + auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); + + if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT || + process.Leak().Signal.SignalID == SIGTRAP) { + dbg_break_point(); + } Kernel::kout << "Kernel: Page Fault.\r"; Kernel::kout << "Kernel: SIGKILL\r"; @@ -89,7 +99,12 @@ EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) { EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { hal_idt_send_eoi(8); - auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); + auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); + + if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT || + process.Leak().Signal.SignalID == SIGTRAP) { + dbg_break_point(); + } Kernel::kout << "Kernel: Math error (division by zero?).\r"; @@ -109,7 +124,12 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { hal_idt_send_eoi(30); - auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); + auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); + + if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT || + process.Leak().Signal.SignalID == SIGTRAP) { + dbg_break_point(); + } (Void)(Kernel::kout << "Kernel: Process RSP: " << Kernel::hex_number(rsp) << Kernel::kendl); Kernel::kout << "Kernel: Access Process Fault.\r"; @@ -128,7 +148,12 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) { hal_idt_send_eoi(3); - auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); + auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); + + if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT || + process.Leak().Signal.SignalID == SIGTRAP) { + dbg_break_point(); + } (Void)(Kernel::kout << "Kernel: Process RIP: " << Kernel::hex_number(rip) << Kernel::kendl); @@ -153,7 +178,12 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { NE_UNUSED(rsp); - auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); + auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); + + if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT || + process.Leak().Signal.SignalID == SIGTRAP) { + dbg_break_point(); + } Kernel::kout << "Kernel: Undefined Opcode.\r"; diff --git a/dev/kernel/KernelKit/KPC.h b/dev/kernel/KernelKit/KPC.h index 9de1f70f..4c48b53a 100644 --- a/dev/kernel/KernelKit/KPC.h +++ b/dev/kernel/KernelKit/KPC.h @@ -11,13 +11,14 @@ /// @file KPC.h /// @brief Kernel Procedure Code. -#define err_local_ok() \ - (Kernel::UserProcessScheduler::The().CurrentProcess().Leak().GetLocalCode() == \ +#define err_local_ok() \ + (Kernel::UserProcessScheduler::The().TheCurrentProcess().Leak().GetLocalCode() == \ Kernel::kErrorSuccess) -#define err_local_fail() \ - (Kernel::UserProcessScheduler::The().CurrentProcess().Leak().GetLocalCode() != \ +#define err_local_fail() \ + (Kernel::UserProcessScheduler::The().TheCurrentProcess().Leak().GetLocalCode() != \ Kernel::kErrorSuccess) -#define err_local_get() (Kernel::UserProcessScheduler::The().CurrentProcess().Leak().GetLocalCode()) +#define err_local_get() \ + (Kernel::UserProcessScheduler::The().TheCurrentProcess().Leak().GetLocalCode()) #define err_global_ok() (Kernel::kErrorLocalNumber == Kernel::kErrorSuccess) #define err_global_fail() (Kernel::kErrorLocalNumber != Kernel::kErrorSuccess) diff --git a/dev/kernel/KernelKit/ThreadLocalStorage.inl b/dev/kernel/KernelKit/ThreadLocalStorage.inl index 553f8d42..7c7a0b7f 100644 --- a/dev/kernel/KernelKit/ThreadLocalStorage.inl +++ b/dev/kernel/KernelKit/ThreadLocalStorage.inl @@ -15,7 +15,7 @@ template <typename T> inline T* tls_new_ptr(void) noexcept { using namespace Kernel; - auto ref_process = UserProcessScheduler::The().CurrentProcess(); + auto ref_process = UserProcessScheduler::The().TheCurrentProcess(); MUST_PASS(ref_process); auto pointer = ref_process.Leak().New(sizeof(T)); @@ -33,7 +33,7 @@ inline Kernel::Bool tls_delete_ptr(T* obj) noexcept { if (!obj) return No; - auto ref_process = UserProcessScheduler::The().CurrentProcess(); + auto ref_process = UserProcessScheduler::The().TheCurrentProcess(); MUST_PASS(ref_process); ErrorOr<T*> obj_wrapped{obj}; diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h index 717788e9..a15e8e38 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.h +++ b/dev/kernel/KernelKit/UserProcessScheduler.h @@ -76,7 +76,8 @@ class USER_PROCESS final { }; ProcessTime PTime{0}; //! @brief Process allocated tine. - ProcessTime RTime{0}; //! @brief Process Run time + ProcessTime RTime{0}; //! @brief Process run time. + ProcessTime UTime{0}; //! #brief Process used time. PID ProcessId{kSchedInvalidPID}; Int32 Kind{kExecutableKind}; @@ -191,7 +192,7 @@ class UserProcessScheduler final : public ISchedulable { bool operator!(); public: - UserProcessTeam& CurrentTeam(); + UserProcessTeam& TheCurrentTeam(); BOOL SwitchTeam(UserProcessTeam& team); public: @@ -203,7 +204,7 @@ class UserProcessScheduler final : public ISchedulable { Bool HasMP() override; public: - Ref<USER_PROCESS>& CurrentProcess(); + Ref<USER_PROCESS>& TheCurrentProcess(); SizeT Run() noexcept; public: diff --git a/dev/kernel/NewKit/Utils.h b/dev/kernel/NewKit/Utils.h index e3420d84..cd36654a 100644 --- a/dev/kernel/NewKit/Utils.h +++ b/dev/kernel/NewKit/Utils.h @@ -26,7 +26,9 @@ Int rt_to_uppercase(Int c); Int rt_to_lower(Int c); voidPtr rt_string_in_string(const Char* in, const Char* needle); char* rt_string_has_char(Char* str, Char chr); -Void urt_set_memory(const voidPtr src, UInt32 dst, Size len); -Int urt_copy_memory(const voidPtr src, voidPtr dst, Size len); -Size urt_string_len(const Utf8Char* str); + +Int urt_string_cmp(const Char* src, const Char* cmp, Size len); +Void urt_set_memory(const voidPtr src, UInt32 dst, Size len); +Int urt_copy_memory(const voidPtr src, voidPtr dst, Size len); +Size urt_string_len(const Utf8Char* str); } // namespace Kernel diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index 5ff54098..25a25122 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -249,8 +249,8 @@ namespace Utils { *(volatile UIntPtr*) stacksym.Leak().Leak() = kSchedMaxStackSz; } - UserProcessScheduler::The().CurrentTeam().AsArray()[id].Kind = process_kind; - UserProcessScheduler::The().CurrentTeam().AsArray()[id].StackSize = + UserProcessScheduler::The().TheCurrentTeam().AsArray()[id].Kind = process_kind; + UserProcessScheduler::The().TheCurrentTeam().AsArray()[id].StackSize = *(UIntPtr*) stacksym.Leak().Leak(); mm_delete_ptr(stacksym.Leak().Leak()); diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 4f6e859e..b0d56c5d 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -14,13 +14,13 @@ /***********************************************************************************/ #include <ArchKit/ArchKit.h> -#include <NewKit/KString.h> - #include <KernelKit/HardwareThreadScheduler.h> #include <KernelKit/IPEFDylibObject.h> #include <KernelKit/KPC.h> #include <KernelKit/MemoryMgr.h> #include <KernelKit/ProcessScheduler.h> +#include <NewKit/KString.h> +#include <SignalKit/Signals.h> ///! BUGS: 0 @@ -479,18 +479,23 @@ SizeT UserProcessScheduler::Run() noexcept { return 0UL; } + auto& process = this->TheCurrentProcess().Leak(); + + //! Increase the usage time of the process. + if (process.UTime < process.PTime) { + ++process.UTime; + } + SizeT process_index = 0UL; //! we store this guy to tell the scheduler how many //! things we have scheduled. for (; process_index < mTeam.AsArray().Capacity(); ++process_index) { auto& process = mTeam.AsArray()[process_index]; - if (this->CurrentProcess() == process) continue; - //! Check if the process needs to be run. if (UserProcessHelper::CanBeScheduled(process)) { if (process.StackSize > kSchedMaxStackSz) { - kout << "The process: " << process.Name << ", has not a valid stack size! Crashing it...\r"; + kout << "Process: " << process.Name << ", has not a valid stack size! Crashing it...\r"; process.Crash(); continue; } @@ -511,13 +516,14 @@ SizeT UserProcessScheduler::Run() noexcept { process.RTime = 0UL; } - this->CurrentProcess() = process; - if (!UserProcessHelper::Switch(process.StackFrame, process.ProcessId)) { break; } - break; + mTeam.AsArray()[this->TheCurrentProcess().Leak().ProcessId] = + this->TheCurrentProcess().Leak(); + + this->TheCurrentProcess() = process; } else { ++process.RTime; --process.PTime; @@ -529,7 +535,7 @@ SizeT UserProcessScheduler::Run() noexcept { /// @brief Gets the current scheduled team. /// @return -UserProcessTeam& UserProcessScheduler::CurrentTeam() { +UserProcessTeam& UserProcessScheduler::TheCurrentTeam() { return mTeam; } @@ -550,17 +556,17 @@ BOOL UserProcessScheduler::SwitchTeam(UserProcessTeam& team) { /// @brief Gets current running process. /// @return -Ref<USER_PROCESS>& UserProcessScheduler::CurrentProcess() { +Ref<USER_PROCESS>& UserProcessScheduler::TheCurrentProcess() { return mTeam.AsRef(); } /// @brief Current proccess id getter. /// @return USER_PROCESS ID integer. ErrorOr<PID> UserProcessHelper::TheCurrentPID() { - if (!UserProcessScheduler::The().CurrentProcess()) return ErrorOr<PID>{-kErrorProcessFault}; + if (!UserProcessScheduler::The().TheCurrentProcess()) return ErrorOr<PID>{-kErrorProcessFault}; kout << "UserProcessHelper::TheCurrentPID: Leaking ProcessId...\r"; - return ErrorOr<PID>{UserProcessScheduler::The().CurrentProcess().Leak().ProcessId}; + return ErrorOr<PID>{UserProcessScheduler::The().TheCurrentProcess().Leak().ProcessId}; } /// @brief Check if process can be schedulded. @@ -575,12 +581,17 @@ Bool UserProcessHelper::CanBeScheduled(const USER_PROCESS& process) { // real time processes shouldn't wait that much. if (process.Affinity == AffinityKind::kRealTime) return Yes; + if (process.Signal.SignalID == SIGKILL || process.Signal.SignalID == SIGABRT || + process.Signal.SignalID == SIGTRAP) { + return No; + } + return process.PTime < 1; } /***********************************************************************************/ /** - * @brief Start scheduling current AP. + * @brief Start scheduling the current team. */ /***********************************************************************************/ @@ -604,13 +615,13 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) { // A fallback is a special core for real-time tasks which needs immediate execution. if (HardwareThreadScheduler::The()[index].Leak()->Kind() == kAPRealTime) { - if (UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].Affinity != + if (UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid].Affinity != AffinityKind::kRealTime) continue; if (HardwareThreadScheduler::The()[index].Leak()->Switch(frame_ptr, new_pid)) { HardwareThreadScheduler::The()[index].Leak()->fPTime = - UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime; + UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid].PTime; UserProcessHelper::TheCurrentPID().Leak().Leak() = UserProcessHelper::TheCurrentPID(); @@ -620,7 +631,7 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) { continue; } - if (UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].Affinity == + if (UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid].Affinity == AffinityKind::kRealTime) continue; @@ -639,7 +650,7 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) { UserProcessHelper::TheCurrentPID().Leak().Leak() = new_pid; HardwareThreadScheduler::The()[index].Leak()->fPTime = - UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime; + UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid].PTime; HardwareThreadScheduler::The()[index].Leak()->Wake(YES); return YES; diff --git a/dev/kernel/src/UtfUtils.cc b/dev/kernel/src/UtfUtils.cc index 11d7471a..1374ee86 100644 --- a/dev/kernel/src/UtfUtils.cc +++ b/dev/kernel/src/UtfUtils.cc @@ -25,7 +25,17 @@ Void urt_set_memory(const voidPtr src, UInt32 dst, Size len) { } } -Int urt_copy_memory(const voidPtr src, voidPtr dst, Size len) { +Int32 rt_string_cmp(const Utf8Char* src, const Utf8Char* cmp, Size size) { + Int32 counter = 0; + + for (Size index = 0; index < size; ++index) { + if (src[index] != cmp[index]) ++counter; + } + + return counter; +} + +Int urt_copy_memory(const VoidPtr src, VoidPtr dst, Size len) { Utf8Char* srcChr = reinterpret_cast<Utf8Char*>(src); Utf8Char* dstChar = reinterpret_cast<Utf8Char*>(dst); |
