summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/src/BitMapMgr.cc
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-05-29 10:51:53 +0200
committerGitHub <noreply@github.com>2025-05-29 10:51:53 +0200
commit5c0bb7ee7b1b0fee02cc179fb21f4c57a61d6c2d (patch)
treecb17577bcdc9714c97a84ce417a075117097f146 /dev/kernel/src/BitMapMgr.cc
parentd608230b1350b064ceb01e6572519b108f6139b0 (diff)
parent3167f59dbb401d6a79b1524537e04218baf49ee3 (diff)
Merge pull request #32 from nekernel-org/dev
0.0.2e3
Diffstat (limited to 'dev/kernel/src/BitMapMgr.cc')
-rw-r--r--dev/kernel/src/BitMapMgr.cc32
1 files changed, 25 insertions, 7 deletions
diff --git a/dev/kernel/src/BitMapMgr.cc b/dev/kernel/src/BitMapMgr.cc
index 7cbcf376..df678d41 100644
--- a/dev/kernel/src/BitMapMgr.cc
+++ b/dev/kernel/src/BitMapMgr.cc
@@ -11,7 +11,7 @@
#endif
#include <ArchKit/ArchKit.h>
-#include <NewKit/KernelPanic.h>
+#include <NeKit/KernelPanic.h>
#define kBitMapMagic (0x10210U)
@@ -22,6 +22,8 @@
namespace Kernel {
namespace HAL {
namespace Detail {
+ STATIC SizeT kBitMapCursor = 0UL;
+
/***********************************************************************************/
/// \brief Proxy Interface to manage a bitmap allocator.
/***********************************************************************************/
@@ -47,6 +49,8 @@ namespace HAL {
UIntPtr* ptr_bit_set = reinterpret_cast<UIntPtr*>(page_ptr);
+ kBitMapCursor += ptr_bit_set[kBitMapSizeIdx];
+
ptr_bit_set[kBitMapMagIdx] = kBitMapMagic;
ptr_bit_set[kBitMapUsedIdx] = No;
@@ -59,7 +63,6 @@ namespace HAL {
UInt32 flags = kMMFlagsPresent;
if (wr) flags |= kMMFlagsWr;
-
if (user) flags |= kMMFlagsUser;
return flags;
@@ -77,11 +80,18 @@ namespace HAL {
auto FindBitMap(VoidPtr base_ptr, SizeT size, Bool wr, Bool user, SizeT pad) -> VoidPtr {
if (!size) return nullptr;
+ if (kBitMapCursor > kKernelBitMpSize) {
+ err_global_get() = kErrorOutOfBitMapMemory;
+
+ (Void)(kout << "Bitmap limit reached, can't allocate more bitmaps." << kendl);
+ return nullptr;
+ }
+
VoidPtr base = reinterpret_cast<VoidPtr>((UIntPtr) base_ptr);
MUST_PASS(base);
- static SizeT biggest = 0UL;
+ STATIC SizeT biggest = 0UL;
while (YES) {
UIntPtr* ptr_bit_set = reinterpret_cast<UIntPtr*>(base);
@@ -99,6 +109,8 @@ namespace HAL {
if (biggest < (size + pad)) biggest = size + pad;
+ kBitMapCursor += size + pad;
+
return (VoidPtr) ptr_bit_set;
}
} else if (ptr_bit_set[kBitMapMagIdx] != kBitMapMagic) {
@@ -113,6 +125,8 @@ namespace HAL {
if (biggest < (size + pad)) biggest = (size + pad);
+ kBitMapCursor += size + pad;
+
return (VoidPtr) ptr_bit_set;
}
@@ -136,7 +150,6 @@ namespace HAL {
return;
}
-#ifdef __NE_VERBOSE_BITMAP__
(Void)(kout << "Magic: " << hex_number(ptr_bit_set[kBitMapMagIdx]) << kendl);
(Void)(kout << "Is Allocated? " << (ptr_bit_set[kBitMapUsedIdx] ? "YES" : "NO") << kendl);
(Void)(kout << "Size of BitMap (B): " << number(ptr_bit_set[kBitMapSizeIdx]) << kendl);
@@ -149,7 +162,6 @@ namespace HAL {
(Void)(kout << "Size of BitMap (TIB): " << number(TIB(ptr_bit_set[kBitMapSizeIdx]))
<< kendl);
(Void)(kout << "BitMap Address: " << hex_number((UIntPtr) ptr_bit_set) << kendl);
-#endif
}
};
} // namespace Detail
@@ -169,10 +181,16 @@ namespace HAL {
VoidPtr ptr_new = nullptr;
Detail::IBitMapProxy bitmp;
- NE_UNUSED(is_page);
+ if (is_page) return nullptr;
ptr_new = bitmp.FindBitMap(kKernelBitMpStart, size, wr, user, pad);
- return (UIntPtr*) ptr_new;
+
+ if (!ptr_new) {
+ ke_panic(RUNTIME_CHECK_VIRTUAL_OUT_OF_MEM, "Out of memory bitmap");
+ return nullptr;
+ }
+
+ return ptr_new;
}
/***********************************************************************************/