On Thu, Oct 03, 2024 at 12:38:40PM +0100, Usama Arif wrote: > __pa() is only intended to be used for linear map addresses and using > it for initial_boot_params which is in fixmap for arm64 will give an > incorrect value. Hence stash the physical address when it is known at > boot time and use it at kexec time instead of converting the virtual > address using __pa(). > > Reported-by: Breno Leitao <leitao@xxxxxxxxxx> > Suggested-by: Mark Rutland <mark.rutland@xxxxxxx> > Signed-off-by: Usama Arif <usamaarif642@xxxxxxxxx> > Fixes: ac10be5cdbfa ("arm64: Use common of_kexec_alloc_and_setup_fdt()") > --- > arch/arm64/kernel/setup.c | 8 ++++++++ > drivers/of/fdt.c | 6 ++++++ > drivers/of/kexec.c | 8 ++++++-- > include/linux/of_fdt.h | 2 ++ > 4 files changed, 22 insertions(+), 2 deletions(-) > > diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c > index b22d28ec8028..a4d96f5e2e05 100644 > --- a/arch/arm64/kernel/setup.c > +++ b/arch/arm64/kernel/setup.c > @@ -194,6 +194,14 @@ static void __init setup_machine_fdt(phys_addr_t dt_phys) > /* Early fixups are done, map the FDT as read-only now */ > fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL_RO); > > + /* > + * Save dt_phys address so that it can be used later for kexec. This > + * is done as __pa() is only intended to be used for linear map addresses > + * and using it for initial_boot_params which is in fixmap will give an > + * incorrect value. > + */ > + set_initial_boot_params_pa(dt_phys); No new arch->dt functions please. If we need to save off the PA, then do that when we set initial_boot_params. Rob