49 lines
1.2 KiB
C
49 lines
1.2 KiB
C
#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,
|
|
};
|
|
} |