#include <lunaix/block.h>
#include <lunaix/boot_generic.h>
#include <lunaix/device.h>
-#include <lunaix/foptions.h>
-#include <lunaix/fs/twifs.h>
#include <lunaix/input.h>
+
#include <lunaix/mm/cake.h>
-#include <lunaix/mm/mmio.h>
#include <lunaix/mm/pmm.h>
+#include <lunaix/mm/page.h>
#include <lunaix/mm/valloc.h>
#include <lunaix/mm/vmm.h>
+
#include <lunaix/process.h>
#include <lunaix/sched.h>
#include <lunaix/spike.h>
#include <lunaix/trace.h>
-#include <lunaix/tty/tty.h>
#include <lunaix/owloysius.h>
-#include <lunaix/pcontext.h>
+#include <lunaix/hart_state.h>
+#include <lunaix/syslog.h>
+#include <lunaix/sections.h>
-#include <hal/acpi/acpi.h>
-#include <hal/intc.h>
+#include <hal/devtree.h>
-#include <sys/abi.h>
-#include <sys/mm/mm_defs.h>
+#include <asm/mm_defs.h>
-#include <klibc/strfmt.h>
-#include <klibc/string.h>
+LOG_MODULE("kinit")
-void
-spawn_lunad();
+extern void
+lunad_main();
-void
-kmem_init(struct boot_handoff* bhctx);
+/**
+ * @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 (lntep_implie_vmnts(ptep, L0T_SIZE)) {
+ 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)
{
- pmm_init(bhctx->mem.size);
- vmm_init();
+ pmm_init(bhctx);
+ // now we can start reserving physical space
/* Begin kernel bootstrapping sequence */
boot_begin(bhctx);
/* Setup kernel memory layout and services */
kmem_init(bhctx);
+ __remap_and_load_dtb(bhctx);
+
boot_parse_cmdline(bhctx);
/* Prepare stack trace environment */
device_scan_drivers();
- invoke_init_function(on_earlyboot);
-
- // FIXME this goes to hal/gfxa
- tty_init(ioremap(0xB8000, PAGE_SIZE));
- tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_BLACK);
-
device_sysconf_load();
- /* Get intc online, this is the cornerstone when initing devices */
- intc_init();
+ invoke_init_function(on_earlyboot);
clock_init();
timer_init();
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
*/
boot_end(bhctx);
- boot_cleanup();
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)
-{
- extern u8_t __kexec_end;
- // 将内核占据的页,包括前1MB,hhk_init 设为已占用
- size_t pg_count = leaf_count((ptr_t)&__kexec_end - KERNEL_RESIDENT);
- pmm_mark_chunk_occupied(0, pg_count, PP_FGLOCKED);
-
- pte_t* ptep = mkptep_va(VMS_SELF, KERNEL_RESIDENT);
- ptep = mkl0tep(ptep);
-
- do {
-#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 (ptep_vfn(ptep) < MAX_PTEN - 2);
-
- // allocators
- cake_init();
- valloc_init();
-}