X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/df61e9d0fec3d5e75820e27e7a2459d132364585..8c6f505faaa66e18cdca108dca549d4ad806a077:/lunaix-os/kernel/mm/vmap.c diff --git a/lunaix-os/kernel/mm/vmap.c b/lunaix-os/kernel/mm/vmap.c index 5df524d..285debc 100644 --- a/lunaix-os/kernel/mm/vmap.c +++ b/lunaix-os/kernel/mm/vmap.c @@ -3,7 +3,7 @@ #include #define VMAP_START PG_MOUNT_BASE + MEM_4MB -#define VMAP_END PD_REFERENCED +#define VMAP_END VMS_SELF static uintptr_t start = VMAP_START; @@ -26,18 +26,18 @@ vmm_vmap(uintptr_t paddr, size_t size, pt_attr attr) current_addr = (current_addr & 0xffc00000) + MEM_4MB; } else { x86_page_table* ptd = (x86_page_table*)(L2_VADDR(l1inx)); - size_t i = L2_INDEX(current_addr); - for (; i < 1024 && examed_size < size; i++) { + size_t i = L2_INDEX(current_addr), j = 0; + for (; i < PG_MAX_ENTRIES && examed_size < size; i++, j++) { if (!ptd->entry[i]) { examed_size += PG_SIZE; } else if (examed_size) { // found a discontinuity, start from beginning examed_size = 0; - i++; + j++; break; } } - current_addr += i << 12; + current_addr += j << 12; } if (examed_size >= size) { @@ -46,16 +46,17 @@ vmm_vmap(uintptr_t paddr, size_t size, pt_attr attr) if (current_addr >= VMAP_END) { wrapped = 1; + examed_size = 0; current_addr = VMAP_START; } } - panick("vmm: out of memory"); + + return NULL; done: uintptr_t alloc_begin = current_addr - examed_size; for (size_t i = 0; i < size; i += PG_SIZE) { - vmm_set_mapping( - PD_REFERENCED, alloc_begin + i, paddr + i, PG_PREM_RW, 0); + vmm_set_mapping(VMS_SELF, alloc_begin + i, paddr + i, PG_PREM_RW, 0); pmm_ref_page(KERNEL_PID, paddr + i); } start = alloc_begin + size;