diff options
Diffstat (limited to 'boot/limine/memorymap.c')
| -rw-r--r-- | boot/limine/memorymap.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/boot/limine/memorymap.c b/boot/limine/memorymap.c index 25dcc61..a8841e2 100644 --- a/boot/limine/memorymap.c +++ b/boot/limine/memorymap.c @@ -49,13 +49,17 @@ mem_setup_untyped(void) uintptr_t highest_phys = 0; for(size_t i = 0; i < _limine_memmap_resp->entry_count; i++) { struct limine_memmap_entry *entry = _limine_memmap_resp->entries[i]; - kprintf("Limine: %p : %p %s\n", entry->base, entry->length, limine_mmap_entry_type_str[entry->type]); if(entry->type == LIMINE_MEMMAP_USABLE || entry->type == LIMINE_MEMMAP_ACPI_RECLAIMABLE || entry->type == LIMINE_MEMMAP_BOOTLOADER_RECLAIMABLE) { - + if(untyped_i > JOVE_OBJDIR_ENTRIES){ + kprintf("%s: Provided memory map exceeds kernel limits. Some memory may not be accessable.", __func__); + break; + } + + klogf("%p : %p %s\n", entry->base, entry->length, limine_mmap_entry_type_str[entry->type]); if(entry->base == 0) continue; if(entry->base + entry->length > highest_phys) highest_phys = entry->base + entry->length; @@ -68,27 +72,30 @@ mem_setup_untyped(void) untyped_data->limit = entry->length; obj_release(untyped_obj); } - - if(untyped_i > MEMMAP_MAX_ENTRIES){ - kprintf("!!!Provided memory map exceeds kernel limits. Some memory may not be accessable!!!"); - break; - } } if(entry->type == LIMINE_MEMMAP_RESERVED | entry->type == LIMINE_MEMMAP_ACPI_NVS | entry->type == LIMINE_MEMMAP_ACPI_TABLES) { - size_t hw_pages = entry->length >> 12; - if(hw_pages > 4095) { - klogf("HW memory page is too big!\n", ""); + intmax_t hw_pages = entry->length >> 12; + uintptr_t base = entry->base; + while(hw_pages > 0) { + if(hwmem_i >= JOVE_OBJDIR_ENTRIES) { + kprintf("%s: Reserved memory region exceeds indexing limits!\n", __func__); + break; + } + + size_t pages = hw_pages > 4095 ? 4095 : hw_pages; + klogf("%p : %p RESERVED\n", base, ((pages + 1) << 12)); + + jove_owned_obj_t *hwmem_obj = obj_take(&s_hwmemory_objdir.entries[hwmem_i++]); + obj_settype(hwmem_obj, JOVE_OBJ_SHMEMORY); + obj_setvalue(hwmem_obj, entry->base | (entry->length >> 12)); + + obj_release(hwmem_obj); + hw_pages -= 4096; + base += (4096ULL << 12); } - - jove_owned_obj_t *hwmem_obj = obj_take(&s_hwmemory_objdir.entries[hwmem_i++]); - obj_settype(hwmem_obj, JOVE_OBJ_HWMEMORY); - obj_setvalue(hwmem_obj, entry->base | (entry->length >> 12)); - - obj_release(hwmem_obj); } } - kprintf("Highest physical address: %p\n", highest_phys); } |
