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
}
}
+ 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")) {
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();
}