bootm: Pass SMP core ID and DTB address for ELF-formatted kernels
author牛 志宏 <Zone.Niuzh@hotmail.com>
Fri, 13 Jun 2025 01:45:28 +0000 (01:45 +0000)
committerTom Rini <trini@konsulko.com>
Thu, 26 Jun 2025 19:48:04 +0000 (13:48 -0600)
When booting RISC-V ELF-formatted kernel images (IH_TYPE_KERNEL + IH_OS_ELF),
explicitly pass SMP hart ID (via a0/argc) and DTB address (via a1/argv)
to comply with modern SMP-enabled kernels' boot protocol requirements.
See https://www.kernel.org/doc/html/latest/arch/riscv/boot.html#register-state

Signed-off-by: Zone.N <zone.niuzh@hotmail.com>
boot/bootm_os.c

index a3c7cb5..88f7c18 100644 (file)
@@ -402,6 +402,17 @@ static int do_bootm_elf(int flag, struct bootm_info *bmi)
        if (flag != BOOTM_STATE_OS_GO)
                return 0;
 
+       /*
+        * Required per RISC-V boot protocol:
+        * a0(argc) = hartid of the current core
+        * a1(argv) = address of the devicetree in memory
+        * https://www.kernel.org/doc/html/latest/arch/riscv/boot.html#register-state
+        */
+#if defined(CONFIG_RISCV)
+       bmi->argc = gd->arch.boot_hart;
+       bmi->argv = (char **)bmi->images->ft_addr;
+#endif
+
        bootelf(bmi->images->ep, flags, bmi->argc, bmi->argv);
 
        return 1;