On 2024-05-22 23:02:17+0000, Jiaxun Yang wrote: > fdt_check_header(__dtb_start) will always success because kernel > provided a dummy dtb, and by coincidence __dtb_start clashed with > entry of this dummy dtb. The consequence is fdt passed from > firmware will never be taken. > > Fix by trying to utilise __dtb_start only when CONFIG_BUILTIN_DTB > is enabled. > > Cc: stable@xxxxxxxxxxxxxxx > Fixes: 7b937cc243e5 ("of: Create of_root if no dtb provided by firmware") > Signed-off-by: Jiaxun Yang <jiaxun.yang@xxxxxxxxxxx> > --- > v3: Better reasoning in commit message, thanks Binbin and Huacai! > --- > arch/loongarch/kernel/setup.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/arch/loongarch/kernel/setup.c b/arch/loongarch/kernel/setup.c > index 60e0fe97f61a..ea6d5db6c878 100644 > --- a/arch/loongarch/kernel/setup.c > +++ b/arch/loongarch/kernel/setup.c > @@ -275,16 +275,18 @@ static void __init arch_reserve_crashkernel(void) > static void __init fdt_setup(void) > { > #ifdef CONFIG_OF_EARLY_FLATTREE > - void *fdt_pointer; > + void *fdt_pointer = NULL; > > /* ACPI-based systems do not require parsing fdt */ > if (acpi_os_get_root_pointer()) > return; > > +#ifdef CONFIG_BUILTIN_DTB > /* Prefer to use built-in dtb, checking its legality first. */ > if (!fdt_check_header(__dtb_start)) > fdt_pointer = __dtb_start; > - else > +#endif > + if (!fdt_pointer) > fdt_pointer = efi_fdt_pointer(); /* Fallback to firmware dtb */ Prefer to use non-ifdef logic: if (IS_ENABLED(CONFIG_BUILTIN_DTB) && !fdt_check_header(__dtb_start)) fdt_pointer = __dtb_start; This is shorter, easier to read and will prevent bitrot. The code will be typechecked but then optimized away, so no runtime overhead exists. > > if (!fdt_pointer || fdt_check_header(fdt_pointer)) > > -- > 2.43.0 >