diff options
Diffstat (limited to 'meta/recipes-kernel/kexec/kexec-tools/0008-arm64-kdump-add-DT-properties-to-crash-dump-kernel-s.patch')
-rw-r--r-- | meta/recipes-kernel/kexec/kexec-tools/0008-arm64-kdump-add-DT-properties-to-crash-dump-kernel-s.patch | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/meta/recipes-kernel/kexec/kexec-tools/0008-arm64-kdump-add-DT-properties-to-crash-dump-kernel-s.patch b/meta/recipes-kernel/kexec/kexec-tools/0008-arm64-kdump-add-DT-properties-to-crash-dump-kernel-s.patch new file mode 100644 index 0000000000..31c3d8510a --- /dev/null +++ b/meta/recipes-kernel/kexec/kexec-tools/0008-arm64-kdump-add-DT-properties-to-crash-dump-kernel-s.patch @@ -0,0 +1,150 @@ +From 23bf7ac189cc3b87ceb9d1d3b69b5c4815354add Mon Sep 17 00:00:00 2001 +From: AKASHI Takahiro <takahiro.akashi@linaro.org> +Date: Wed, 27 Jan 2016 13:38:39 +0900 +Subject: [PATCH 8/9] arm64: kdump: add DT properties to crash dump kernel's + dtb + +We pass the following properties to crash dump kernel: +linux,elfcorehdr: elf core header segment, + same as "elfcorehdr=" kernel parameter on other archs +linux,usable-memory-range: usable memory reserved for crash dump kernel + +Upstream-Status: Backport [https://git.linaro.org/people/takahiro.akashi/kexec-tools.git] + +Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> +Signed-off-by: He Zhe <zhe.he@windriver.com> +--- + kexec/arch/arm64/kexec-arm64.c | 76 +++++++++++++++++++++++++++++++++++--- + kexec/arch/arm64/kexec-elf-arm64.c | 5 --- + 2 files changed, 71 insertions(+), 10 deletions(-) + +diff --git a/kexec/arch/arm64/kexec-arm64.c b/kexec/arch/arm64/kexec-arm64.c +index 78a0035..a8fb64f 100644 +--- a/kexec/arch/arm64/kexec-arm64.c ++++ b/kexec/arch/arm64/kexec-arm64.c +@@ -128,9 +128,6 @@ int arch_process_options(int argc, char **argv) + case OPT_INITRD: + arm64_opts.initrd = optarg; + break; +- case OPT_PANIC: +- die("load-panic (-p) not supported"); +- break; + default: + break; /* Ignore core and unknown options. */ + } +@@ -285,8 +282,12 @@ on_success: + * setup_2nd_dtb - Setup the 2nd stage kernel's dtb. + */ + +-static int setup_2nd_dtb(struct dtb *dtb, char *command_line) ++static int setup_2nd_dtb(struct dtb *dtb, char *command_line, int on_crash) + { ++ char *new_buf; ++ int new_size; ++ int nodeoffset; ++ uint64_t range[2]; + int result; + + result = fdt_check_header(dtb->buf); +@@ -298,8 +299,72 @@ static int setup_2nd_dtb(struct dtb *dtb, char *command_line) + + result = set_bootargs(dtb, command_line); + ++ /* remove those anyway */ ++ nodeoffset = fdt_path_offset(dtb->buf, "/chosen"); ++ fdt_delprop(dtb->buf, nodeoffset, "linux,crashkernel-base"); ++ fdt_delprop(dtb->buf, nodeoffset, "linux,crashkernel-size"); ++ ++ if (on_crash) { ++ nodeoffset = fdt_path_offset(dtb->buf, "/chosen"); ++ fdt_delprop(dtb->buf, nodeoffset, "linux,elfcorehdr"); ++ fdt_delprop(dtb->buf, nodeoffset, "linux,usable-memory-range"); ++ new_size = fdt_totalsize(dtb->buf) ++ + 2 * (sizeof(struct fdt_property) ++ + FDT_TAGALIGN(sizeof(range))) ++ + strlen("linux,elfcorehdr") + 1 ++ + strlen("linux,usable-memory-range") + 1; ++ ++ new_buf = xmalloc(new_size); ++ result = fdt_open_into(dtb->buf, new_buf, new_size); ++ if (result) { ++ dbgprintf("%s: fdt_open_into failed: %s\n", __func__, ++ fdt_strerror(result)); ++ result = -ENOSPC; ++ goto on_error; ++ } ++ ++ range[0] = cpu_to_be64(elfcorehdr_mem.start); ++ range[1] = cpu_to_be64(elfcorehdr_mem.end ++ - elfcorehdr_mem.start + 1); ++ nodeoffset = fdt_path_offset(new_buf, "/chosen"); ++ result = fdt_setprop(new_buf, nodeoffset, "linux,elfcorehdr", ++ (void *)range, sizeof(range)); ++ if (result) { ++ dbgprintf("%s: fdt_setprop failed: %s\n", __func__, ++ fdt_strerror(result)); ++ result = -EINVAL; ++ goto on_error; ++ } ++ ++ range[0] = cpu_to_be64(crash_reserved_mem.start); ++ range[1] = cpu_to_be64(crash_reserved_mem.end ++ - crash_reserved_mem.start + 1); ++ nodeoffset = fdt_path_offset(new_buf, "/chosen"); ++ result = fdt_setprop(new_buf, nodeoffset, ++ "linux,usable-memory-range", ++ (void *)range, sizeof(range)); ++ if (result) { ++ dbgprintf("%s: fdt_setprop failed: %s\n", __func__, ++ fdt_strerror(result)); ++ result = -EINVAL; ++ goto on_error; ++ } ++ ++ fdt_pack(new_buf); ++ dtb->buf = new_buf; ++ dtb->size = fdt_totalsize(new_buf); ++ } ++ + dump_reservemap(dtb); + ++ ++ return result; ++ ++on_error: ++ fprintf(stderr, "kexec: %s failed.\n", __func__); ++ if (new_buf) ++ free(new_buf); ++ + return result; + } + +@@ -366,7 +431,8 @@ int arm64_load_other_segments(struct kexec_info *info, + } + } + +- result = setup_2nd_dtb(&dtb, command_line); ++ result = setup_2nd_dtb(&dtb, command_line, ++ info->kexec_flags & KEXEC_ON_CRASH); + + if (result) + return -EFAILED; +diff --git a/kexec/arch/arm64/kexec-elf-arm64.c b/kexec/arch/arm64/kexec-elf-arm64.c +index 842ce21..b17a31a 100644 +--- a/kexec/arch/arm64/kexec-elf-arm64.c ++++ b/kexec/arch/arm64/kexec-elf-arm64.c +@@ -47,11 +47,6 @@ int elf_arm64_load(int argc, char **argv, const char *kernel_buf, + int result; + int i; + +- if (info->kexec_flags & KEXEC_ON_CRASH) { +- fprintf(stderr, "kexec: kdump not yet supported on arm64\n"); +- return -EFAILED; +- } +- + result = build_elf_exec_info(kernel_buf, kernel_size, &ehdr, 0); + + if (result < 0) { +-- +1.9.1 + |