diff options
author | Raghuram Subramani <raghus2247@gmail.com> | 2025-01-05 08:06:19 -0500 |
---|---|---|
committer | Raghuram Subramani <raghus2247@gmail.com> | 2025-01-05 08:06:19 -0500 |
commit | b09f4787e01122bdb08660bac8a24549e6bd6f37 (patch) | |
tree | fb3b8c621df7a2fa9b309eeae43702f863ff55e8 | |
parent | 75609c32bc1eabefd878563df7a2e088c8c2976c (diff) |
kernel: mm: Store free regions in a struct
-rw-r--r-- | kernel/include/mm/memory_map.h | 11 | ||||
-rw-r--r-- | kernel/kernel/kernel.c | 7 | ||||
-rw-r--r-- | kernel/mm/memory_map.c | 15 |
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; +} |