From 4ce1fdaa5ad4252bff486a824f53cb93cc156925 Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Thu, 1 Aug 2024 09:48:24 +0200 Subject: MHR-39: Implement entrypoint probe, can now find it. Next step is to map the sections into their own addresses. Signed-off-by: Amlal EL Mahrouss --- Kernel/HALKit/AMD64/HalBoot.asm | 2 +- Kernel/KernelKit/MP.hxx | 130 ++++++++++++++++++ Kernel/KernelKit/MPManager.hpp | 129 ------------------ Kernel/KernelKit/PE.hxx | 73 +++++----- Kernel/KernelKit/User.hxx | 14 +- Kernel/Sources/FS/NewFS.cxx | 2 +- Kernel/Sources/MP.cxx | 256 ++++++++++++++++++++++++++++++++++++ Kernel/Sources/MPManager.cxx | 256 ------------------------------------ Kernel/Sources/Main.cxx | 4 +- Kernel/Sources/ProcessScheduler.cxx | 20 +-- Kernel/Sources/User.cxx | 12 +- Kernel/amd64-efi.make | 5 +- Kernel/arm64-efi.make | 5 +- 13 files changed, 456 insertions(+), 452 deletions(-) create mode 100644 Kernel/KernelKit/MP.hxx delete mode 100644 Kernel/KernelKit/MPManager.hpp create mode 100644 Kernel/Sources/MP.cxx delete mode 100644 Kernel/Sources/MPManager.cxx (limited to 'Kernel') diff --git a/Kernel/HALKit/AMD64/HalBoot.asm b/Kernel/HALKit/AMD64/HalBoot.asm index ab8273a1..ad1c1987 100644 --- a/Kernel/HALKit/AMD64/HalBoot.asm +++ b/Kernel/HALKit/AMD64/HalBoot.asm @@ -17,7 +17,7 @@ %define kArchAmd64 122 %define kHandoverMagic 0xBADCC -section .NewBoot +section .newosldr HandoverMagic: dq kHandoverMagic HandoverType: dw kTypeKernel diff --git a/Kernel/KernelKit/MP.hxx b/Kernel/KernelKit/MP.hxx new file mode 100644 index 00000000..325e399c --- /dev/null +++ b/Kernel/KernelKit/MP.hxx @@ -0,0 +1,130 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + +------------------------------------------- */ + +#ifndef __INC_MP_MANAGER_HPP__ +#define __INC_MP_MANAGER_HPP__ + +#include +#include +#include + +/// @note Last Rev Sun 28 Jul CET 2024 +/// @note Last Rev Thu, Aug 1, 2024 9:07:38 AM + +#define cMaxHWThreads (8U) + +namespace Kernel +{ + class HardwareThread; + class MPCoreScheduler; + + using ThreadID = UInt32; + + enum ThreadKind + { + kHartSystemReserved, // System reserved thread, well user can't use it + kHartStandard, // user thread, cannot be used by kernel + kHartFallback, // fallback thread, cannot be used by user if not clear or + // used by kernel. + kHartBoot, // The core we booted from, the mama. + kInvalidHart, + kHartCount, + }; + + typedef enum ThreadKind SmThreadKind; + typedef ThreadID SmThreadID; + + /// + /// \name HardwareThread + /// \brief Abstraction over the CPU's core, used to run processes or threads. + /// + + class HardwareThread final + { + public: + explicit HardwareThread(); + ~HardwareThread(); + + public: + NEWOS_COPY_DEFAULT(HardwareThread) + + public: + operator bool(); + + public: + void Wake(const bool wakeup = false) noexcept; + void Busy(const bool busy = false) noexcept; + + public: + bool Switch(HAL::StackFrame* stack); + bool IsWakeup() noexcept; + + public: + HAL::StackFrame* StackFrame() noexcept; + const ThreadKind& Kind() noexcept; + bool IsBusy() noexcept; + const ThreadID& ID() noexcept; + + private: + HAL::StackFrame* fStack{nullptr}; + ThreadKind fKind{ThreadKind::kInvalidHart}; + ThreadID fID{0}; + ProcessID fSourcePID{-1}; + bool fWakeup{false}; + bool fBusy{false}; + + private: + friend class MPCoreScheduler; + }; + + /// + /// \name MPCoreScheduler + /// \brief Class to manage the thread scheduling. + /// + + class MPCoreScheduler final + { + private: + explicit MPCoreScheduler(); + + public: + ~MPCoreScheduler(); + NEWOS_COPY_DEFAULT(MPCoreScheduler); + + public: + bool Switch(HAL::StackFramePtr the); + HAL::StackFramePtr Leak() noexcept; + + public: + Ref operator[](const SizeT& idx); + bool operator!() noexcept; + operator bool() noexcept; + + public: + /// @brief Shared instance of the MP Manager. + /// @return the reference to the mp manager class. + static Ref The(); + + public: + /// @brief Returns the amount of threads present in the system. + /// @returns SizeT the amount of cores present. + SizeT Count() noexcept; + + private: + Array fThreadList; + ThreadID fCurrentThread{0}; + }; + + /// @brief wakes up thread. + /// wakes up thread from hang. + Void mp_wakeup_thread(HAL::StackFramePtr stack); + + /// @brief makes thread sleep. + /// hooks and hangs thread to prevent code from executing. + Void mp_hang_thread(HAL::StackFramePtr stack); +} // namespace Kernel + +#endif // !__INC_MP_MANAGER_HPP__ diff --git a/Kernel/KernelKit/MPManager.hpp b/Kernel/KernelKit/MPManager.hpp deleted file mode 100644 index c54f0aaf..00000000 --- a/Kernel/KernelKit/MPManager.hpp +++ /dev/null @@ -1,129 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies - -------------------------------------------- */ - -#ifndef __INC_MP_MANAGER_HPP__ -#define __INC_MP_MANAGER_HPP__ - -#include -#include -#include - -/// @note Last Rev Sun 28 Jul CET 2024 - -#define kMaxHarts 8 - -namespace Kernel -{ - class HardwareThread; - class MPManager; - - using ThreadID = UInt32; - - enum ThreadKind - { - kHartSystemReserved, // System reserved thread, well user can't use it - kHartStandard, // user thread, cannot be used by kernel - kHartFallback, // fallback thread, cannot be used by user if not clear or - // used by kernel. - kHartBoot, // The core we booted from, the mama. - kInvalidHart, - kHartCount, - }; - - typedef enum ThreadKind SmThreadKind; - typedef ThreadID SmThreadID; - - /// - /// \name HardwareThread - /// @brief CPU Hardware Thread (POWER, x64, or 64x0) - /// - - class HardwareThread final - { - public: - explicit HardwareThread(); - ~HardwareThread(); - - public: - NEWOS_COPY_DEFAULT(HardwareThread) - - public: - operator bool(); - - public: - void Wake(const bool wakeup = false) noexcept; - void Busy(const bool busy = false) noexcept; - - public: - bool Switch(HAL::StackFrame* stack); - bool IsWakeup() noexcept; - - public: - HAL::StackFrame* StackFrame() noexcept; - const ThreadKind& Kind() noexcept; - bool IsBusy() noexcept; - const ThreadID& ID() noexcept; - - private: - HAL::StackFrame* fStack{nullptr}; - ThreadKind fKind{ThreadKind::kInvalidHart}; - ThreadID fID{0}; - ProcessID fSourcePID{-1}; - bool fWakeup{false}; - bool fBusy{false}; - - private: - friend class MPManager; - }; - - /// - /// \name MPManager - /// @brief Multi processor manager to manage other cores and dispatch tasks. - /// - - class MPManager final - { - private: - explicit MPManager(); - - public: - ~MPManager(); - NEWOS_COPY_DEFAULT(MPManager); - - public: - bool Switch(HAL::StackFramePtr the); - HAL::StackFramePtr Leak() noexcept; - - public: - Ref operator[](const SizeT& idx); - bool operator!() noexcept; - operator bool() noexcept; - - public: - /// @brief Shared instance of the SMP Manager. - /// @return the reference to the smp manager. - static Ref The(); - - public: - /// @brief Returns the amount of threads present in the system. - /// @returns SizeT the amount of cores present. - SizeT Count() noexcept; - - private: - Array fThreadList; - ThreadID fCurrentThread{0}; - }; - - /// @brief wakes up thread. - /// wakes up thread from hang. - Void mp_wakeup_thread(HAL::StackFramePtr stack); - - /// @brief makes thread sleep. - /// hooks and hangs thread to prevent code from executing. - Void mp_hang_thread(HAL::StackFramePtr stack); -} // namespace Kernel - -#endif // !__INC_MP_MANAGER_HPP__ diff --git a/Kernel/KernelKit/PE.hxx b/Kernel/KernelKit/PE.hxx index debd6aba..0788cd2d 100644 --- a/Kernel/KernelKit/PE.hxx +++ b/Kernel/KernelKit/PE.hxx @@ -26,7 +26,6 @@ typedef struct ExecHeader final { - Kernel::UInt32 mMagic; // PE\0\0 or 0x00004550 Kernel::UInt16 mMachine; Kernel::UInt16 mNumberOfSections; Kernel::UInt32 mTimeDateStamp; @@ -38,40 +37,41 @@ typedef struct ExecHeader final typedef struct ExecOptionalHeader final { - Kernel::UInt16 mMagic; // 0x010b - PE32, 0x020b - PE32+ (64 bit) - Kernel::UChar mMajorLinkerVersion; - Kernel::UChar mMinorLinkerVersion; - Kernel::UIntPtr mSizeOfCode; - Kernel::UIntPtr mSizeOfInitializedData; - Kernel::UIntPtr mSizeOfUninitializedData; - Kernel::UInt32 mAddressOfEntryPoint; - Kernel::UInt32 mBaseOfCode; - Kernel::UIntPtr mImageBase; - Kernel::UInt32 mSectionAlignment; - Kernel::UInt32 mFileAlignment; - Kernel::UInt16 mMajorOperatingSystemVersion; - Kernel::UInt16 mMinorOperatingSystemVersion; - Kernel::UInt16 mMajorImageVersion; - Kernel::UInt16 mMinorImageVersion; - Kernel::UInt16 mMajorSubsystemVersion; - Kernel::UInt16 mMinorSubsystemVersion; - Kernel::UInt32 mWin32VersionValue; - Kernel::UIntPtr mSizeOfImage; - Kernel::UIntPtr mSizeOfHeaders; - Kernel::UInt32 mCheckSum; - Kernel::UInt16 mSubsystem; - Kernel::UInt16 mDllCharacteristics; - Kernel::UIntPtr mSizeOfStackReserve; - Kernel::UIntPtr mSizeOfStackCommit; - Kernel::UIntPtr mSizeOfHeapReserve; - Kernel::UIntPtr mSizeOfHeapCommit; - Kernel::UInt32 mLoaderFlags; - Kernel::UInt32 mNumberOfRvaAndSizes; + Kernel::UInt16 mMagic; // 0x010b - PE32, 0x020b - PE32+ (64 bit) + Kernel::UInt8 mMajorLinkerVersion; + Kernel::UInt8 mMinorLinkerVersion; + Kernel::UInt32 mSizeOfCode; + Kernel::UInt32 mSizeOfInitializedData; + Kernel::UInt32 mSizeOfUninitializedData; + Kernel::UInt32 mAddressOfEntryPoint; + Kernel::UInt32 mBaseOfCode; + Kernel::UInt32 mBaseOfData; + Kernel::UInt32 mImageBase; + Kernel::UInt32 mSectionAlignment; + Kernel::UInt32 mFileAlignment; + Kernel::UInt16 mMajorOperatingSystemVersion; + Kernel::UInt16 mMinorOperatingSystemVersion; + Kernel::UInt16 mMajorImageVersion; + Kernel::UInt16 mMinorImageVersion; + Kernel::UInt16 mMajorSubsystemVersion; + Kernel::UInt16 mMinorSubsystemVersion; + Kernel::UInt32 mWin32VersionValue; + Kernel::UInt32 mSizeOfImage; + Kernel::UInt32 mSizeOfHeaders; + Kernel::UInt32 mCheckSum; + Kernel::UInt16 mSubsystem; + Kernel::UInt16 mDllCharacteristics; + Kernel::UInt32 mSizeOfStackReserve; + Kernel::UInt32 mSizeOfStackCommit; + Kernel::UInt32 mSizeOfHeapReserve; + Kernel::UInt32 mSizeOfHeapCommit; + Kernel::UInt32 mLoaderFlags; + Kernel::UInt32 mNumberOfRvaAndSizes; } PACKED ExecOptionalHeader, *ExecOptionalHeaderPtr; typedef struct ExecSectionHeader final { - Kernel::UChar mName[8]; + Kernel::Char mName[8]; Kernel::UInt32 mVirtualSize; Kernel::UInt32 mVirtualAddress; Kernel::UInt32 mSizeOfRawData; @@ -118,6 +118,15 @@ typedef struct ExecImportDirectory Kernel::UInt32 mThunkTableRva; } PACKED ExecImportDirectory, *ExecImportDirectoryPtr; -#define kPeStart "__ImageStart" +typedef struct ExecDataDirectory { + Kernel::UInt32 VirtualAddress; + Kernel::UInt32 Size; +} ExecDataDirectory, *ExecDataDirectoryPtr; + +typedef struct ExecImageHeader { + Kernel::UInt32 mSignature; + ExecHeader mHeader; + ExecOptionalHeader mOptHdr; +} ExecImageHeader, *ExecImageHeaderPtr; #endif /* ifndef __KERNELKIT_INC_PE_HXX__ */ diff --git a/Kernel/KernelKit/User.hxx b/Kernel/KernelKit/User.hxx index 64bb44a7..3f78047c 100644 --- a/Kernel/KernelKit/User.hxx +++ b/Kernel/KernelKit/User.hxx @@ -27,7 +27,7 @@ namespace Kernel { class User; - class UserView; + class UserManager; enum class RingKind { @@ -72,13 +72,13 @@ namespace Kernel StringView fUserName; VoidPtr fUserToken{nullptr}; - friend UserView; + friend UserManager; }; - class UserView final + class UserManager final { - UserView() = default; - ~UserView() = default; + UserManager() = default; + ~UserManager() = default; User* fCurrentUser = nullptr; User* fLastLoggedOffUser = nullptr; @@ -87,9 +87,9 @@ namespace Kernel User* fRootUser = nullptr; public: - NEWOS_COPY_DELETE(UserView); + NEWOS_COPY_DELETE(UserManager); - STATIC UserView* The() noexcept; + STATIC UserManager* The() noexcept; Bool LogIn(User* user, const Char* password) noexcept; User* Current() noexcept; Void LogOff() noexcept; diff --git a/Kernel/Sources/FS/NewFS.cxx b/Kernel/Sources/FS/NewFS.cxx index ae2013cb..82759c72 100644 --- a/Kernel/Sources/FS/NewFS.cxx +++ b/Kernel/Sources/FS/NewFS.cxx @@ -305,7 +305,7 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const char* name, if (flagsList & kNewFSCatalogKindMetaFile) { - if (UserView::The()->Current() != UserView::The()->fRootUser) + if (UserManager::The()->Current() != UserManager::The()->fRootUser) { delete catalogChild; return nullptr; diff --git a/Kernel/Sources/MP.cxx b/Kernel/Sources/MP.cxx new file mode 100644 index 00000000..b83f0817 --- /dev/null +++ b/Kernel/Sources/MP.cxx @@ -0,0 +1,256 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + +------------------------------------------- */ + +#include +#include +#include +#include + +///! BUGS: 0 + +///! @file MP.cxx +///! @brief This file handles multi processing in the kernel. +///! @brief Multi processing is needed for multi-tasking operations. + +namespace Kernel +{ + STATIC Property cSMPCoreName; + + ///! 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? + 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) + mp_hang_thread(fStack); + else + mp_wakeup_thread(fStack); + } + + EXTERN Bool rt_check_stack(HAL::StackFramePtr stackPtr); + + /// @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(HAL::StackFramePtr stack) + { + if (!rt_check_stack(stack)) + { + /// provide 'nullptr' to free the stack frame. + if (stack == nullptr) + { + delete fStack; + fStack = nullptr; + + return true; + } + + return false; + } + + if (fStack) + { + delete fStack; + fStack = nullptr; + } + + 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. + MPCoreScheduler::MPCoreScheduler() + { + StringView strCoreName(512); + strCoreName += "\\Class\\Smp\\MPClass"; + + cSMPCoreName.GetKey() = strCoreName; + cSMPCoreName.GetValue() = (UIntPtr)this; + + kcout << "newoskrnl: initializing " << strCoreName.CData() << endl; + } + + ///! @brief Default destructor. + MPCoreScheduler::~MPCoreScheduler() = default; + + /// @brief Shared singleton function + Ref MPCoreScheduler::The() + { + static MPCoreScheduler manager; + return {manager}; + } + + /// @brief Get Stack Frame of Core + HAL::StackFramePtr MPCoreScheduler::Leak() noexcept + { + if (fThreadList[fCurrentThread].Leak() && + ProcessHelper::TheCurrentPID() == + fThreadList[fCurrentThread].Leak().Leak()->fSourcePID) + return fThreadList[fCurrentThread].Leak().Leak()->fStack; + + return nullptr; + } + + /// @brief Finds and switch to a free core. + bool MPCoreScheduler::Switch(HAL::StackFramePtr stack) + { + if (stack == nullptr) + return false; + + for (SizeT idx = 0; idx < cMaxHWThreads; ++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->SP == 0) + continue; + if (fThreadList[idx].Leak().Leak()->fStack->BP == 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()->Switch(fThreadList[idx].Leak().Leak()->fStack); + + fThreadList[idx].Leak().Leak()->fSourcePID = ProcessHelper::TheCurrentPID(); + + 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 MPCoreScheduler::operator[](const SizeT& idx) + { + if (idx == 0) + { + if (fThreadList[idx].Leak().Leak()->Kind() != kHartSystemReserved) + { + fThreadList[idx].Leak().Leak()->fKind = kHartBoot; + } + } + else if (idx >= cMaxHWThreads) + { + static HardwareThread* fakeThread = new HardwareThread(); + + if (!fakeThread) + { + fakeThread = new HardwareThread(); + } + + fakeThread->fKind = kInvalidHart; + + return {fakeThread}; + } + + return fThreadList[idx].Leak(); + } + + /** + * Check if thread pool isn't empty. + * @return + */ + MPCoreScheduler::operator bool() noexcept + { + return !fThreadList.Empty(); + } + + /** + * Reverse operator bool + * @return + */ + bool MPCoreScheduler::operator!() noexcept + { + return fThreadList.Empty(); + } + + /// @brief Returns the amount of core present. + /// @return the number of cores. + SizeT MPCoreScheduler::Count() noexcept + { + return fThreadList.Count(); + } +} // namespace Kernel diff --git a/Kernel/Sources/MPManager.cxx b/Kernel/Sources/MPManager.cxx deleted file mode 100644 index 3ad1e8aa..00000000 --- a/Kernel/Sources/MPManager.cxx +++ /dev/null @@ -1,256 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies - -------------------------------------------- */ - -#include -#include -#include -#include - -///! BUGS: 0 - -///! @file MPManager.cxx -///! @brief This file handles multi processing in Kernel. -///! @brief Multi processing is needed for multi-tasking operations. - -namespace Kernel -{ - STATIC Property cSMPCoreName; - - ///! 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? - 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) - mp_hang_thread(fStack); - else - mp_wakeup_thread(fStack); - } - - EXTERN Bool rt_check_stack(HAL::StackFramePtr stackPtr); - - /// @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(HAL::StackFramePtr stack) - { - if (!rt_check_stack(stack)) - { - /// provide 'nullptr' to free the stack frame. - if (stack == nullptr) - { - delete fStack; - fStack = nullptr; - - return true; - } - - return false; - } - - if (fStack) - { - delete fStack; - fStack = nullptr; - } - - 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. - MPManager::MPManager() - { - StringView strCoreName(512); - strCoreName += "\\Properties\\Smp\\SchedulerClass"; - - cSMPCoreName.GetKey() = strCoreName; - cSMPCoreName.GetValue() = (UIntPtr)this; - - kcout << "newoskrnl: initializing " << strCoreName.CData() << endl; - } - - ///! @brief Default destructor. - MPManager::~MPManager() = default; - - /// @brief Shared singleton function - Ref MPManager::The() - { - static MPManager manager; - return {manager}; - } - - /// @brief Get Stack Frame of Core - HAL::StackFramePtr MPManager::Leak() noexcept - { - if (fThreadList[fCurrentThread].Leak() && - ProcessHelper::TheCurrentPID() == - fThreadList[fCurrentThread].Leak().Leak()->fSourcePID) - return fThreadList[fCurrentThread].Leak().Leak()->fStack; - - return nullptr; - } - - /// @brief Finds and switch to a free core. - bool MPManager::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->SP == 0) - continue; - if (fThreadList[idx].Leak().Leak()->fStack->BP == 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()->Switch(fThreadList[idx].Leak().Leak()->fStack); - - fThreadList[idx].Leak().Leak()->fSourcePID = ProcessHelper::TheCurrentPID(); - - 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 MPManager::operator[](const SizeT& idx) - { - if (idx == 0) - { - if (fThreadList[idx].Leak().Leak()->Kind() != kHartSystemReserved) - { - fThreadList[idx].Leak().Leak()->fKind = kHartBoot; - } - } - else if (idx >= kMaxHarts) - { - static HardwareThread* fakeThread = new HardwareThread(); - - if (!fakeThread) - { - fakeThread = new HardwareThread(); - } - - fakeThread->fKind = kInvalidHart; - - return {fakeThread}; - } - - return fThreadList[idx].Leak(); - } - - /** - * Check if thread pool isn't empty. - * @return - */ - MPManager::operator bool() noexcept - { - return !fThreadList.Empty(); - } - - /** - * Reverse operator bool - * @return - */ - bool MPManager::operator!() noexcept - { - return fThreadList.Empty(); - } - - /// @brief Returns the amount of core present. - /// @return the number of cores. - SizeT MPManager::Count() noexcept - { - return fThreadList.Count(); - } -} // namespace Kernel diff --git a/Kernel/Sources/Main.cxx b/Kernel/Sources/Main.cxx index 145598ac..a23f82c1 100644 --- a/Kernel/Sources/Main.cxx +++ b/Kernel/Sources/Main.cxx @@ -142,8 +142,8 @@ namespace Kernel::Detail STATIC Kernel::Void ke_user_switch(Kernel::Void) { - Kernel::UserView::The()->fRootUser = new User(RingKind::kRingSuperUser, kSuperUser); - Kernel::UserView::The()->LogIn(Kernel::UserView::The()->fRootUser, "root"); + Kernel::UserManager::The()->fRootUser = new User(RingKind::kRingSuperUser, kSuperUser); + Kernel::UserManager::The()->LogIn(Kernel::UserManager::The()->fRootUser, "root"); Kernel::kcout << "newoskrnl: " << cKernelVersion.GetKey().CData() << ": " << Kernel::number(cKernelVersion.GetValue()) << Kernel::endl; } diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx index 94ae5fad..84fc7a1f 100644 --- a/Kernel/Sources/ProcessScheduler.cxx +++ b/Kernel/Sources/ProcessScheduler.cxx @@ -11,7 +11,7 @@ #include #include -#include +#include #include #include #include @@ -395,29 +395,29 @@ namespace Kernel if (!the_stack || new_pid < 0) return false; - for (SizeT index = 0UL; index < MPManager::The().Leak().Count(); ++index) + for (SizeT index = 0UL; index < MPCoreScheduler::The().Leak().Count(); ++index) { - if (MPManager::The().Leak()[index].Leak()->Kind() == kInvalidHart) + if (MPCoreScheduler::The().Leak()[index].Leak()->Kind() == kInvalidHart) continue; - if (MPManager::The().Leak()[index].Leak()->StackFrame() == the_stack) + if (MPCoreScheduler::The().Leak()[index].Leak()->StackFrame() == the_stack) { - MPManager::The().Leak()[index].Leak()->Busy(false); + MPCoreScheduler::The().Leak()[index].Leak()->Busy(false); continue; } - if (MPManager::The().Leak()[index].Leak()->IsBusy()) + if (MPCoreScheduler::The().Leak()[index].Leak()->IsBusy()) continue; - if (MPManager::The().Leak()[index].Leak()->Kind() != + if (MPCoreScheduler::The().Leak()[index].Leak()->Kind() != ThreadKind::kHartBoot && - MPManager::The().Leak()[index].Leak()->Kind() != + MPCoreScheduler::The().Leak()[index].Leak()->Kind() != ThreadKind::kHartSystemReserved) { - MPManager::The().Leak()[index].Leak()->Busy(true); + MPCoreScheduler::The().Leak()[index].Leak()->Busy(true); ProcessHelper::TheCurrentPID() = new_pid; - return MPManager::The().Leak()[index].Leak()->Switch(the_stack); + return MPCoreScheduler::The().Leak()[index].Leak()->Switch(the_stack); } } diff --git a/Kernel/Sources/User.cxx b/Kernel/Sources/User.cxx index dda3d016..e546dd81 100644 --- a/Kernel/Sources/User.cxx +++ b/Kernel/Sources/User.cxx @@ -69,17 +69,17 @@ namespace Kernel return this->Ring() == RingKind::kRingSuperUser; } - UserView* UserView::The() noexcept + UserManager* UserManager::The() noexcept { - UserView* view = nullptr; + UserManager* view = nullptr; if (!view) - view = new UserView(); + view = new UserManager(); return view; } - Bool UserView::LogIn(User* user, const Char* password) noexcept + Bool UserManager::LogIn(User* user, const Char* password) noexcept { if (!password || !user) @@ -143,12 +143,12 @@ namespace Kernel return true; } - User* UserView::Current() noexcept + User* UserManager::Current() noexcept { return fCurrentUser; } - Void UserView::LogOff() noexcept + Void UserManager::LogOff() noexcept { if (!fCurrentUser) return; diff --git a/Kernel/amd64-efi.make b/Kernel/amd64-efi.make index a6bd3772..934481af 100644 --- a/Kernel/amd64-efi.make +++ b/Kernel/amd64-efi.make @@ -39,7 +39,6 @@ LDOBJ = Objects/*.obj # This file is the kernel, responsible of task management and memory. KERNEL = newoskrnl.exe -KERNEL_512K = newoskrnl.512k.exe .PHONY: error error: @@ -71,8 +70,6 @@ link-amd64-epm: .PHONY: all all: newos-amd64-epm link-amd64-epm - qemu-img create -f raw $(KERNEL_512K) 512K - dd if=newoskrnl.exe of=$(KERNEL_512K) bs=1 seek=0 conv=notrunc @echo "NewOSKrnl => OK." .PHONY: help @@ -84,4 +81,4 @@ help: .PHONY: clean clean: - rm -f $(LDOBJ) $(wildcard *.o) $(KERNEL) $(KERNEL_512K) + rm -f $(LDOBJ) $(wildcard *.o) $(KERNEL) diff --git a/Kernel/arm64-efi.make b/Kernel/arm64-efi.make index 60ccb5de..310ffcdd 100644 --- a/Kernel/arm64-efi.make +++ b/Kernel/arm64-efi.make @@ -28,7 +28,6 @@ LDOBJ = Objects/*.obj # This file is the kernel, responsible of task management and memory. KERNEL = newoskrnl.exe -KERNEL_512K = newoskrnl.512k.exe .PHONY: error error: @@ -55,8 +54,6 @@ link-arm64-epm: .PHONY: all all: newos-arm64-epm link-arm64-epm - qemu-img create -f raw $(KERNEL_512K) 512K - dd if=newoskrnl.exe of=$(KERNEL_512K) bs=1 seek=0 conv=notrunc @echo "NewOSKrnl => OK." .PHONY: help @@ -68,4 +65,4 @@ help: .PHONY: clean clean: - rm -f $(LDOBJ) $(wildcard *.o) $(KERNEL) $(KERNEL_512K) + rm -f $(LDOBJ) $(wildcard *.o) $(KERNEL) -- cgit v1.2.3