aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaghuram Subramani <raghus2247@gmail.com>2025-01-05 08:06:19 -0500
committerRaghuram Subramani <raghus2247@gmail.com>2025-01-05 08:06:19 -0500
commitb09f4787e01122bdb08660bac8a24549e6bd6f37 (patch)
treefb3b8c621df7a2fa9b309eeae43702f863ff55e8
parent75609c32bc1eabefd878563df7a2e088c8c2976c (diff)
kernel: mm: Store free regions in a struct
-rw-r--r--kernel/include/mm/memory_map.h11
-rw-r--r--kernel/kernel/kernel.c7
-rw-r--r--kernel/mm/memory_map.c15
3 files changed, 32 insertions, 1 deletions
diff --git a/kernel/include/mm/memory_map.h b/kernel/include/mm/memory_map.h
index a02daa6..cf798b5 100644
--- a/kernel/include/mm/memory_map.h
+++ b/kernel/include/mm/memory_map.h
@@ -19,8 +19,19 @@
#ifndef __mm_memory_map_h
#define __mm_memory_map_h
+#include <stdint.h>
+
#include <mm/multiboot.h>
+/* TODO: Practically, do we need more than 32? */
+#define MAX_FREE_REGIONS 32
+
+typedef struct {
+ uint8_t n_regions;
+ multiboot_memory_map_t *region_list[MAX_FREE_REGIONS];
+} free_memory_regions_t;
+
void memory_map_load(multiboot_info_t *);
+free_memory_regions_t *memory_map_get_free_regions(void);
#endif
diff --git a/kernel/kernel/kernel.c b/kernel/kernel/kernel.c
index 8d19b3b..c999a1e 100644
--- a/kernel/kernel/kernel.c
+++ b/kernel/kernel/kernel.c
@@ -45,6 +45,13 @@ kernel_main(uint32_t magic, multiboot_info_t *multiboot_info)
printk("Kernel", "Started.");
+ free_memory_regions_t *free_memory_regions = memory_map_get_free_regions();
+ for (int i = 0; i < free_memory_regions->n_regions; i++)
+ printk("Kernel",
+ "start: 0x%.08x | length: 0x%.08x",
+ free_memory_regions->region_list[i]->addr_low,
+ free_memory_regions->region_list[i]->len_low);
+
exit();
halt(); /* If exit() fails (on real hardware) */
}
diff --git a/kernel/mm/memory_map.c b/kernel/mm/memory_map.c
index 2a8f47b..448cb29 100644
--- a/kernel/mm/memory_map.c
+++ b/kernel/mm/memory_map.c
@@ -23,8 +23,11 @@
#include <kernel/halt.h>
#include <libk/stdio.h>
+#include <mm/memory_map.h>
#include <mm/multiboot.h>
+free_memory_regions_t free_memory_regions = { 0 };
+
ALWAYS_INLINE static char *
memory_map_fetch_type(multiboot_memory_map_t *mmap)
{
@@ -72,8 +75,12 @@ memory_map_load(multiboot_info_t *multiboot_info)
= (multiboot_memory_map_t *) (multiboot_info->mmap_addr + i);
total_mem += mmap->len_low;
- if (mmap->type == MULTIBOOT_MEMORY_AVAILABLE)
+ if (mmap->type == MULTIBOOT_MEMORY_AVAILABLE) {
+ free_memory_regions.region_list[free_memory_regions.n_regions] = mmap;
+ free_memory_regions.n_regions++;
+
total_available_mem += mmap->len_low;
+ }
printk("mm",
"start: 0x%.08x | length: 0x%.08x | type: %s",
@@ -85,3 +92,9 @@ memory_map_load(multiboot_info_t *multiboot_info)
printk("mm", "Total Memory: %lu MiB", total_mem / MiB);
printk("mm", "Total Available Memory: %lu MiB", total_available_mem / MiB);
}
+
+free_memory_regions_t *
+memory_map_get_free_regions(void)
+{
+ return &free_memory_regions;
+}