summaryrefslogtreecommitdiffhomepage
path: root/Private/Source/SMPManager.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Private/Source/SMPManager.cxx')
-rw-r--r--Private/Source/SMPManager.cxx217
1 files changed, 0 insertions, 217 deletions
diff --git a/Private/Source/SMPManager.cxx b/Private/Source/SMPManager.cxx
deleted file mode 100644
index dfbfa17b..00000000
--- a/Private/Source/SMPManager.cxx
+++ /dev/null
@@ -1,217 +0,0 @@
-/* -------------------------------------------
-
- Copyright Mahrouss Logic
-
-------------------------------------------- */
-
-#include <ArchKit/ArchKit.hpp>
-#include <KernelKit/ProcessScheduler.hpp>
-#include <KernelKit/SMPManager.hpp>
-
-///! BUGS: 0
-
-///! @file SMPManager.cxx
-///! @brief This file handles multi processing in NewOS.
-///! @brief Multi processing is needed for multi-tasking operations.
-
-namespace NewOS
-{
- ///! A HardwareThread class takes care of it's owned hardware thread.
- ///! It has a stack for it's core.
-
- ///! @brief constructor
- HardwareThread::HardwareThread() = default;
-
- ///! @brief destructor
- HardwareThread::~HardwareThread() = default;
-
- //! @brief returns the id
-
- const ThreadID& HardwareThread::ID() noexcept
- {
- return fID;
- }
-
- //! @brief returns the kind
-
- const ThreadKind& HardwareThread::Kind() noexcept
- {
- return fKind;
- }
-
- //! @brief is the core busy?
-
- bool HardwareThread::IsBusy() noexcept
- {
- return fBusy;
- }
-
- /// @brief Get processor stack frame.
-
- HAL::StackFramePtr HardwareThread::StackFrame() noexcept
- {
- MUST_PASS(fStack);
- return fStack;
- }
-
- void HardwareThread::Busy(const bool busy) noexcept
- {
- fBusy = busy;
- }
-
- HardwareThread::operator bool()
- {
- return fStack;
- }
-
- /// @brief Wakeup the processor.
-
- void HardwareThread::Wake(const bool wakeup) noexcept
- {
- fWakeup = wakeup;
-
- if (!fWakeup)
- rt_hang_thread(fStack);
- else
- rt_wakeup_thread(fStack);
- }
-
- extern bool rt_check_stack(HAL::StackFramePtr stackPtr);
-
- bool HardwareThread::Switch(HAL::StackFramePtr stack)
- {
- if (!rt_check_stack(stack))
- return false;
-
- fStack = stack;
-
- rt_do_context_switch(fStack);
- return true;
- }
-
- ///! @brief Tells if processor is waked up.
- bool HardwareThread::IsWakeup() noexcept
- {
- return fWakeup;
- }
-
- //! @brief Constructor and destructor
-
- ///! @brief Default constructor.
- SMPManager::SMPManager() = default;
-
- ///! @brief Default destructor.
- SMPManager::~SMPManager() = default;
-
- /// @brief Shared singleton function
- Ref<SMPManager> SMPManager::Shared()
- {
- static SMPManager manager;
- return {manager};
- }
-
- /// @brief Get Stack Frame of Core
- HAL::StackFramePtr SMPManager::GetStackFrame() noexcept
- {
- if (fThreadList[fCurrentThread].Leak() &&
- ProcessHelper::GetCurrentPID() ==
- fThreadList[fCurrentThread].Leak().Leak().fPID)
- return fThreadList[fCurrentThread].Leak().Leak().fStack;
-
- return nullptr;
- }
-
- /// @brief Finds and switch to a free core.
- bool SMPManager::Switch(HAL::StackFramePtr stack)
- {
- if (stack == nullptr)
- return false;
-
- for (SizeT idx = 0; idx < kMaxHarts; ++idx)
- {
- // stack != nullptr -> if core is used, then continue.
- if (!fThreadList[idx].Leak() ||
- !fThreadList[idx].Leak().Leak().IsWakeup() ||
- fThreadList[idx].Leak().Leak().IsBusy())
- continue;
-
- // to avoid any null deref.
- if (!fThreadList[idx].Leak().Leak().fStack)
- continue;
- if (fThreadList[idx].Leak().Leak().fStack->Rsp == 0)
- continue;
- if (fThreadList[idx].Leak().Leak().fStack->Rbp == 0)
- continue;
-
- fThreadList[idx].Leak().Leak().Busy(true);
-
- fThreadList[idx].Leak().Leak().fID = idx;
-
- /// I figured out this:
- /// Allocate stack
- /// Set APIC base to stack
- /// Do stuff and relocate stack based on this code.
- /// - Amlel
- rt_copy_memory(stack, fThreadList[idx].Leak().Leak().fStack,
- sizeof(HAL::StackFrame));
-
- fThreadList[idx].Leak().Leak().fPID = ProcessHelper::GetCurrentPID();
-
- fThreadList[idx].Leak().Leak().Busy(false);
-
- return true;
- }
-
- return false;
- }
-
- /**
- * Index Hardware thread
- * @param idx the index
- * @return the reference to the hardware thread.
- */
- Ref<HardwareThread> SMPManager::operator[](const SizeT& idx)
- {
- if (idx == 0)
- {
- if (fThreadList[idx].Leak().Leak().Kind() != kHartSystemReserved)
- {
- fThreadList[idx].Leak().Leak().fKind = kHartBoot;
- }
- }
- else if (idx >= kMaxHarts)
- {
- HardwareThread fakeThread;
- fakeThread.fKind = kInvalidHart;
-
- return {fakeThread};
- }
-
- return fThreadList[idx].Leak();
- }
-
- /**
- * Check if thread pool isn't empty.
- * @return
- */
- SMPManager::operator bool() noexcept
- {
- return !fThreadList.Empty();
- }
-
- /**
- * Reverse operator bool
- * @return
- */
- bool SMPManager::operator!() noexcept
- {
- return fThreadList.Empty();
- }
-
- /// @brief Returns the amount of core present.
- /// @return the number of cores.
- SizeT SMPManager::Count() noexcept
- {
- return fThreadList.Count();
- }
-} // namespace NewOS