summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/src
diff options
context:
space:
mode:
Diffstat (limited to 'dev/kernel/src')
-rw-r--r--dev/kernel/src/ACPIFactoryInterface.cc8
-rw-r--r--dev/kernel/src/HardwareThreadScheduler.cc9
-rw-r--r--dev/kernel/src/UserProcessScheduler.cc37
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;
}