From e1ed128bca2d1021872934d4e6bc363ea27b3a7b Mon Sep 17 00:00:00 2001 From: Tulio A M Mendes Date: Fri, 13 Feb 2026 03:18:24 -0300 Subject: [PATCH] fix: kconsole fallback not activating when initrd is missing MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Root cause: init_start() always called arch_platform_start_userspace() even when fs_root was NULL. The userspace init thread was created asynchronously and returned 0 (success) to kernel_main(), so the 'init_ret < 0' check never triggered kconsole_enter(). The init thread would later discover fs_root==NULL, print '[ELF] fs_root missing' and hang — but kconsole was never entered. Fix: init_start() now checks fs_root before attempting to start userspace. If no root filesystem exists (e.g. missing initrd module in GRUB), it returns -1 immediately, triggering the kconsole emergency console fallback in kernel_main(). Also added clear panic message before kconsole entry (similar to Linux's 'Kernel panic - not syncing: VFS: Unable to mount root fs'). Tested: boot without initrd module now shows: [INIT] No root filesystem — cannot start userspace. [PANIC] Userspace init failed — dropping to emergency console. *** AdrOS Kernel Console (kconsole) *** kconsole> Normal boot: 19/19 smoke pass, cppcheck clean --- src/kernel/init.c | 5 +++++ src/kernel/main.c | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/kernel/init.c b/src/kernel/init.c index 04954f4..0c7bcc3 100644 --- a/src/kernel/init.c +++ b/src/kernel/init.c @@ -122,6 +122,11 @@ int init_start(const struct boot_info* bi) { } } + if (!fs_root) { + kprintf("[INIT] No root filesystem — cannot start userspace.\n"); + return -1; + } + int user_ret = arch_platform_start_userspace(bi); if (bi && cmdline_has_token(bi->cmdline, "ring3")) { diff --git a/src/kernel/main.c b/src/kernel/main.c index 83bb740..94ddf11 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -82,7 +82,8 @@ void kernel_main(const struct boot_info* bi) { int init_ret = init_start(bi); if (init_ret < 0) { - // VFS/init failed — enter kernel emergency console + kprintf("\n[PANIC] Userspace init failed — dropping to emergency console.\n"); + kprintf(" (type 'help' for commands, 'reboot' to restart)\n\n"); kconsole_enter(); } -- 2.43.0