From c4bdf020f479a97c9b5055ceeee52e8a67d43917 Mon Sep 17 00:00:00 2001 From: Matheus Date: Wed, 26 Jul 2023 00:17:04 -0300 Subject: [PATCH] kernel: mount root using commandline arguments --- kernel-src/arch/x86-64/main.c | 34 +++++++++++++++++++++++----------- kernel-src/fs/ext2.c | 2 -- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/kernel-src/arch/x86-64/main.c b/kernel-src/arch/x86-64/main.c index 409066cd..b8f6d9d0 100644 --- a/kernel-src/arch/x86-64/main.c +++ b/kernel-src/arch/x86-64/main.c @@ -29,6 +29,7 @@ #include #include #include +#include static cpu_t bsp_cpu; @@ -45,6 +46,7 @@ void kernel_entry() { arch_mmu_init(); vmm_init(); alloc_init(); + cmdline_parse(); arch_acpi_init(); arch_apic_init(); cpu_initstate(); @@ -58,16 +60,6 @@ void kernel_entry() { devfs_init(); pipefs_init(); ext2_init(); - printf("mounting tmpfs on /\n"); - __assert(vfs_mount(NULL, vfsroot, "/", "tmpfs", NULL) == 0); - initrd_unpack(); - - vattr_t attr = {0}; - attr.mode = 0644; - __assert(vfs_create(vfsroot, "/dev", &attr, V_TYPE_DIR, NULL) == 0); - - printf("mounting devfs on /dev\n"); - __assert(vfs_mount(NULL, vfsroot, "/dev", "devfs", NULL) == 0); block_init(); pseudodevices_init(); @@ -76,10 +68,30 @@ void kernel_entry() { arch_ps2_init(); fb_init(); nvme_init(); - console_init(); logging_sethook(console_putc); + char *root = cmdline_get("root"); + char *rootfs = cmdline_get("rootfs"); + + printf("mounting %s (%s) on /\n", root == NULL ? "none" : root, rootfs); + + vnode_t *backing; + if (root) { + __assert(devfs_getbyname(root, &backing) == 0); + } else { + backing = NULL; + } + + __assert(vfs_mount(backing, vfsroot, "/", rootfs, NULL) == 0); + + if (backing) { + VOP_RELEASE(backing); + } + + if (cmdline_get("initrd")) + initrd_unpack(); + sched_runinit(); sched_threadexit(); } diff --git a/kernel-src/fs/ext2.c b/kernel-src/fs/ext2.c index 0260346e..7813f970 100644 --- a/kernel-src/fs/ext2.c +++ b/kernel-src/fs/ext2.c @@ -1679,8 +1679,6 @@ static int ext2_mount(vfs_t **vfs, vnode_t *mountpoint, vnode_t *backing, void * *vfs = &fs->vfs; err = 0; - ASSERT_UNCLEAN(fs, fs->blocksize == 123546667); - cleanup: if (err) free(fs);