From dfb251be90815a56e44bdbb1c10c0b336fa4263e Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Wed, 14 Aug 2024 14:31:44 +0200 Subject: [FIX] move VMT allocator to specific HAL. Signed-off-by: Amlal EL Mahrouss --- Kernel/HALKit/AMD64/HalPageAlloc.cxx | 115 +++++++++++++++++++++++++++++++++++ Kernel/Sources/HalPageAlloc.cxx | 115 ----------------------------------- 2 files changed, 115 insertions(+), 115 deletions(-) create mode 100644 Kernel/HALKit/AMD64/HalPageAlloc.cxx delete mode 100644 Kernel/Sources/HalPageAlloc.cxx (limited to 'Kernel') diff --git a/Kernel/HALKit/AMD64/HalPageAlloc.cxx b/Kernel/HALKit/AMD64/HalPageAlloc.cxx new file mode 100644 index 00000000..d8c7696e --- /dev/null +++ b/Kernel/HALKit/AMD64/HalPageAlloc.cxx @@ -0,0 +1,115 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + +------------------------------------------- */ + +#include + +#ifdef __NEWOS_AMD64__ +#include +#elif defined(__NEWOS_ARM64__) +#include +#endif + +#include +#include + +Kernel::Boolean kAllocationInProgress = false; + +namespace Kernel +{ + constexpr auto cVMHMagic = 0xDEEFD00D; + + namespace HAL + { + namespace Detail + { + struct VIRTUAL_MEMORY_HEADER + { + UInt32 Magic; + Boolean Present : 1; + Boolean ReadWrite : 1; + Boolean User : 1; + SizeT Size; + }; + + struct VirtualMemoryHeaderTraits final + { + /// @brief Get next header. + /// @param current + /// @return + VIRTUAL_MEMORY_HEADER* Next(VIRTUAL_MEMORY_HEADER* current) + { + if (current->Magic != cVMHMagic) + current->Size = 8196; + + return current + sizeof(VIRTUAL_MEMORY_HEADER) + current->Size; + } + + /// @brief Get previous header. + /// @param current + /// @return + VIRTUAL_MEMORY_HEADER* Prev(VIRTUAL_MEMORY_HEADER* current) + { + if (current->Magic != cVMHMagic) + current->Size = 8196; + + return current - sizeof(VIRTUAL_MEMORY_HEADER) - current->Size; + } + }; + } // namespace Detail + + /// @brief Allocates a new page of memory. + /// @param sz the size of it. + /// @param rw read/write flag. + /// @param user user flag. + /// @return the page table of it. + STATIC auto hal_try_alloc_new_page(Boolean rw, Boolean user, SizeT size) -> VoidPtr + { + if (kAllocationInProgress) + return nullptr; + + kAllocationInProgress = true; + + //! fetch from the start. + Detail::VIRTUAL_MEMORY_HEADER* vmHeader = reinterpret_cast(kKernelVMTStart); + Detail::VirtualMemoryHeaderTraits traits; + + while (vmHeader->Present && + vmHeader->Magic == cVMHMagic) + { + vmHeader = traits.Next(vmHeader); + } + + vmHeader->Magic = cVMHMagic; + vmHeader->Present = true; + vmHeader->ReadWrite = rw; + vmHeader->User = user; + vmHeader->Size = size; + + kAllocationInProgress = false; + + return reinterpret_cast(vmHeader + sizeof(Detail::VIRTUAL_MEMORY_HEADER)); + } + + /// @brief Allocate a new page to be used by the OS. + /// @param rw read/write bit. + /// @param user user bit. + /// @return + auto hal_alloc_page(Boolean rw, Boolean user, SizeT size) -> VoidPtr + { + // Wait for a ongoing allocation to complete. + while (kAllocationInProgress) + { + (void)0; + } + + if (size == 0) + ++size; + + // allocate new page. + return hal_try_alloc_new_page(rw, user, size); + } + } // namespace HAL +} // namespace Kernel diff --git a/Kernel/Sources/HalPageAlloc.cxx b/Kernel/Sources/HalPageAlloc.cxx deleted file mode 100644 index d8c7696e..00000000 --- a/Kernel/Sources/HalPageAlloc.cxx +++ /dev/null @@ -1,115 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies - -------------------------------------------- */ - -#include - -#ifdef __NEWOS_AMD64__ -#include -#elif defined(__NEWOS_ARM64__) -#include -#endif - -#include -#include - -Kernel::Boolean kAllocationInProgress = false; - -namespace Kernel -{ - constexpr auto cVMHMagic = 0xDEEFD00D; - - namespace HAL - { - namespace Detail - { - struct VIRTUAL_MEMORY_HEADER - { - UInt32 Magic; - Boolean Present : 1; - Boolean ReadWrite : 1; - Boolean User : 1; - SizeT Size; - }; - - struct VirtualMemoryHeaderTraits final - { - /// @brief Get next header. - /// @param current - /// @return - VIRTUAL_MEMORY_HEADER* Next(VIRTUAL_MEMORY_HEADER* current) - { - if (current->Magic != cVMHMagic) - current->Size = 8196; - - return current + sizeof(VIRTUAL_MEMORY_HEADER) + current->Size; - } - - /// @brief Get previous header. - /// @param current - /// @return - VIRTUAL_MEMORY_HEADER* Prev(VIRTUAL_MEMORY_HEADER* current) - { - if (current->Magic != cVMHMagic) - current->Size = 8196; - - return current - sizeof(VIRTUAL_MEMORY_HEADER) - current->Size; - } - }; - } // namespace Detail - - /// @brief Allocates a new page of memory. - /// @param sz the size of it. - /// @param rw read/write flag. - /// @param user user flag. - /// @return the page table of it. - STATIC auto hal_try_alloc_new_page(Boolean rw, Boolean user, SizeT size) -> VoidPtr - { - if (kAllocationInProgress) - return nullptr; - - kAllocationInProgress = true; - - //! fetch from the start. - Detail::VIRTUAL_MEMORY_HEADER* vmHeader = reinterpret_cast(kKernelVMTStart); - Detail::VirtualMemoryHeaderTraits traits; - - while (vmHeader->Present && - vmHeader->Magic == cVMHMagic) - { - vmHeader = traits.Next(vmHeader); - } - - vmHeader->Magic = cVMHMagic; - vmHeader->Present = true; - vmHeader->ReadWrite = rw; - vmHeader->User = user; - vmHeader->Size = size; - - kAllocationInProgress = false; - - return reinterpret_cast(vmHeader + sizeof(Detail::VIRTUAL_MEMORY_HEADER)); - } - - /// @brief Allocate a new page to be used by the OS. - /// @param rw read/write bit. - /// @param user user bit. - /// @return - auto hal_alloc_page(Boolean rw, Boolean user, SizeT size) -> VoidPtr - { - // Wait for a ongoing allocation to complete. - while (kAllocationInProgress) - { - (void)0; - } - - if (size == 0) - ++size; - - // allocate new page. - return hal_try_alloc_new_page(rw, user, size); - } - } // namespace HAL -} // namespace Kernel -- cgit v1.2.3