#include "mmap.h" #include "../panic.h" #define USABLE_REGION_SIZE 32 static memory_region_t usable_regions[USABLE_REGION_SIZE]; static size_t num_regions = 0; void map_memory(multiboot_info_t* info) { if (!(info->flags & (1 << 6))) { panic("Invalid memory map given by bootloader\n"); } uint64_t offset = 0; while (offset < info->mmap_length) { multiboot_memory_map_t* mmmt = (multiboot_memory_map_t*)(info->mmap_addr + offset); if (mmmt->type == MULTIBOOT_MEMORY_AVAILABLE) { if (num_regions < USABLE_REGION_SIZE) { usable_regions[num_regions] = (memory_region_t){ .base_address = mmmt->addr, .length = mmmt->len, }; num_regions++; } else { printf("System has more memory than the memory map can hold\n"); break; } } offset += mmmt->size + sizeof(mmmt->size); } } memory_map_t get_memory_map() { return (memory_map_t){ .num_regions = num_regions, .regions = usable_regions, }; }