]> Projects (at) Tadryanom (dot) Me - AdrOS.git/commitdiff
fix: kconsole fallback not activating when initrd is missing
authorTulio A M Mendes <[email protected]>
Fri, 13 Feb 2026 06:18:24 +0000 (03:18 -0300)
committerTulio A M Mendes <[email protected]>
Fri, 13 Feb 2026 06:18:24 +0000 (03:18 -0300)
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
src/kernel/main.c

index 04954f44ba54460100a0693b7506af65f4e3fb28..0c7bcc3c418a8e581d10c2ca350d394f1de2598d 100644 (file)
@@ -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")) {
index 83bb740c80b451c9ed3a1dfcce07dfd9d32037b9..94ddf11aa30cce5e701d2ddb39badb4c359e1803 100644 (file)
@@ -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();
     }