X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/47c4e0c19ae8526b14ce4e0d7b243f7a4dc6fafd..bffa3430fbbaaad29bec0b5bee9c1f0bfc7fd068:/lunaix-os/kernel/kinit.c diff --git a/lunaix-os/kernel/kinit.c b/lunaix-os/kernel/kinit.c index 24550cf..a084183 100644 --- a/lunaix-os/kernel/kinit.c +++ b/lunaix-os/kernel/kinit.c @@ -3,22 +3,23 @@ #include #include #include -#include #include #include -#include #include +#include #include #include #include #include #include #include -#include #include #include +#include +#include #include +#include #include #include @@ -26,11 +27,93 @@ #include #include -void -spawn_lunad(); +LOG_MODULE("kinit") -void -kmem_init(struct boot_handoff* bhctx); +extern void +lunad_main(); + +/** + * @brief 创建并运行Lunaix守护进程 + * + */ +static void +spawn_lunad() +{ + int has_error; + struct thread* kthread; + + has_error = spawn_process(&kthread, (ptr_t)lunad_main, false); + assert_msg(!has_error, "failed to spawn lunad"); + + run(kthread); + + fail("Unexpected Return"); +} + +static void +kmem_init(struct boot_handoff* bhctx) +{ + pte_t* ptep = mkptep_va(VMS_SELF, KERNEL_RESIDENT); + + ptep = mkl0tep(ptep); + + unsigned int i = ptep_vfn(ptep); + do { + if (l0tep_implie_vmnts(ptep)) { + ptep++; + continue; + } + +#if LnT_ENABLED(1) + assert(mkl1t(ptep++, 0, KERNEL_PGTAB)); +#elif LnT_ENABLED(2) + assert(mkl2t(ptep++, 0, KERNEL_PGTAB)); +#elif LnT_ENABLED(3) + assert(mkl3t(ptep++, 0, KERNEL_PGTAB)); +#else + assert(mklft(ptep++, 0, KERNEL_PGTAB)); +#endif + } while (++i < MAX_PTEN); + + // allocators + cake_init(); + valloc_init(); +} + +static void +__remap_and_load_dtb(struct boot_handoff* bhctx) +{ +#ifdef CONFIG_USE_DEVICETREE + ptr_t dtb = bhctx->kexec.dtb_pa; + + if (!dtb) { + return; + } + + if (va_offset(dtb)) { + WARN("bad-aligned dtb location, expect page aligned"); + return; + } + + pte_t *ptep, pte; + size_t nr_pages; + bool loaded; + + pte = mkpte(dtb, KERNEL_DATA); + ptep = mkptep_va(VMS_SELF, dtb_start); + nr_pages = leaf_count(CONFIG_DTB_MAXSIZE); + + pmm_onhold_range(dtb, nr_pages); + vmm_set_ptes_contig(ptep, pte, PAGE_SIZE, nr_pages); + + loaded = dt_load(dtb_start); + if (!loaded) { + ERROR("dtb load failed"); + } +#endif + + return; +} void kernel_bootstrap(struct boot_handoff* bhctx) @@ -46,6 +129,8 @@ kernel_bootstrap(struct boot_handoff* bhctx) /* Setup kernel memory layout and services */ kmem_init(bhctx); + __remap_and_load_dtb(bhctx); + boot_parse_cmdline(bhctx); /* Prepare stack trace environment */ @@ -81,8 +166,6 @@ kernel_bootstrap(struct boot_handoff* bhctx) invoke_init_function(on_boot); - must_success(vfs_unmount("/dev")); - /* Finish up bootstrapping sequence, we are ready to spawn the root process * and start geting into uspace */ @@ -91,53 +174,3 @@ kernel_bootstrap(struct boot_handoff* bhctx) spawn_lunad(); } -extern void -lunad_main(); - -/** - * @brief 创建并运行Lunaix守护进程 - * - */ -void -spawn_lunad() -{ - int has_error; - struct thread* kthread; - - has_error = spawn_process(&kthread, (ptr_t)lunad_main, false); - assert_msg(!has_error, "failed to spawn lunad"); - - run(kthread); - - fail("Unexpected Return"); -} - -void -kmem_init(struct boot_handoff* bhctx) -{ - pte_t* ptep = mkptep_va(VMS_SELF, KERNEL_RESIDENT); - - ptep = mkl0tep(ptep); - - unsigned int i = ptep_vfn(ptep); - do { - if (l0tep_impile_vmnts(ptep)) { - ptep++; - continue; - } - -#if LnT_ENABLED(1) - assert(mkl1t(ptep++, 0, KERNEL_DATA)); -#elif LnT_ENABLED(2) - assert(mkl2t(ptep++, 0, KERNEL_DATA)); -#elif LnT_ENABLED(3) - assert(mkl3t(ptep++, 0, KERNEL_DATA)); -#else - assert(mklft(ptep++, 0, KERNEL_DATA)); -#endif - } while (++i < MAX_PTEN); - - // allocators - cake_init(); - valloc_init(); -}