summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKAKit/src/HardwareThreadScheduler.cc
diff options
context:
space:
mode:
authorAmlal <amlalelmahrouss@icloud.com>2024-12-06 15:53:20 +0100
committerAmlal <amlalelmahrouss@icloud.com>2024-12-06 15:57:01 +0100
commit46a885ad913aa24543efb154886919ad30182229 (patch)
tree3f9d6887763d8e1ea66fc89ec9aadb22f4cb9abc /dev/ZKAKit/src/HardwareThreadScheduler.cc
parent8723d3401c15cad5797697aea4735b8972aabafb (diff)
META: Friday bump.
Signed-off-by: Amlal <amlalelmahrouss@icloud.com>
Diffstat (limited to 'dev/ZKAKit/src/HardwareThreadScheduler.cc')
-rw-r--r--dev/ZKAKit/src/HardwareThreadScheduler.cc71
1 files changed, 55 insertions, 16 deletions
diff --git a/dev/ZKAKit/src/HardwareThreadScheduler.cc b/dev/ZKAKit/src/HardwareThreadScheduler.cc
index e06942d9..036fa898 100644
--- a/dev/ZKAKit/src/HardwareThreadScheduler.cc
+++ b/dev/ZKAKit/src/HardwareThreadScheduler.cc
@@ -9,39 +9,56 @@
#include <KernelKit/HardwareThreadScheduler.h>
#include <CFKit/Property.h>
-///! BUGS: 0
-
-///! @file MP.cc
+/***********************************************************************************/
+///! @file HardwareThreadScheduler.cc
///! @brief This file handles multi processing in the Kernel.
///! @brief Multi processing is needed for multi-tasking operations.
+/***********************************************************************************/
namespace Kernel
{
- HardwareThreadScheduler kHardwareThreadScheduler;
+ /***********************************************************************************/
+ /// @note Those symbols are needed in order to switch and validate the stack.
+ /***********************************************************************************/
+
+ EXTERN Bool hal_check_stack(HAL::StackFramePtr frame_ptr);
+ EXTERN_C Bool mp_register_process(VoidPtr image, Ptr8 stack_ptr, HAL::StackFramePtr frame, ProcessID pid);
+
+ STATIC HardwareThreadScheduler kHardwareThreadScheduler;
///! A HardwareThread class takes care of it's owned hardware thread.
///! It has a stack for it's core.
+ /***********************************************************************************/
///! @brief C++ constructor.
+ /***********************************************************************************/
HardwareThread::HardwareThread() = default;
+ /***********************************************************************************/
///! @brief C++ destructor.
+ /***********************************************************************************/
HardwareThread::~HardwareThread() = default;
+ /***********************************************************************************/
//! @brief returns the id of the thread.
+ /***********************************************************************************/
const ThreadID& HardwareThread::ID() noexcept
{
return fID;
}
+ /***********************************************************************************/
//! @brief returns the kind of thread we have.
+ /***********************************************************************************/
const ThreadKind& HardwareThread::Kind() noexcept
{
return fKind;
}
+ /***********************************************************************************/
//! @brief is the thread busy?
//! @return whether the thread is busy or not.
+ /***********************************************************************************/
Bool HardwareThread::IsBusy() noexcept
{
STATIC Int64 busy_timer = 0U;
@@ -57,7 +74,9 @@ namespace Kernel
return fBusy;
}
+ /***********************************************************************************/
/// @brief Get processor stack frame.
+ /***********************************************************************************/
HAL::StackFramePtr HardwareThread::StackFrame() noexcept
{
@@ -72,10 +91,12 @@ namespace Kernel
HardwareThread::operator bool()
{
- return fStack;
+ return this->fStack && !this->fBusy;
}
+ /***********************************************************************************/
/// @brief Wakeup the processor.
+ /***********************************************************************************/
Void HardwareThread::Wake(const bool wakeup) noexcept
{
@@ -87,15 +108,12 @@ namespace Kernel
mp_wakeup_thread(fStack);
}
- /// @note Those symbols are needed in order to switch and validate the stack.
-
- EXTERN Bool hal_check_stack(HAL::StackFramePtr frame_ptr);
- EXTERN_C Bool mp_register_process(VoidPtr image, Ptr8 stack_ptr, HAL::StackFramePtr frame, ProcessID pid);
-
+ /***********************************************************************************/
/// @brief Switch to hardware thread.
/// @param stack the new hardware thread.
/// @retval true stack was changed, code is running.
/// @retval false stack is invalid, previous code is running.
+ /***********************************************************************************/
Bool HardwareThread::Switch(VoidPtr image, Ptr8 stack_ptr, HAL::StackFramePtr frame, const ProcessID& pid)
{
if (!frame ||
@@ -123,47 +141,59 @@ namespace Kernel
return ret;
}
+ /***********************************************************************************/
///! @brief Tells if processor is waked up.
+ /***********************************************************************************/
bool HardwareThread::IsWakeup() noexcept
{
return fWakeup;
}
+ /***********************************************************************************/
///! @brief Constructor and destructors.
-
///! @brief Default constructor.
+ /***********************************************************************************/
+
HardwareThreadScheduler::HardwareThreadScheduler() = default;
+ /***********************************************************************************/
///! @brief Default destructor.
+ /***********************************************************************************/
HardwareThreadScheduler::~HardwareThreadScheduler() = default;
+ /***********************************************************************************/
/// @brief Shared singleton function
+ /***********************************************************************************/
HardwareThreadScheduler& HardwareThreadScheduler::The()
{
return kHardwareThreadScheduler;
}
- /// @brief Get Stack Frame of Core
+ /***********************************************************************************/
+ /// @brief Get Stack Frame of AP.
+ /***********************************************************************************/
HAL::StackFramePtr HardwareThreadScheduler::Leak() noexcept
{
return fThreadList[fCurrentThread].fStack;
}
+ /***********************************************************************************/
/**
* Get Hardware thread at index.
* @param idx the index
* @return the reference to the hardware thread.
*/
+ /***********************************************************************************/
Ref<HardwareThread*> HardwareThreadScheduler::operator[](const SizeT& idx)
{
if (idx == 0)
{
- if (fThreadList[idx].Kind() != kHartSystemReserved)
+ if (fThreadList[idx].Kind() != kAPSystemReserved)
{
- fThreadList[idx].fKind = kHartBoot;
+ fThreadList[idx].fKind = kAPBoot;
}
}
- else if (idx >= kMaxHartInsideSched)
+ else if (idx >= kMaxAPInsideSched)
{
static HardwareThread* fakeThread = nullptr;
return {fakeThread};
@@ -172,28 +202,37 @@ namespace Kernel
return &fThreadList[idx];
}
+ /***********************************************************************************/
/**
* Check if thread pool isn't empty.
* @return
*/
+ /***********************************************************************************/
HardwareThreadScheduler::operator bool() noexcept
{
return !fThreadList.Empty();
}
+ /***********************************************************************************/
/**
* Reverse operator bool
* @return
*/
+ /***********************************************************************************/
bool HardwareThreadScheduler::operator!() noexcept
{
return fThreadList.Empty();
}
+ /***********************************************************************************/
/// @brief Returns the amount of core present.
- /// @return the number of cores.
+ /// @return the number of APs.
+ /***********************************************************************************/
SizeT HardwareThreadScheduler::Capacity() noexcept
{
+ if (fThreadList.Empty())
+ return 0UL;
+
return fThreadList.Capacity();
}
} // namespace Kernel