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 @@ | |||
1 | From 23bf7ac189cc3b87ceb9d1d3b69b5c4815354add Mon Sep 17 00:00:00 2001 | ||
2 | From: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
3 | Date: Wed, 27 Jan 2016 13:38:39 +0900 | ||
4 | Subject: [PATCH 8/9] arm64: kdump: add DT properties to crash dump kernel's | ||
5 | dtb | ||
6 | |||
7 | We pass the following properties to crash dump kernel: | ||
8 | linux,elfcorehdr: elf core header segment, | ||
9 | same as "elfcorehdr=" kernel parameter on other archs | ||
10 | linux,usable-memory-range: usable memory reserved for crash dump kernel | ||
11 | |||
12 | Upstream-Status: Backport [https://git.linaro.org/people/takahiro.akashi/kexec-tools.git] | ||
13 | |||
14 | Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
15 | Signed-off-by: He Zhe <zhe.he@windriver.com> | ||
16 | --- | ||
17 | kexec/arch/arm64/kexec-arm64.c | 76 +++++++++++++++++++++++++++++++++++--- | ||
18 | kexec/arch/arm64/kexec-elf-arm64.c | 5 --- | ||
19 | 2 files changed, 71 insertions(+), 10 deletions(-) | ||
20 | |||
21 | diff --git a/kexec/arch/arm64/kexec-arm64.c b/kexec/arch/arm64/kexec-arm64.c | ||
22 | index 78a0035..a8fb64f 100644 | ||
23 | --- a/kexec/arch/arm64/kexec-arm64.c | ||
24 | +++ b/kexec/arch/arm64/kexec-arm64.c | ||
25 | @@ -128,9 +128,6 @@ int arch_process_options(int argc, char **argv) | ||
26 | case OPT_INITRD: | ||
27 | arm64_opts.initrd = optarg; | ||
28 | break; | ||
29 | - case OPT_PANIC: | ||
30 | - die("load-panic (-p) not supported"); | ||
31 | - break; | ||
32 | default: | ||
33 | break; /* Ignore core and unknown options. */ | ||
34 | } | ||
35 | @@ -285,8 +282,12 @@ on_success: | ||
36 | * setup_2nd_dtb - Setup the 2nd stage kernel's dtb. | ||
37 | */ | ||
38 | |||
39 | -static int setup_2nd_dtb(struct dtb *dtb, char *command_line) | ||
40 | +static int setup_2nd_dtb(struct dtb *dtb, char *command_line, int on_crash) | ||
41 | { | ||
42 | + char *new_buf; | ||
43 | + int new_size; | ||
44 | + int nodeoffset; | ||
45 | + uint64_t range[2]; | ||
46 | int result; | ||
47 | |||
48 | result = fdt_check_header(dtb->buf); | ||
49 | @@ -298,8 +299,72 @@ static int setup_2nd_dtb(struct dtb *dtb, char *command_line) | ||
50 | |||
51 | result = set_bootargs(dtb, command_line); | ||
52 | |||
53 | + /* remove those anyway */ | ||
54 | + nodeoffset = fdt_path_offset(dtb->buf, "/chosen"); | ||
55 | + fdt_delprop(dtb->buf, nodeoffset, "linux,crashkernel-base"); | ||
56 | + fdt_delprop(dtb->buf, nodeoffset, "linux,crashkernel-size"); | ||
57 | + | ||
58 | + if (on_crash) { | ||
59 | + nodeoffset = fdt_path_offset(dtb->buf, "/chosen"); | ||
60 | + fdt_delprop(dtb->buf, nodeoffset, "linux,elfcorehdr"); | ||
61 | + fdt_delprop(dtb->buf, nodeoffset, "linux,usable-memory-range"); | ||
62 | + new_size = fdt_totalsize(dtb->buf) | ||
63 | + + 2 * (sizeof(struct fdt_property) | ||
64 | + + FDT_TAGALIGN(sizeof(range))) | ||
65 | + + strlen("linux,elfcorehdr") + 1 | ||
66 | + + strlen("linux,usable-memory-range") + 1; | ||
67 | + | ||
68 | + new_buf = xmalloc(new_size); | ||
69 | + result = fdt_open_into(dtb->buf, new_buf, new_size); | ||
70 | + if (result) { | ||
71 | + dbgprintf("%s: fdt_open_into failed: %s\n", __func__, | ||
72 | + fdt_strerror(result)); | ||
73 | + result = -ENOSPC; | ||
74 | + goto on_error; | ||
75 | + } | ||
76 | + | ||
77 | + range[0] = cpu_to_be64(elfcorehdr_mem.start); | ||
78 | + range[1] = cpu_to_be64(elfcorehdr_mem.end | ||
79 | + - elfcorehdr_mem.start + 1); | ||
80 | + nodeoffset = fdt_path_offset(new_buf, "/chosen"); | ||
81 | + result = fdt_setprop(new_buf, nodeoffset, "linux,elfcorehdr", | ||
82 | + (void *)range, sizeof(range)); | ||
83 | + if (result) { | ||
84 | + dbgprintf("%s: fdt_setprop failed: %s\n", __func__, | ||
85 | + fdt_strerror(result)); | ||
86 | + result = -EINVAL; | ||
87 | + goto on_error; | ||
88 | + } | ||
89 | + | ||
90 | + range[0] = cpu_to_be64(crash_reserved_mem.start); | ||
91 | + range[1] = cpu_to_be64(crash_reserved_mem.end | ||
92 | + - crash_reserved_mem.start + 1); | ||
93 | + nodeoffset = fdt_path_offset(new_buf, "/chosen"); | ||
94 | + result = fdt_setprop(new_buf, nodeoffset, | ||
95 | + "linux,usable-memory-range", | ||
96 | + (void *)range, sizeof(range)); | ||
97 | + if (result) { | ||
98 | + dbgprintf("%s: fdt_setprop failed: %s\n", __func__, | ||
99 | + fdt_strerror(result)); | ||
100 | + result = -EINVAL; | ||
101 | + goto on_error; | ||
102 | + } | ||
103 | + | ||
104 | + fdt_pack(new_buf); | ||
105 | + dtb->buf = new_buf; | ||
106 | + dtb->size = fdt_totalsize(new_buf); | ||
107 | + } | ||
108 | + | ||
109 | dump_reservemap(dtb); | ||
110 | |||
111 | + | ||
112 | + return result; | ||
113 | + | ||
114 | +on_error: | ||
115 | + fprintf(stderr, "kexec: %s failed.\n", __func__); | ||
116 | + if (new_buf) | ||
117 | + free(new_buf); | ||
118 | + | ||
119 | return result; | ||
120 | } | ||
121 | |||
122 | @@ -366,7 +431,8 @@ int arm64_load_other_segments(struct kexec_info *info, | ||
123 | } | ||
124 | } | ||
125 | |||
126 | - result = setup_2nd_dtb(&dtb, command_line); | ||
127 | + result = setup_2nd_dtb(&dtb, command_line, | ||
128 | + info->kexec_flags & KEXEC_ON_CRASH); | ||
129 | |||
130 | if (result) | ||
131 | return -EFAILED; | ||
132 | diff --git a/kexec/arch/arm64/kexec-elf-arm64.c b/kexec/arch/arm64/kexec-elf-arm64.c | ||
133 | index 842ce21..b17a31a 100644 | ||
134 | --- a/kexec/arch/arm64/kexec-elf-arm64.c | ||
135 | +++ b/kexec/arch/arm64/kexec-elf-arm64.c | ||
136 | @@ -47,11 +47,6 @@ int elf_arm64_load(int argc, char **argv, const char *kernel_buf, | ||
137 | int result; | ||
138 | int i; | ||
139 | |||
140 | - if (info->kexec_flags & KEXEC_ON_CRASH) { | ||
141 | - fprintf(stderr, "kexec: kdump not yet supported on arm64\n"); | ||
142 | - return -EFAILED; | ||
143 | - } | ||
144 | - | ||
145 | result = build_elf_exec_info(kernel_buf, kernel_size, &ehdr, 0); | ||
146 | |||
147 | if (result < 0) { | ||
148 | -- | ||
149 | 1.9.1 | ||
150 | |||