Thread (38 messages) 38 messages, 5 authors, 2021-02-12

Re: [PATCH v17 02/10] of: Add a common kexec FDT setup function

From: Rob Herring <robh@kernel.org>
Date: 2021-02-12 18:25:09
Also in: linux-arm-kernel, linux-devicetree, linux-integrity, lkml

On Fri, Feb 12, 2021 at 11:19 AM Lakshmi Ramasubramanian
[off-list ref] wrote:
On 2/12/21 6:38 AM, Rob Herring wrote:
quoted
On Thu, Feb 11, 2021 at 7:17 PM Lakshmi Ramasubramanian
[off-list ref] wrote:
quoted
On 2/11/21 5:09 PM, Thiago Jung Bauermann wrote:
quoted
There's actually a complication that I just noticed and needs to be
addressed. More below.
<...>
quoted
quoted
+
+/*
+ * of_kexec_alloc_and_setup_fdt - Alloc and setup a new Flattened Device Tree
+ *
+ * @image:          kexec image being loaded.
+ * @initrd_load_addr:       Address where the next initrd will be loaded.
+ * @initrd_len:             Size of the next initrd, or 0 if there will be none.
+ * @cmdline:                Command line for the next kernel, or NULL if there will
+ *                  be none.
+ *
+ * Return: fdt on success, or NULL errno on error.
+ */
+void *of_kexec_alloc_and_setup_fdt(const struct kimage *image,
+                               unsigned long initrd_load_addr,
+                               unsigned long initrd_len,
+                               const char *cmdline)
+{
+    void *fdt;
+    int ret, chosen_node;
+    const void *prop;
+    unsigned long fdt_size;
+
+    fdt_size = fdt_totalsize(initial_boot_params) +
+               (cmdline ? strlen(cmdline) : 0) +
+               FDT_EXTRA_SPACE;
Just adding 4 KB to initial_boot_params won't be enough for crash
kernels on ppc64. The current powerpc code doubles the size of
initial_boot_params (which is normally larger than 4 KB) and even that
isn't enough. A patch was added to powerpc/next today which uses a more
precise (but arch-specific) formula:

https://lore.kernel.org/linuxppc-dev/161243826811.119001.14083048209224609814.stgit@hbathini/ (local)

So I believe we need a hook here where architectures can provide their
own specific calculation for the size of the fdt. Perhaps a weakly
defined function providing a default implementation which an
arch-specific file can override (a la arch_kexec_kernel_image_load())?

Then the powerpc specific hook would be the kexec_fdt_totalsize_ppc64()
function from the patch I linked above.
Do you think it'd better to add "fdt_size" parameter to
of_kexec_alloc_and_setup_fdt() so that the caller can provide the
desired FDT buffer size?
Yes, I guess so. But please define the param as extra size, not total
size. The kernel command line size addition can be in the common code.
Will do. Just to clarify -

The common code will do:

fdt_totalsize(initial_boot_params) + strlen(cmdline) + extra_fdt_size

The caller will pass "extra_fdt_size"
ARM64 => 4KB
PPC64 => fdt_totalsize(initial_boot_params) - which will be updated when
the patch Thiago had referred to is merged.
Yes, I'd leave the 4KB in there by default and arm64 use 0.

Rob
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help