From 711dcbb464de6339a2dc5cd251f2096616d5ea09 Mon Sep 17 00:00:00 2001 From: Amlal Date: Tue, 28 Jan 2025 17:29:59 +0100 Subject: ADD: Better BitMap Manager and Interrupt API needs some tweaking for fast-path syscalls on AMD64. Signed-off-by: Amlal --- dev/Kernel/HALKit/AMD64/HalInterruptAPI.asm | 1 - dev/Kernel/src/BitMapMgr.cc | 39 +++++++++++++++++------------ 2 files changed, 23 insertions(+), 17 deletions(-) (limited to 'dev') diff --git a/dev/Kernel/HALKit/AMD64/HalInterruptAPI.asm b/dev/Kernel/HALKit/AMD64/HalInterruptAPI.asm index b3d8d91f..75a2b537 100644 --- a/dev/Kernel/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/Kernel/HALKit/AMD64/HalInterruptAPI.asm @@ -364,7 +364,6 @@ extern hal_real_init hal_reload_segments: std - jmp hal_real_init ret diff --git a/dev/Kernel/src/BitMapMgr.cc b/dev/Kernel/src/BitMapMgr.cc index a098322c..1be0ed3c 100644 --- a/dev/Kernel/src/BitMapMgr.cc +++ b/dev/Kernel/src/BitMapMgr.cc @@ -29,13 +29,13 @@ namespace Kernel namespace Detail { /// \brief Proxy Interface to allocate a bitmap. - class IBitMapAllocator final + class IBitMap final { public: - explicit IBitMapAllocator() = default; - ~IBitMapAllocator() = default; + explicit IBitMap() = default; + ~IBitMap() = default; - ZKA_COPY_DELETE(IBitMapAllocator); + ZKA_COPY_DELETE(IBitMap); auto IsBitMap(VoidPtr page_ptr) -> Bool { @@ -88,12 +88,14 @@ namespace Kernel VoidPtr base = reinterpret_cast(((UIntPtr)base_ptr) + kPageSize); + static SizeT biggest_block = 0UL; + while (YES) { UIntPtr* ptr_bit_set = reinterpret_cast(base); if (ptr_bit_set[kBitMapMagIdx] == kBitMapMagic && - ptr_bit_set[kBitMapSizeIdx] <= size) + ptr_bit_set[kBitMapSizeIdx] == size) { if (ptr_bit_set[kBitMapUsedIdx] == No) { @@ -105,10 +107,11 @@ namespace Kernel UInt32 flags = this->MakeMMFlags(wr, user); mm_map_page(ptr_bit_set, flags); + if (biggest_block < size) + biggest_block = size; + return (VoidPtr)ptr_bit_set; } - - kcout << "Missed potential BitMap as it is already used!\r\n"; } else if (ptr_bit_set[kBitMapMagIdx] != kBitMapMagic) { @@ -121,6 +124,9 @@ namespace Kernel UInt32 flags = this->MakeMMFlags(wr, user); mm_map_page(ptr_bit_set, flags); + if (biggest_block < size) + biggest_block = size; + return (VoidPtr)ptr_bit_set; } @@ -153,8 +159,8 @@ namespace Kernel auto mm_is_bitmap(VoidPtr ptr) -> Bool { - Detail::IBitMapAllocator traits; - return traits.IsBitMap(ptr); + Detail::IBitMap bitmp; + return bitmp.IsBitMap(ptr); } /// @brief Allocate a new page to be used by the OS. @@ -163,22 +169,23 @@ namespace Kernel /// @return a new bitmap allocated pointer. auto mm_alloc_bitmap(Boolean wr, Boolean user, SizeT size, Bool is_page) -> VoidPtr { - VoidPtr ptr_new = nullptr; - Detail::IBitMapAllocator traits; + VoidPtr ptr_new = nullptr; + Detail::IBitMap bitmp; - ptr_new = traits.FindBitMap(kKernelBitMpStart, size, wr, user); + ptr_new = bitmp.FindBitMap(kKernelBitMpStart, size, wr, user); return (UIntPtr*)ptr_new; } /// @brief Free Bitmap, and mark it a absent in page terms. - auto mm_free_bitmap(VoidPtr page_ptr) -> Bool + /// @param ptr the pointer to free. + auto mm_free_bitmap(VoidPtr ptr) -> Bool { - if (!page_ptr) + if (!ptr) return No; - Detail::IBitMapAllocator traits; - Bool ret = traits.FreeBitMap(page_ptr); + Detail::IBitMap bitmp; + Bool ret = bitmp.FreeBitMap(ptr); return ret; } -- cgit v1.2.3