physical page list mapping isa/arm64
authorLunaixsky <lunaixsky@qq.com>
Sun, 26 Jan 2025 03:18:11 +0000 (03:18 +0000)
committerLunaixsky <lunaixsky@qq.com>
Sun, 26 Jan 2025 03:18:11 +0000 (03:18 +0000)
lunaix-os/arch/aarch64/vmutils.c
lunaix-os/includes/lunaix/sections.h
lunaix-os/kernel/boot_helper.c

index aef8c4cd5cc29810e3f9829db9be8f066889cdbd..405a32b05fb0ad8f754b35a10b88d0a6610ca3c6 100644 (file)
@@ -1,18 +1,19 @@
 #include <lunaix/mm/pagetable.h>
 #include <lunaix/mm/page.h>
 #include <lunaix/mm/pagetable.h>
 #include <lunaix/mm/page.h>
+#include <lunaix/sections.h>
 
 
-struct leaflet*
-dup_leaflet(struct leafletleaflet)
+struct leaflet *
+dup_leaflet(struct leaflet *leaflet)
 {
     ptr_t dest_va, src_va;
 {
     ptr_t dest_va, src_va;
-    struct leafletnew_leaflet;
-    
+    struct leaflet *new_leaflet;
+
     new_leaflet = alloc_leaflet(leaflet_order(leaflet));
 
     src_va = leaflet_mount(leaflet);
     dest_va = vmap(new_leaflet, KERNEL_DATA);
 
     new_leaflet = alloc_leaflet(leaflet_order(leaflet));
 
     src_va = leaflet_mount(leaflet);
     dest_va = vmap(new_leaflet, KERNEL_DATA);
 
-    memcpy((void*)dest_va, (void*)src_va, PAGE_SIZE);
+    memcpy((void *)dest_va, (void *)src_va, PAGE_SIZE);
 
     leaflet_unmount(leaflet);
     vunmap(dest_va, new_leaflet);
 
     leaflet_unmount(leaflet);
     vunmap(dest_va, new_leaflet);
@@ -20,14 +21,51 @@ dup_leaflet(struct leaflet* leaflet)
     return new_leaflet;
 }
 
     return new_leaflet;
 }
 
-ptr_t
-pmm_arch_init_remap(struct pmem* memory, struct boot_handoff* bctx)
+static inline struct ppage*
+__setup_pmem_map(ptr_t start, size_t plist_size)
 {
 {
-    unsigned long plist_len;
+    pte_t pte, *ptep;
+    unsigned int nr_pages;
+
+    pte = mkpte(start, KERNEL_DATA);
+    ptep = mkl2tep_va(VMS_SELF, PMAP);
+    nr_pages = page_count(plist_size, L2T_SIZE);
+
+    vmm_set_ptes_contig(ptep, pte, L2T_SIZE, nr_pages);
 
 
-    plist_len = leaf_count(bctx->mem.size) * sizeof(struct ppage);
+    return (struct ppage*)PMAP;
+}
+
+ptr_t 
+pmm_arch_init_remap(struct pmem *memory, struct boot_handoff *bctx)
+{
+    unsigned long plist_len, plist_size, nr_huges;
+    struct boot_mmapent *ment;
 
 
-    for (int i = 0; i < bctx->mem.mmap_len; i++) {
-        
+    plist_len = leaf_count(bctx->mem.size);
+    plist_size = plist_len * sizeof(struct ppage);
+    nr_huges = page_count(plist_size, lnt_page_size(2));
+
+    ptr_t pkernel_end = to_kphysical(kernel_end);
+    pkernel_end = napot_upaligned(pkernel_end, L2T_SIZE);
+    pkernel_end += plist_size;
+
+    for (int i = 0; i < bctx->mem.mmap_len; i++)
+    {
+        ment = &bctx->mem.mmap[i];
+        if (ment->type != BOOT_MMAP_FREE) {
+            continue;
+        }
+
+        if (pkernel_end >= ment->start + ment->size) {
+            continue;
+        }
+
+        memory->pplist = __setup_pmem_map(pkernel_end, plist_size);;
+        memory->list_len = plist_len;
+        return pkernel_end;
     }
     }
+
+    fail("no_mem, unable to map plist");
+    return NULL;
 }
 }
index 9290178bd66ee8b69a419c516b27d6d98d6e09ec..72f5855e932367059cc05fbb532364f8a1c3ec37 100644 (file)
@@ -31,7 +31,8 @@
 #define bootsec_end         __section_mark(kboot, end)
 
 #define kernel_start        __section_mark(kexec, start)
 #define bootsec_end         __section_mark(kboot, end)
 
 #define kernel_start        __section_mark(kexec, start)
-#define kernel_load_end     __section_mark(kexec, end)
+#define kernel_load_start   __section_mark(kload, start)
+#define kernel_load_end     __section_mark(kload, end)
 #define kernel_end          __section_mark(kimg, end)
 
 #ifdef CONFIG_USE_DEVICETREE
 #define kernel_end          __section_mark(kimg, end)
 
 #ifdef CONFIG_USE_DEVICETREE
index 37e6bb4775ce991c1522c7e59d54a6ecae1f8e1c..99977bcf8ce386f500c20bf999deeb9e2a743fd7 100644 (file)
@@ -20,7 +20,7 @@ boot_begin(struct boot_handoff* bhctx)
     boot_begin_arch_reserve(bhctx);
     
     // 将内核占据的页,包括前1MB,hhk_init 设为已占用
     boot_begin_arch_reserve(bhctx);
     
     // 将内核占据的页,包括前1MB,hhk_init 设为已占用
-    size_t pg_count = leaf_count(to_kphysical(kernel_load_end));
+    size_t pg_count = leaf_count(to_kphysical(kernel_end));
     pmm_onhold_range(0, pg_count);
 
     size_t i;
     pmm_onhold_range(0, pg_count);
 
     size_t i;