Merge branch 'master' into prog-loader
[lunaix-os.git] / lunaix-os / kernel / mm / vmap.c
index 0c1061009c2e66cb410991972165eaef46433967..285debce407359fbd5ef14654fab724e5a4d96fe 100644 (file)
@@ -3,12 +3,12 @@
 #include <lunaix/spike.h>
 
 #define VMAP_START PG_MOUNT_BASE + MEM_4MB
 #include <lunaix/spike.h>
 
 #define VMAP_START PG_MOUNT_BASE + MEM_4MB
-#define VMAP_END PD_REFERENCED
+#define VMAP_END VMS_SELF
 
 static uintptr_t start = VMAP_START;
 
 void*
 
 static uintptr_t start = VMAP_START;
 
 void*
-vmm_vmap(uintptr_t paddr, size_t size, pt_attr attr, pp_attr_t pattr)
+vmm_vmap(uintptr_t paddr, size_t size, pt_attr attr)
 {
     // next fit
     assert_msg((paddr & 0xfff) == 0, "vmap: bad alignment");
 {
     // next fit
     assert_msg((paddr & 0xfff) == 0, "vmap: bad alignment");
@@ -26,18 +26,18 @@ vmm_vmap(uintptr_t paddr, size_t size, pt_attr attr, pp_attr_t pattr)
             current_addr = (current_addr & 0xffc00000) + MEM_4MB;
         } else {
             x86_page_table* ptd = (x86_page_table*)(L2_VADDR(l1inx));
             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;
                 if (!ptd->entry[i]) {
                     examed_size += PG_SIZE;
                 } else if (examed_size) {
                     // found a discontinuity, start from beginning
                     examed_size = 0;
-                    i++;
+                    j++;
                     break;
                 }
             }
                     break;
                 }
             }
-            current_addr += i << 12;
+            current_addr += j << 12;
         }
 
         if (examed_size >= size) {
         }
 
         if (examed_size >= size) {
@@ -46,16 +46,17 @@ vmm_vmap(uintptr_t paddr, size_t size, pt_attr attr, pp_attr_t pattr)
 
         if (current_addr >= VMAP_END) {
             wrapped = 1;
 
         if (current_addr >= VMAP_END) {
             wrapped = 1;
+            examed_size = 0;
             current_addr = VMAP_START;
         }
     }
             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) {
 
 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;
         pmm_ref_page(KERNEL_PID, paddr + i);
     }
     start = alloc_begin + size;