While creating the 2nd dtb to be passed to the secondary kernel for arm64, we need to handle the return values from helper fdt functions properly, to make sure that we can handle various command-line options being passed to 'kexec' both for kexec load and kdump purposes. This will provide proper error reporting to the calling function in case something goes wrong. Without this patch, we get misleading error FDT_ERR_BADOFFSET reported when we pass a .dtb to 'kexec -p' using '--dtb' option, which doesn't contain the '/chosen' node (for e.g. the rockchip sapphire board dtb -> rk3399-sapphire.dtb). # kexec -d -p Image --reuse-cmdline --dtb rk3399-sapphire.dtb <..snip..> load_crashdump_segments: elfcorehdr 0xbfff0000-0xbfff33ff get_cells_size: #address-cells:2 #size-cells:2 cells_size_fitted: bfff0000-bfff33ff cells_size_fitted: 8ee00000-bfffffff setup_2nd_dtb: no kaslr-seed found setup_2nd_dtb: fdt_setprop failed: FDT_ERR_BADOFFSET kexec: setup_2nd_dtb failed. kexec: load failed. Now after the fix, we get the correct error FDT_ERR_NOTFOUND reported to the calling function: # kexec -d -l Image --append 'debug' --dtb rk3399-sapphire.dtb <..snip..> load_crashdump_segments: elfcorehdr 0xbfff0000-0xbfff33ff get_cells_size: #address-cells:2 #size-cells:2 cells_size_fitted: bfff0000-bfff33ff cells_size_fitted: 8ee00000-bfffffff setup_2nd_dtb: /chosen node not found - can't create dtb for dump kernel: FDT_ERR_NOTFOUND kexec: setup_2nd_dtb failed. kexec: load failed. Cc: Simon Horman <horms@xxxxxxxxxxxx> Cc: AKASHI Takahiro <takahiro.akashi@xxxxxxxxxx> Signed-off-by: Bhupesh Sharma <bhsharma@xxxxxxxxxx> --- kexec/arch/arm64/kexec-arm64.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/kexec/arch/arm64/kexec-arm64.c b/kexec/arch/arm64/kexec-arm64.c index f4913b2e9480..560d83455f95 100644 --- a/kexec/arch/arm64/kexec-arm64.c +++ b/kexec/arch/arm64/kexec-arm64.c @@ -515,6 +515,11 @@ static int setup_2nd_dtb(struct dtb *dtb, char *command_line, int on_crash) } nodeoffset = fdt_path_offset(new_buf, "/chosen"); + if (nodeoffset < 0) { + result = nodeoffset; + goto on_error; + } + result = fdt_setprop_inplace(new_buf, nodeoffset, "kaslr-seed", &fdt_val64, sizeof(fdt_val64)); @@ -529,6 +534,14 @@ static int setup_2nd_dtb(struct dtb *dtb, char *command_line, int on_crash) if (on_crash) { /* add linux,elfcorehdr */ nodeoffset = fdt_path_offset(new_buf, "/chosen"); + if (nodeoffset < 0) { + result = nodeoffset; + dbgprintf("%s: /chosen node not found - can't create " + "dtb for dump kernel: %s\n", __func__, + fdt_strerror(result)); + goto on_error; + } + result = fdt_setprop_range(new_buf, nodeoffset, PROP_ELFCOREHDR, &elfcorehdr_mem, address_cells, size_cells); @@ -541,6 +554,14 @@ static int setup_2nd_dtb(struct dtb *dtb, char *command_line, int on_crash) /* add linux,usable-memory-range */ nodeoffset = fdt_path_offset(new_buf, "/chosen"); + if (nodeoffset < 0) { + result = nodeoffset; + dbgprintf("%s: /chosen node not found - can't create " + "dtb for dump kernel: %s\n", __func__, + fdt_strerror(result)); + goto on_error; + } + result = fdt_setprop_range(new_buf, nodeoffset, PROP_USABLE_MEM_RANGE, &crash_reserved_mem, address_cells, size_cells); -- 2.7.4 _______________________________________________ kexec mailing list kexec@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/kexec