summaryrefslogtreecommitdiffstats
path: root/boot
diff options
context:
space:
mode:
Diffstat (limited to 'boot')
-rw-r--r--boot/limine/memorymap.c41
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);
}