diff options
| author | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-08-14 14:31:44 +0200 |
|---|---|---|
| committer | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-08-14 14:31:44 +0200 |
| commit | dfb251be90815a56e44bdbb1c10c0b336fa4263e (patch) | |
| tree | 29c08fec0ce4aa8079c8f8f662083d9e05043f9c /Kernel/HALKit | |
| parent | d20a92ae35ba36d6ce4d2edf17b83c3e58d2fa4c (diff) | |
[FIX] move VMT allocator to specific HAL.
Signed-off-by: Amlal EL Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'Kernel/HALKit')
| -rw-r--r-- | Kernel/HALKit/AMD64/HalPageAlloc.cxx | 115 |
1 files changed, 115 insertions, 0 deletions
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 <ArchKit/ArchKit.hxx> + +#ifdef __NEWOS_AMD64__ +#include <HALKit/AMD64/HalPageAlloc.hxx> +#elif defined(__NEWOS_ARM64__) +#include <HALKit/ARM64/HalPageAlloc.hxx> +#endif + +#include <NewKit/Defines.hxx> +#include <NewKit/KernelCheck.hxx> + +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<Detail::VIRTUAL_MEMORY_HEADER*>(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<VoidPtr>(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 |
