From d42e9fa42af70105346f14c8b48f60cd3f4ea845 Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Sun, 28 Jul 2024 08:37:45 +0200 Subject: [IMP] New Storage.hpp inside StorageKit. [REFACTOR] Process heap adjustements. [WIP] SMP and Ring-3 switch for scheduler core. Signed-off-by: Amlal EL Mahrouss --- Kernel/Sources/HalPageAlloc.cxx | 8 ++--- Kernel/Sources/ProcessHeap.cxx | 71 +++++++++++++++++++------------------ Kernel/Sources/ProcessScheduler.cxx | 8 ++++- Kernel/Sources/Utils.cxx | 2 +- 4 files changed, 49 insertions(+), 40 deletions(-) (limited to 'Kernel/Sources') diff --git a/Kernel/Sources/HalPageAlloc.cxx b/Kernel/Sources/HalPageAlloc.cxx index dad70f02..75e31e86 100644 --- a/Kernel/Sources/HalPageAlloc.cxx +++ b/Kernel/Sources/HalPageAlloc.cxx @@ -29,7 +29,7 @@ namespace Kernel Boolean Present; Boolean ReadWrite; Boolean User; - SizeT PageSize; + SizeT Size; }; struct VirtualMemoryHeaderTraits @@ -39,7 +39,7 @@ namespace Kernel /// @return VirtualMemoryHeader* Next(VirtualMemoryHeader* current) { - return current + sizeof(PTE) + current->PageSize; + return current + sizeof(VirtualMemoryHeader) + current->Size; } /// @brief Get previous header. @@ -47,7 +47,7 @@ namespace Kernel /// @return VirtualMemoryHeader* Prev(VirtualMemoryHeader* current) { - return current - sizeof(PTE) - current->PageSize; + return current - sizeof(VirtualMemoryHeader) - current->Size; } }; } // namespace Detail @@ -80,7 +80,7 @@ namespace Kernel vmHeader->Present = true; vmHeader->ReadWrite = rw; vmHeader->User = user; - vmHeader->PageSize = size; + vmHeader->Size = size; kAllocationInProgress = false; diff --git a/Kernel/Sources/ProcessHeap.cxx b/Kernel/Sources/ProcessHeap.cxx index 4a2205e6..86ac1554 100644 --- a/Kernel/Sources/ProcessHeap.cxx +++ b/Kernel/Sources/ProcessHeap.cxx @@ -22,7 +22,7 @@ namespace Kernel * @brief Process Heap Header * @note Allocated per process, it denotes the user's heap. */ - struct UserHeapHeader final + struct PROCESS_HEAP_HEADER final { UInt32 fMagic; Int32 fFlags; @@ -30,35 +30,38 @@ namespace Kernel UInt8 fPadding[kHeapHeaderPaddingSz]; }; + /// @brief PROCESS_HEAP_HEADER as pointer type. + typedef PROCESS_HEAP_HEADER* PROCESS_HEAP_HEADER_PTR; + /** - * @brief User Heap Manager class, takes care of allocating the process pools. + * @brief Process heap class, takes care of allocating the process pools. * @note This rely on Virtual Memory! Consider adding good vmem support when * @note porting to a new arch. */ - class UserHeapManager final + class ProcessHeapHelper final { - UserHeapManager() = delete; + ProcessHeapHelper() = delete; public: - ~UserHeapManager() = default; + ~ProcessHeapHelper() = default; public: - STATIC SizeT& Count() + STATIC SizeT& Count() noexcept { return s_NumPools; } - STATIC Ref& Leak() + STATIC Ref& Leak() noexcept { return s_Pmm; } - STATIC Boolean& IsEnabled() + STATIC Boolean& IsEnabled() noexcept { return s_PoolsAreEnabled; } - STATIC MutableArray>& The() + STATIC MutableArray>& The() noexcept { return s_Pool; } @@ -74,10 +77,10 @@ namespace Kernel //! declare fields - SizeT UserHeapManager::s_NumPools = 0UL; - Ref UserHeapManager::s_Pmm; - Boolean UserHeapManager::s_PoolsAreEnabled = true; - MutableArray> UserHeapManager::s_Pool; + SizeT ProcessHeapHelper::s_NumPools = 0UL; + Ref ProcessHeapHelper::s_Pmm; + Boolean ProcessHeapHelper::s_PoolsAreEnabled = true; + MutableArray> ProcessHeapHelper::s_Pool; STATIC VoidPtr ke_find_unused_heap(Int32 flags); STATIC Void ke_free_heap_internal(VoidPtr vaddr); @@ -91,15 +94,15 @@ namespace Kernel { for (SizeT index = 0; index < kUserHeapMaxSz; ++index) { - if (UserHeapManager::The()[index] && - !UserHeapManager::The()[index].Leak().Leak().Present()) + if (ProcessHeapHelper::The()[index] && + !ProcessHeapHelper::The()[index].Leak().Leak().Present()) { - UserHeapManager::Leak().Leak().TogglePresent( - UserHeapManager::The()[index].Leak().Leak(), true); + ProcessHeapHelper::Leak().Leak().TogglePresent( + ProcessHeapHelper::The()[index].Leak().Leak(), true); kcout << "[ke_find_unused_heap] Done, trying to make a pool now...\r"; return ke_make_heap_internal( - (VoidPtr)UserHeapManager::The()[index].Leak().Leak().VirtualAddress(), + (VoidPtr)ProcessHeapHelper::The()[index].Leak().Leak().VirtualAddress(), flags); } } @@ -115,7 +118,7 @@ namespace Kernel { if (virtualAddress) { - UserHeapHeader* poolHdr = reinterpret_cast(virtualAddress); + PROCESS_HEAP_HEADER* poolHdr = reinterpret_cast(virtualAddress); if (!poolHdr->fFree) { @@ -130,7 +133,7 @@ namespace Kernel kcout << "[ke_make_heap_internal] New allocation has been done.\n"; return reinterpret_cast( - (reinterpret_cast(virtualAddress) + sizeof(UserHeapHeader))); + (reinterpret_cast(virtualAddress) + sizeof(PROCESS_HEAP_HEADER))); } kcout << "[ke_make_heap_internal] Address is invalid"; @@ -143,8 +146,8 @@ namespace Kernel /// @return STATIC Void ke_free_heap_internal(VoidPtr virtualAddress) { - UserHeapHeader* poolHdr = reinterpret_cast( - reinterpret_cast(virtualAddress) - sizeof(UserHeapHeader)); + PROCESS_HEAP_HEADER* poolHdr = reinterpret_cast( + reinterpret_cast(virtualAddress) - sizeof(PROCESS_HEAP_HEADER)); if (poolHdr->fMagic == kUserHeapMag) { @@ -170,18 +173,18 @@ namespace Kernel */ STATIC Boolean ke_check_and_free_heap(const SizeT& index, VoidPtr ptr) { - if (UserHeapManager::The()[index]) + if (ProcessHeapHelper::The()[index]) { // ErrorOr<>::operator Boolean /// if (address matches) /// -> Free heap. - if (UserHeapManager::The()[index].Leak().Leak().VirtualAddress() == + if (ProcessHeapHelper::The()[index].Leak().Leak().VirtualAddress() == (UIntPtr)ptr) { - UserHeapManager::Leak().Leak().FreePage( - UserHeapManager::The()[index].Leak().Leak()); + ProcessHeapHelper::Leak().Leak().FreePage( + ProcessHeapHelper::The()[index].Leak().Leak()); - --UserHeapManager::Count(); + --ProcessHeapHelper::Count(); ke_free_heap_internal(ptr); ptr = nullptr; @@ -198,24 +201,24 @@ namespace Kernel /// @return a pool pointer with selected permissions. VoidPtr rt_new_heap(Int32 flags) { - if (!UserHeapManager::IsEnabled()) + if (!ProcessHeapHelper::IsEnabled()) return nullptr; - if (UserHeapManager::Count() > kUserHeapMaxSz) + if (ProcessHeapHelper::Count() > kUserHeapMaxSz) return nullptr; if (VoidPtr ret = ke_find_unused_heap(flags)) return ret; // this wasn't set to true - auto ref_page = UserHeapManager::Leak().Leak().RequestPage( + auto ref_page = ProcessHeapHelper::Leak().Leak().RequestPage( ((flags & kUserHeapUser)), (flags & kUserHeapRw)); if (ref_page) { ///! reserve page. - UserHeapManager::The()[UserHeapManager::Count()].Leak() = ref_page; - auto& ref = UserHeapManager::Count(); + ProcessHeapHelper::The()[ProcessHeapHelper::Count()].Leak() = ref_page; + auto& ref = ProcessHeapHelper::Count(); ++ref; // increment the number of addresses we have now. @@ -232,12 +235,12 @@ namespace Kernel /// @return status code Int32 rt_free_heap(VoidPtr ptr) { - if (!UserHeapManager::IsEnabled()) + if (!ProcessHeapHelper::IsEnabled()) return -1; if (ptr) { - SizeT base = UserHeapManager::Count(); + SizeT base = ProcessHeapHelper::Count(); if (ke_check_and_free_heap(base, ptr)) return 0; diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx index 8119c11e..bfa6fddf 100644 --- a/Kernel/Sources/ProcessScheduler.cxx +++ b/Kernel/Sources/ProcessScheduler.cxx @@ -43,10 +43,16 @@ namespace Kernel void ProcessHeader::Crash() { - kcout << (*this->Name == 0 ? "Unknown" : this->Name) << ": crashed. (id = "; + kcout << (*this->Name == 0 ? "Kernel" : this->Name) << ": crashed. (id = "; kcout.Number(kErrorProcessFault); kcout << ")\r"; + if (Kernel::ProcessScheduler::The().Leak().CurrentTeam().AsArray().Count() < 1) + { + kcout << "*** BAD PROCESS ***\rTerminating as we are the only process...\r"; + ke_stop(RUNTIME_CHECK_PROCESS); + } + this->Exit(kErrorProcessFault); } diff --git a/Kernel/Sources/Utils.cxx b/Kernel/Sources/Utils.cxx index 12e2e2a8..eeac3f93 100644 --- a/Kernel/Sources/Utils.cxx +++ b/Kernel/Sources/Utils.cxx @@ -37,7 +37,7 @@ namespace Kernel { if (len > _len) { - break; + return 0; } ++len; -- cgit v1.2.3