From 700cfd8d6363cfbb1a949e9d09e83f81c9c90452 Mon Sep 17 00:00:00 2001 From: Amlal Date: Thu, 12 Sep 2024 11:15:53 +0200 Subject: Improve BMP allocator and add kPeDLLBase and kPeEXEBase. Signed-off-by: Amlal --- dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx | 37 ++++++++++++++++++++++++++++++------- dev/ZKA/KernelKit/PE.hxx | 3 +++ 2 files changed, 33 insertions(+), 7 deletions(-) (limited to 'dev') diff --git a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx index b38fb5ef..1e2d697c 100644 --- a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx +++ b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx @@ -27,9 +27,16 @@ namespace Kernel { namespace Detail { - struct IBitMapAllocator final + /// \brief Proxy Interface to allocate a bitmap. + class IBitMapAllocator final { - Bool FreeBitMap(VoidPtr page_ptr) + public: + explicit IBitMapAllocator() = default; + ~IBitMapAllocator() = default; + + ZKA_COPY_DELETE(IBitMapAllocator); + + auto IsBitMap(VoidPtr page_ptr) -> Bool { if (!page_ptr) return No; @@ -40,10 +47,20 @@ namespace Kernel ptr_bit_set[cBitMapMagIdx] != cBitMpMagic) return No; + return Yes; + } + + auto FreeBitMap(VoidPtr page_ptr) -> Bool + { + if (this->IsBitMap(page_ptr) == No) + return No; + + UIntPtr* ptr_bit_set = reinterpret_cast(page_ptr); + ptr_bit_set[cBitMapMagIdx] = cBitMpMagic; ptr_bit_set[cBitMapUsedIdx] = No; - this->PrintStatus(ptr_bit_set); + this->GetBitMapStatus(ptr_bit_set); mm_map_page(ptr_bit_set, ~eFlagsPresent); mm_map_page(ptr_bit_set, ~eFlagsRw); @@ -54,7 +71,7 @@ namespace Kernel /// @brief Iterate over availables pages for a free one. /// @return The new address which was found. - VoidPtr FindBitMap(VoidPtr base_ptr, SizeT size, Bool rw, Bool user) noexcept + auto FindBitMap(VoidPtr base_ptr, SizeT size, Bool rw, Bool user) -> VoidPtr { auto base = reinterpret_cast(base_ptr); @@ -71,7 +88,7 @@ namespace Kernel ptr_bit_set[cBitMapSizeIdx] = size; ptr_bit_set[cBitMapUsedIdx] = Yes; - this->PrintStatus(ptr_bit_set); + this->GetBitMapStatus(ptr_bit_set); return (VoidPtr)ptr_bit_set; } @@ -85,7 +102,7 @@ namespace Kernel ptr_bit_set[cBitMapSizeIdx] = size; ptr_bit_set[cBitMapUsedIdx] = Yes; - this->PrintStatus(ptr_bit_set); + this->GetBitMapStatus(ptr_bit_set); return (VoidPtr)ptr_bit_set; } @@ -100,8 +117,14 @@ namespace Kernel } /// @brief Print Bitmap status - Void PrintStatus(UIntPtr* ptr_bit_set) + auto GetBitMapStatus(UIntPtr* ptr_bit_set) -> Void { + if (!this->IsBitMap(ptr_bit_set)) + { + kcout << "Not a BMP: " << hex_number((UIntPtr)ptr_bit_set) << endl; + return; + } + kcout << "Magic Number: " << hex_number(ptr_bit_set[cBitMapMagIdx]) << endl; kcout << "Allocated: " << (ptr_bit_set[cBitMapUsedIdx] ? "Yes" : "No") << endl; kcout << "Size of pointer (B): " << number(ptr_bit_set[cBitMapSizeIdx]) << endl; diff --git a/dev/ZKA/KernelKit/PE.hxx b/dev/ZKA/KernelKit/PE.hxx index 4bf3cf9c..bab723ef 100644 --- a/dev/ZKA/KernelKit/PE.hxx +++ b/dev/ZKA/KernelKit/PE.hxx @@ -18,6 +18,9 @@ #define kPeMagic 0x00004550 +#define kPeDLLBase 0x4000000 +#define kPeEXEBase 0x1000000 + #define kMagPE32 0x010b #define kMagPE64 0x020b -- cgit v1.2.3