From nobody Mon Feb 9 00:54:41 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C1B0A1EA7E2; Thu, 6 Feb 2025 13:29:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738848582; cv=none; b=XrMb3+j9rdhpXRUr9xTjuzOCI1u2Ad0VxOXZg4bT4bed7UKCmsycGJI1S9dFuXOvA3oImOhgg7M5AvJpkFc53VpMspqfZa+FiITimgfJ1mmO7yE8laaoHolmLq6puhgSBLfSJK1R/mxNT/B2wnS1vy+C/TNFCxUAFGbUb/CY18I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738848582; c=relaxed/simple; bh=YhQ3gt0FcvyhHrH/fq8eDTzHj2J/JGVva+XZhcAjRME=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r/yOHIeEDrQjMiMGJe9FY5QZK7EMjbJ+SmDBjB2rkwA2U8ycSCMWQsPW2/tJo0X7xVtEN/du00kxzNSHaJxmRSTpV6q4AoprCYkQTvwdNUIyoFCaKpdxeSfZTl54gRWpZrnFMjt65Y9P5lh37gX8ev05AXogrRCF0xh52iTkaKY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WFHeaz2W; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="WFHeaz2W" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B6746C4CEE5; Thu, 6 Feb 2025 13:29:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1738848582; bh=YhQ3gt0FcvyhHrH/fq8eDTzHj2J/JGVva+XZhcAjRME=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WFHeaz2Wf6zAlFKNEJGYupJoP4tb+oKUBXfVqahTutVYbwIRBynlBQHaXayGwkEu2 DuphCe8xk2pe+8oH7+XZQSe9pjgWZGsmkIospzcHjxO3RytUcsVovJmfiYKBBORcsL 4luOZoe358T6aqKuQn/upUfy7Z5PmlquzBJHTrWLVRYP7hc0VriUcgl4lPKOe4bajV ZVwAy9jBA2xpMFC/I3n9y07yrA5AKtZFTK9AcidCwRDnRl6rYTvWRjSGn6dW1qiFfP OHYDZqXXjaHUsYQmI1svg4fNC3oyX5TyerVpmcK3gD0lOT5H5hMpCAfnQUVx3w8RiF MCVMFhIn9tgsQ== From: Mike Rapoport To: linux-kernel@vger.kernel.org Cc: Alexander Graf , Andrew Morton , Andy Lutomirski , Anthony Yznaga , Arnd Bergmann , Ashish Kalra , Benjamin Herrenschmidt , Borislav Petkov , Catalin Marinas , Dave Hansen , David Woodhouse , Eric Biederman , Ingo Molnar , James Gowans , Jonathan Corbet , Krzysztof Kozlowski , Mark Rutland , Mike Rapoport , Paolo Bonzini , Pasha Tatashin , "H. Peter Anvin" , Peter Zijlstra , Pratyush Yadav , Rob Herring , Rob Herring , Saravana Kannan , Stanislav Kinsburskii , Steven Rostedt , Thomas Gleixner , Tom Lendacky , Usama Arif , Will Deacon , devicetree@vger.kernel.org, kexec@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-mm@kvack.org, x86@kernel.org Subject: [PATCH v4 10/14] arm64: Add KHO support Date: Thu, 6 Feb 2025 15:27:50 +0200 Message-ID: <20250206132754.2596694-11-rppt@kernel.org> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250206132754.2596694-1-rppt@kernel.org> References: <20250206132754.2596694-1-rppt@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Alexander Graf We now have all bits in place to support KHO kexecs. This patch adds awareness of KHO in the kexec file as well as boot path for arm64 and adds the respective kconfig option to the architecture so that it can use KHO successfully. Signed-off-by: Alexander Graf Co-developed-by: Mike Rapoport (Microsoft) Signed-off-by: Mike Rapoport (Microsoft) --- arch/arm64/Kconfig | 3 +++ drivers/of/fdt.c | 36 ++++++++++++++++++++++++++++++++++++ drivers/of/kexec.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index fcdd0ed3eca8..5d9f07cea258 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -1590,6 +1590,9 @@ config ARCH_SUPPORTS_KEXEC_IMAGE_VERIFY_SIG config ARCH_DEFAULT_KEXEC_IMAGE_VERIFY_SIG def_bool y =20 +config ARCH_SUPPORTS_KEXEC_HANDOVER + def_bool y + config ARCH_SUPPORTS_CRASH_DUMP def_bool y =20 diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index aedd0e2dcd89..3178bf9c6bd2 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -875,6 +875,39 @@ void __init early_init_dt_check_for_usable_mem_range(v= oid) memblock_add(rgn[i].base, rgn[i].size); } =20 +/** + * early_init_dt_check_kho - Decode info required for kexec handover from = DT + */ +static void __init early_init_dt_check_kho(void) +{ + unsigned long node =3D chosen_node_offset; + u64 kho_start, scratch_start, scratch_size; + const __be32 *p; + int l; + + if (!IS_ENABLED(CONFIG_KEXEC_HANDOVER) || (long)node < 0) + return; + + p =3D of_get_flat_dt_prop(node, "linux,kho-dt", &l); + if (l !=3D (dt_root_addr_cells + dt_root_size_cells) * sizeof(__be32)) + return; + + kho_start =3D dt_mem_next_cell(dt_root_addr_cells, &p); + + p =3D of_get_flat_dt_prop(node, "linux,kho-scratch", &l); + if (l !=3D (dt_root_addr_cells + dt_root_size_cells) * sizeof(__be32)) + return; + + scratch_start =3D dt_mem_next_cell(dt_root_addr_cells, &p); + scratch_size =3D dt_mem_next_cell(dt_root_addr_cells, &p); + + p =3D of_get_flat_dt_prop(node, "linux,kho-mem", &l); + if (l !=3D (dt_root_addr_cells + dt_root_size_cells) * sizeof(__be32)) + return; + + kho_populate(kho_start, scratch_start, scratch_size); +} + #ifdef CONFIG_SERIAL_EARLYCON =20 int __init early_init_dt_scan_chosen_stdout(void) @@ -1169,6 +1202,9 @@ void __init early_init_dt_scan_nodes(void) =20 /* Handle linux,usable-memory-range property */ early_init_dt_check_for_usable_mem_range(); + + /* Handle kexec handover */ + early_init_dt_check_kho(); } =20 bool __init early_init_dt_scan(void *dt_virt, phys_addr_t dt_phys) diff --git a/drivers/of/kexec.c b/drivers/of/kexec.c index 5b924597a4de..f6cf0bc13246 100644 --- a/drivers/of/kexec.c +++ b/drivers/of/kexec.c @@ -264,6 +264,43 @@ static inline int setup_ima_buffer(const struct kimage= *image, void *fdt, } #endif /* CONFIG_IMA_KEXEC */ =20 +static int kho_add_chosen(const struct kimage *image, void *fdt, int chose= n_node) +{ + void *dt =3D NULL; + phys_addr_t dt_mem =3D 0; + phys_addr_t dt_len =3D 0; + phys_addr_t scratch_mem =3D 0; + phys_addr_t scratch_len =3D 0; + int ret =3D 0; + +#ifdef CONFIG_KEXEC_HANDOVER + dt =3D image->kho.dt.buffer; + dt_mem =3D image->kho.dt.mem; + dt_len =3D image->kho.dt.bufsz; + + scratch_mem =3D image->kho.scratch.mem; + scratch_len =3D image->kho.scratch.bufsz; +#endif + + if (!dt) + goto out; + + pr_debug("Adding kho metadata to DT"); + + ret =3D fdt_appendprop_addrrange(fdt, 0, chosen_node, "linux,kho-dt", + dt_mem, dt_len); + if (ret) + goto out; + + ret =3D fdt_appendprop_addrrange(fdt, 0, chosen_node, "linux,kho-scratch", + scratch_mem, scratch_len); + if (ret) + goto out; + +out: + return ret; +} + /* * of_kexec_alloc_and_setup_fdt - Alloc and setup a new Flattened Device T= ree * @@ -414,6 +451,11 @@ void *of_kexec_alloc_and_setup_fdt(const struct kimage= *image, #endif } =20 + /* Add kho metadata if this is a KHO image */ + ret =3D kho_add_chosen(image, fdt, chosen_node); + if (ret) + goto out; + /* add bootargs */ if (cmdline) { ret =3D fdt_setprop_string(fdt, chosen_node, "bootargs", cmdline); --=20 2.47.2