diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-05-18 20:00:25 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-05-18 20:00:25 +0200 |
| commit | ce71265ae5bd333c309dff8c2d46e4d52dd78066 (patch) | |
| tree | 0154d9c9aa7bd583d86e9a3a8151c8339fad5f46 /dev/kernel/src | |
| parent | 0266d8058990a496b935abd76417abcfe4e9cffd (diff) | |
feat(sched_desgin): better architecture for the HTS.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev/kernel/src')
| -rw-r--r-- | dev/kernel/src/ACPIFactoryInterface.cc | 8 | ||||
| -rw-r--r-- | dev/kernel/src/HardwareThreadScheduler.cc | 9 | ||||
| -rw-r--r-- | dev/kernel/src/UserProcessScheduler.cc | 37 |
3 files changed, 19 insertions, 35 deletions
diff --git a/dev/kernel/src/ACPIFactoryInterface.cc b/dev/kernel/src/ACPIFactoryInterface.cc index ded49587..47a81f38 100644 --- a/dev/kernel/src/ACPIFactoryInterface.cc +++ b/dev/kernel/src/ACPIFactoryInterface.cc @@ -10,16 +10,18 @@ #include <modules/ACPI/ACPIFactoryInterface.h> namespace Kernel { +constexpr STATIC const auto kMinACPIVer = 1; + /// @brief Finds a descriptor table inside ACPI XSDT. ErrorOr<voidPtr> ACPIFactoryInterface::Find(const Char* signature) { MUST_PASS(this->fRsdp); - if (!signature) return ErrorOr<voidPtr>{nullptr}; - if (*signature == 0) return ErrorOr<voidPtr>{nullptr}; + if (!signature) return ErrorOr<voidPtr>{-kErrorInvalidData}; + if (*signature == 0) return ErrorOr<voidPtr>{-kErrorInvalidData}; RSDP* rsp_ptr = reinterpret_cast<RSDP*>(this->fRsdp); - if (rsp_ptr->Revision < 1) return ErrorOr<voidPtr>{nullptr}; + if (rsp_ptr->Revision < kMinACPIVer) return ErrorOr<voidPtr>{-kErrorInvalidData}; RSDT* xsdt = reinterpret_cast<RSDT*>(rsp_ptr->RsdtAddress); diff --git a/dev/kernel/src/HardwareThreadScheduler.cc b/dev/kernel/src/HardwareThreadScheduler.cc index eda68104..09c1c7d8 100644 --- a/dev/kernel/src/HardwareThreadScheduler.cc +++ b/dev/kernel/src/HardwareThreadScheduler.cc @@ -104,16 +104,13 @@ Void HardwareThread::Wake(const bool wakeup) noexcept { /// @retval true stack was changed, code is running. /// @retval false stack is invalid, previous code is running. /***********************************************************************************/ -Bool HardwareThread::Switch(HAL::StackFramePtr frame, const ThreadID& pid) { +Bool HardwareThread::Switch(HAL::StackFramePtr frame) { if (this->IsBusy()) return NO; this->fStack = frame; - this->fPID = pid; Bool ret = mp_register_process(fStack, this->fPID); - if (ret) this->Busy(YES); - return ret; } @@ -159,10 +156,12 @@ HAL::StackFramePtr HardwareThreadScheduler::Leak() noexcept { /***********************************************************************************/ Ref<HardwareThread*> HardwareThreadScheduler::operator[](SizeT idx) { if (idx >= kMaxAPInsideSched) { - STATIC HardwareThread* kFakeThread = nullptr; + HardwareThread* kFakeThread = nullptr; return {kFakeThread}; } + fThreadList[idx].fPID = idx; + return &fThreadList[idx]; } diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 165cfb5d..393f1419 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -25,8 +25,6 @@ ///! BUGS: 0 namespace Kernel { -EXTERN_C Void sched_jump_to_task(HAL::StackFramePtr stack_frame); - /***********************************************************************************/ /// @brief Exit Code global variable. /***********************************************************************************/ @@ -598,41 +596,24 @@ SizeT UserProcessHelper::StartScheduling() { /***********************************************************************************/ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) { + (Void)(kout << "IP: " << hex_number(frame_ptr->IP) << kendl); + for (SizeT index = 0UL; index < HardwareThreadScheduler::The().Capacity(); ++index) { + if (!HardwareThreadScheduler::The()[index].Leak()) continue; + if (HardwareThreadScheduler::The()[index].Leak()->Kind() == kAPInvalid || HardwareThreadScheduler::The()[index].Leak()->Kind() == kAPBoot) continue; - // A fallback is a special core for real-time tasks which needs immediate execution. - if (HardwareThreadScheduler::The()[index].Leak()->Kind() == kAPRealTime) { - 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().TheCurrentTeam().AsArray()[new_pid].PTime; - - UserProcessHelper::TheCurrentPID().Leak().Leak() = UserProcessHelper::TheCurrentPID(); - - UserProcessScheduler::The().TheCurrentProcess() = - UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid]; - - return YES; - } - - continue; - } - - if (UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid].Affinity == - AffinityKind::kRealTime) - continue; + (Void)(kout << "AP_" << hex_number(index) << kendl); //////////////////////////////////////////////////////////// /// Prepare task switch. /// //////////////////////////////////////////////////////////// - Bool ret = HardwareThreadScheduler::The()[index].Leak()->Switch(frame_ptr, new_pid); + HardwareThreadScheduler::The()[index].Leak()->Busy(YES); + Bool ret = HardwareThreadScheduler::The()[index].Leak()->Switch(frame_ptr); + HardwareThreadScheduler::The()[index].Leak()->Busy(NO); //////////////////////////////////////////////////////////// /// Rollback on fail. /// @@ -652,6 +633,8 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) { return YES; } + kout << "Couldn't find a suitable core for the current process!\r"; + return NO; } |
