diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-05-08 12:32:41 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-05-08 12:32:41 +0200 |
| commit | 09dd11ddf800898c00ecb04a65fb5cd10fb481fa (patch) | |
| tree | eda0b4e23d6a71da7de3a78f0bb76ec3201dd2f9 /Private/Source/KernelHeap.cxx | |
| parent | ca83108fd138cc0398f900e6a6c0a53ad51aee31 (diff) | |
MHR-23: :boom: changes, reworked project tree.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'Private/Source/KernelHeap.cxx')
| -rw-r--r-- | Private/Source/KernelHeap.cxx | 169 |
1 files changed, 0 insertions, 169 deletions
diff --git a/Private/Source/KernelHeap.cxx b/Private/Source/KernelHeap.cxx deleted file mode 100644 index 57777888..00000000 --- a/Private/Source/KernelHeap.cxx +++ /dev/null @@ -1,169 +0,0 @@ -/* ------------------------------------------- - - Copyright Mahrouss Logic - -------------------------------------------- */ - -#include <KernelKit/DebugOutput.hpp> -#include <KernelKit/HError.hpp> -#include <KernelKit/KernelHeap.hpp> -#include <NewKit/Crc32.hpp> -#include <NewKit/PageManager.hpp> - -//! @file KernelHeap.cxx -//! @brief Kernel allocator. - -#define kKernelHeapMagic (0xD4D7D5) -#define kKernelHeapHeaderPaddingSz (16U) - -namespace NewOS -{ - STATIC SizeT kHeapCount = 0UL; - STATIC PageManager kHeapPageManager; - - namespace Detail - { - /// @brief Kernel heap information block. - /// Located before the address bytes. - /// | HIB | ADDRESS | - struct PACKED HeapInformationBlock final - { - ///! @brief 32-bit value which contains the magic number of the executable. - UInt32 fMagic; - ///! @brief Boolean value which tells if the pointer is allocated. - Boolean fPresent; - ///! @brief 32-bit CRC checksum - UInt32 fCRC32; - /// @brief 64-bit pointer size. - SizeT fTargetPtrSize; - /// @brief 64-bit target pointer. - UIntPtr fTargetPtr; - UInt8 fPadding[kKernelHeapHeaderPaddingSz]; - }; - - typedef HeapInformationBlock* HeapInformationBlockPtr; - } // namespace Detail - - /// @brief allocate chunk of memory. - /// @param sz size of pointer - /// @param rw read write (true to enable it) - /// @param user is it accesible by user processes? - /// @return the pointer - VoidPtr ke_new_ke_heap(SizeT sz, const bool rw, const bool user) - { - if (sz == 0) - ++sz; - - auto wrapper = kHeapPageManager.Request(rw, user, false, sz); - - Detail::HeapInformationBlockPtr heapInfo = - reinterpret_cast<Detail::HeapInformationBlockPtr>( - wrapper.VirtualAddress()); - - heapInfo->fTargetPtrSize = sz; - heapInfo->fMagic = kKernelHeapMagic; - heapInfo->fCRC32 = 0; // dont fill it for now. - heapInfo->fTargetPtr = wrapper.VirtualAddress(); - - ++kHeapCount; - - return reinterpret_cast<VoidPtr>(wrapper.VirtualAddress() + - sizeof(Detail::HeapInformationBlock)); - } - - /// @brief Declare pointer as free. - /// @param heapPtr the pointer. - /// @return - Int32 ke_delete_ke_heap(VoidPtr heapPtr) - { - if (kHeapCount < 1) - return -kErrorInternal; - if (((IntPtr)heapPtr - sizeof(Detail::HeapInformationBlock)) <= 0) - return -kErrorInternal; - if (((IntPtr)heapPtr - kBadPtr) < 0) - return -kErrorInternal; - - Detail::HeapInformationBlockPtr virtualAddress = - reinterpret_cast<Detail::HeapInformationBlockPtr>( - (UIntPtr)heapPtr - sizeof(Detail::HeapInformationBlock)); - - if (virtualAddress && virtualAddress->fMagic == kKernelHeapMagic) - { - if (!virtualAddress->fPresent) - { - return -kErrorHeapNotPresent; - } - - if (virtualAddress->fCRC32 != 0) - { - if (virtualAddress->fCRC32 != - ke_calculate_crc32((Char*)virtualAddress->fTargetPtr, - virtualAddress->fTargetPtrSize)) - { - ke_stop(RUNTIME_CHECK_POINTER); - } - } - - virtualAddress->fTargetPtrSize = 0UL; - virtualAddress->fPresent = false; - virtualAddress->fTargetPtr = 0; - virtualAddress->fCRC32 = 0; - virtualAddress->fMagic = 0; - - PTEWrapper pageWrapper(false, false, false, (UIntPtr)virtualAddress); - Ref<PTEWrapper*> pteAddress{&pageWrapper}; - - kHeapPageManager.Free(pteAddress); - - --kHeapCount; - return 0; - } - - return -kErrorInternal; - } - - /// @brief Check if pointer is a valid kernel pointer. - /// @param heapPtr the pointer - /// @return if it exists. - Boolean ke_is_valid_heap(VoidPtr heapPtr) - { - if (kHeapCount < 1) - return false; - - if (heapPtr) - { - Detail::HeapInformationBlockPtr virtualAddress = - reinterpret_cast<Detail::HeapInformationBlockPtr>( - (UIntPtr)heapPtr - sizeof(Detail::HeapInformationBlock)); - - if (virtualAddress->fPresent && virtualAddress->fMagic == kKernelHeapMagic) - { - return true; - } - } - - return false; - } - - /// @brief Protect the heap with a CRC value. - /// @param heapPtr HIB pointer. - /// @return if it valid: point has crc now., otherwise fail. - Boolean ke_protect_ke_heap(VoidPtr heapPtr) - { - if (heapPtr) - { - Detail::HeapInformationBlockPtr virtualAddress = - reinterpret_cast<Detail::HeapInformationBlockPtr>( - (UIntPtr)heapPtr - sizeof(Detail::HeapInformationBlock)); - - if (virtualAddress->fPresent && kKernelHeapMagic == virtualAddress->fMagic) - { - virtualAddress->fCRC32 = - ke_calculate_crc32((Char*)heapPtr, virtualAddress->fTargetPtrSize); - return true; - } - } - - return false; - } -} // namespace NewOS |
