Re: [PATCH] of/kexec: save pa of initial_boot_params for arm64 and use it at kexec

From: Rob Herring
Date: Thu Oct 03 2024 - 20:03:27 EST


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