aboutsummaryrefslogtreecommitdiff
path: root/kernel/mm/physical_mm/memory_map.c
diff options
context:
space:
mode:
authorRaghuram Subramani <raghus2247@gmail.com>2025-01-09 12:12:21 -0500
committerRaghuram Subramani <raghus2247@gmail.com>2025-01-09 12:12:21 -0500
commit19a69c5f6249c8e2fdadd1217de75f6ba5496838 (patch)
tree62e59b8fdbc9309815790c2cc68312865d0e61ab /kernel/mm/physical_mm/memory_map.c
parent2c2f6f78b8291b764dd5ac5027f08b4de0799d68 (diff)
kernel: mm: physical: Move the memory map functions to another file
Diffstat (limited to 'kernel/mm/physical_mm/memory_map.c')
-rw-r--r--kernel/mm/physical_mm/memory_map.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/kernel/mm/physical_mm/memory_map.c b/kernel/mm/physical_mm/memory_map.c
new file mode 100644
index 0000000..2df905c
--- /dev/null
+++ b/kernel/mm/physical_mm/memory_map.c
@@ -0,0 +1,41 @@
+#include <stdbool.h>
+#include <stdint.h>
+
+#include <mm/memory_map.h>
+#include <mm/physical_mm.h>
+
+/* Marks the block as 'used' */
+ALWAYS_INLINE void
+physical_mm_set_used(const uint32_t bit,
+ uint32_t *total_free_blocks,
+ uint32_t *memory_map)
+{
+ uint32_t memory_map_index = bit / BITMAP_ENTRY_SIZE;
+ uint32_t bitmask = 1 << (bit % BITMAP_ENTRY_SIZE);
+ (*total_free_blocks)--;
+ memory_map[memory_map_index] |= bitmask;
+}
+
+/* Marks the block as 'unused' */
+ALWAYS_INLINE void
+physical_mm_set_usable(const uint32_t bit,
+ uint32_t *total_free_blocks,
+ uint32_t *memory_map)
+{
+ uint32_t memory_map_index = bit / BITMAP_ENTRY_SIZE;
+ uint32_t bitmask = 1 << (bit % BITMAP_ENTRY_SIZE);
+ (*total_free_blocks)++;
+ memory_map[memory_map_index] &= ~bitmask;
+}
+
+/* Returns:
+ * True if the bit is set (block is in use)
+ * False if the bit is unset (block isn't in use)
+ */
+ALWAYS_INLINE bool
+physical_mm_test_bit(const uint32_t bit, uint32_t *memory_map)
+{
+ uint32_t memory_map_index = bit / BITMAP_ENTRY_SIZE;
+ uint32_t bitmask = 1 << (bit % BITMAP_ENTRY_SIZE);
+ return memory_map[memory_map_index] & bitmask;
+}