add kernel highmem remap for aarch64 and some clean-ups
authorLunaixsky <lunaixsky@qq.com>
Tue, 1 Oct 2024 22:13:31 +0000 (23:13 +0100)
committerLunaixsky <lunaixsky@qq.com>
Tue, 1 Oct 2024 22:13:31 +0000 (23:13 +0100)
lunaix-os/arch/aarch64/boot/init.h
lunaix-os/arch/aarch64/boot/kremap.c
lunaix-os/arch/aarch64/boot/mem.c [deleted file]
lunaix-os/arch/aarch64/boot/start.S
lunaix-os/arch/aarch64/includes/asm/boot_stage.h [new file with mode: 0644]

index 4593759c57278c4c6db795e9b40deb39c20a4992..53577792d6ec5c76112adebdbaa218249f1971d0 100644 (file)
@@ -3,10 +3,7 @@
 
 #include <lunaix/types.h>
 #include <sys-generic/bootmem.h>
-
-#define boot_text __attribute__((section(".boot.text")))
-#define boot_data __attribute__((section(".boot.data")))
-#define boot_bss  __attribute__((section(".boot.bss")))
+#include <asm/boot_stage.h>
 
 ptr_t
 kremap();
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a230ece8afba00051b7001d0d49faa677c5c3405 100644 (file)
@@ -0,0 +1,35 @@
+#include <lunaix/sections.h>
+#include <asm-generic/init_pagetable.h>
+#include <asm/boot_stage.h>
+
+#include "init.h"
+
+static pte_t kpt[LEVEL_SIZE][32];
+
+ptr_t
+kremap()
+{
+    struct pt_alloc alloc;
+    struct ptw_state ptw;
+    pte_t pte;
+    unsigned long nr;
+
+    init_pt_alloc(&alloc, to_kphysical(&kpt), sizeof(kpt));
+    init_ptw_state(&ptw, &alloc, kpt_alloc_table(&alloc));
+
+    pte = mkpte(boot_start, KERNEL_DATA);
+    pte = pte_mkexec(pte);
+    nr  = leaf_count(boot_end - boot_start);
+    kpt_set_ptes(&ptw, boot_start, pte, LFT_SIZE, nr);
+
+    kpt_mktable_at(&ptw, VMAP, L0T_SIZE);
+    kpt_mktable_at(&ptw, PMAP, L2T_SIZE);
+    kpt_mktable_at(&ptw, KMAP, LFT_SIZE);
+
+    kpt_migrate_highmem(&ptw);
+
+    pte = mkpte(__ptr(ptw.root), KERNEL_PGTAB);
+    kpt_set_ptes(&ptw, VMS_SELF, pte, L0T_SIZE, 1);
+
+    return __ptr(ptw.root);
+}
\ No newline at end of file
diff --git a/lunaix-os/arch/aarch64/boot/mem.c b/lunaix-os/arch/aarch64/boot/mem.c
deleted file mode 100644 (file)
index 1803e2a..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#include "init.h"
-#include <lunaix/sections.h>
-#include <lunaix/spike.h>
-
-#define BOOTMEM_SIZE   (4 * 4096)
-
-static reclaimable char bootmem_pool[BOOTMEM_SIZE];
-static unsigned int pos;
-
-void*
-bootmem_alloc(unsigned int size)
-{
-    ptr_t res;
-
-    res = __ptr(bootmem_pool) + pos;
-    
-    size = ROUNDUP(size, 4);
-    pos += size;
-
-    if (pos >= BOOTMEM_SIZE) {
-        spin();
-    }
-
-    return (void*)res;
-}
-
-void
-bootmem_free(void* ptr)
-{
-    // not need to support, as they are all one-shot
-    return;
-}
\ No newline at end of file
index ed11af997b6fe26d50b45dd93ff9ea9572e82593..f2aa88a11335e76da587fda4ddcdc99cb9db1dad 100644 (file)
@@ -19,8 +19,8 @@
         mov fp, xzr
 
         ldr x4, =aarch64_init
-        blx x4
+        bl x4
          
         // x0: ptr to boot_handoff
         ldr x4, =kernel_bootstrap
-        blx x4
\ No newline at end of file
+        bl x4
\ No newline at end of file
diff --git a/lunaix-os/arch/aarch64/includes/asm/boot_stage.h b/lunaix-os/arch/aarch64/includes/asm/boot_stage.h
new file mode 100644 (file)
index 0000000..46bcec2
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __LUNAIX_ARCH_BOOT_STAGE_H
+#define __LUNAIX_ARCH_BOOT_STAGE_H
+
+#include <asm-generic/boot_stage.h>
+
+#endif /* __LUNAIX_BOOT_STAGE_H */