diff options
author | He Zhe <zhe.he@windriver.com> | 2016-12-21 17:56:23 +0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-01-05 13:54:06 +0000 |
commit | df48c4b483b95c67a9305f28b554ab4b5dba2b89 (patch) | |
tree | e670c33757c7d0bf903ff0da0031c1574a4a7ee3 /meta/recipes-kernel | |
parent | b4a795aa0cbee4938df37e87c355476dedf3f827 (diff) | |
download | poky-df48c4b483b95c67a9305f28b554ab4b5dba2b89.tar.gz |
kexec-tools: Update to 2.0.14
Remove kexec-aarch64.patch since it has been merged upstream
Remove kexec-x32.patch since it has been reverted upstream
Backport patches for kdump arm64 from:
https://git.linaro.org/people/takahiro.akashi/kexec-tools.git
(From OE-Core rev: 587778e24c9129f499645ca080218c7ac142f93f)
Signed-off-by: He Zhe <zhe.he@windriver.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/recipes-kernel')
10 files changed, 1127 insertions, 5 deletions
diff --git a/meta/recipes-kernel/kexec/kexec-tools/0001-kexec-exntend-the-semantics-of-kexec_iomem_for_each_.patch b/meta/recipes-kernel/kexec/kexec-tools/0001-kexec-exntend-the-semantics-of-kexec_iomem_for_each_.patch new file mode 100644 index 0000000000..822f28c44b --- /dev/null +++ b/meta/recipes-kernel/kexec/kexec-tools/0001-kexec-exntend-the-semantics-of-kexec_iomem_for_each_.patch | |||
@@ -0,0 +1,78 @@ | |||
1 | From 02eed0f8f2748fd7579f69e5373445b52b2b8754 Mon Sep 17 00:00:00 2001 | ||
2 | From: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
3 | Date: Mon, 17 Oct 2016 13:56:58 +0900 | ||
4 | Subject: [PATCH 1/9] kexec: exntend the semantics of kexec_iomem_for_each_line | ||
5 | |||
6 | The current kexec_iomem_for_each_line() counts up all the lines for which | ||
7 | a callback function returns zero(0) or positive, and otherwise it stops | ||
8 | further scanning. | ||
9 | This behavior is incovenient in some cases. For instance, on arm64, we want | ||
10 | to count up "System RAM" entries, but need to skip "reserved" entries. | ||
11 | |||
12 | So this patch extends the semantics so that we will continue to scan | ||
13 | succeeding entries but not count lines for which a callback function | ||
14 | returns positive. | ||
15 | |||
16 | The current users of kexec_iomem_for_each_line(), arm, sh and x86, will not | ||
17 | be affected by this change because | ||
18 | * arm | ||
19 | The callback function only returns -1 or 0, and the return value of | ||
20 | kexec_iomem_for_each_line() will never be used. | ||
21 | * sh, x86 | ||
22 | The callback function may return (-1 for sh,) 0 or 1, but always returns | ||
23 | 1 once we have reached the maximum number of entries allowed. | ||
24 | Even so the current kexec_iomem_for_each_line() counts them up. | ||
25 | This change actually fixes this bug. | ||
26 | |||
27 | Upstream-Status: Backport [https://git.linaro.org/people/takahiro.akashi/kexec-tools.git] | ||
28 | |||
29 | Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
30 | Signed-off-by: He Zhe <zhe.he@windriver.com> | ||
31 | --- | ||
32 | kexec/kexec-iomem.c | 15 ++++++++++----- | ||
33 | 1 file changed, 10 insertions(+), 5 deletions(-) | ||
34 | |||
35 | diff --git a/kexec/kexec-iomem.c b/kexec/kexec-iomem.c | ||
36 | index 485a2e8..0a0277a 100644 | ||
37 | --- a/kexec/kexec-iomem.c | ||
38 | +++ b/kexec/kexec-iomem.c | ||
39 | @@ -18,6 +18,9 @@ | ||
40 | * Iterate over each line in the file returned by proc_iomem(). If match is | ||
41 | * NULL or if the line matches with our match-pattern then call the | ||
42 | * callback if non-NULL. | ||
43 | + * If match is NULL, callback should return a negative if error. | ||
44 | + * Otherwise the interation goes on, incrementing nr but only if callback | ||
45 | + * returns 0 (matched). | ||
46 | * | ||
47 | * Return the number of lines matched. | ||
48 | */ | ||
49 | @@ -37,7 +40,7 @@ int kexec_iomem_for_each_line(char *match, | ||
50 | char *str; | ||
51 | int consumed; | ||
52 | int count; | ||
53 | - int nr = 0; | ||
54 | + int nr = 0, ret; | ||
55 | |||
56 | fp = fopen(iomem, "r"); | ||
57 | if (!fp) | ||
58 | @@ -50,11 +53,13 @@ int kexec_iomem_for_each_line(char *match, | ||
59 | str = line + consumed; | ||
60 | size = end - start + 1; | ||
61 | if (!match || memcmp(str, match, strlen(match)) == 0) { | ||
62 | - if (callback | ||
63 | - && callback(data, nr, str, start, size) < 0) { | ||
64 | - break; | ||
65 | + if (callback) { | ||
66 | + ret = callback(data, nr, str, start, size); | ||
67 | + if (ret < 0) | ||
68 | + break; | ||
69 | + else if (ret == 0) | ||
70 | + nr++; | ||
71 | } | ||
72 | - nr++; | ||
73 | } | ||
74 | } | ||
75 | |||
76 | -- | ||
77 | 1.9.1 | ||
78 | |||
diff --git a/meta/recipes-kernel/kexec/kexec-tools/0002-kexec-generalize-and-rename-get_kernel_stext_sym.patch b/meta/recipes-kernel/kexec/kexec-tools/0002-kexec-generalize-and-rename-get_kernel_stext_sym.patch new file mode 100644 index 0000000000..953f13bd0a --- /dev/null +++ b/meta/recipes-kernel/kexec/kexec-tools/0002-kexec-generalize-and-rename-get_kernel_stext_sym.patch | |||
@@ -0,0 +1,194 @@ | |||
1 | From d29f37bb6e9114aba96c606103b110f511bee9a1 Mon Sep 17 00:00:00 2001 | ||
2 | From: Pratyush Anand <panand@redhat.com> | ||
3 | Date: Wed, 2 Nov 2016 15:05:25 +0530 | ||
4 | Subject: [PATCH 2/9] kexec: generalize and rename get_kernel_stext_sym() | ||
5 | |||
6 | get_kernel_stext_sym() has been defined for both arm and i386. Other | ||
7 | architecture might need some other kernel symbol address. Therefore rewrite | ||
8 | this function as generic function to get any kernel symbol address. | ||
9 | |||
10 | More over, kallsyms is not arch specific representation, therefore have | ||
11 | common function for all arches. | ||
12 | |||
13 | Upstream-Status: Backport [https://git.linaro.org/people/takahiro.akashi/kexec-tools.git] | ||
14 | |||
15 | Signed-off-by: Pratyush Anand <panand@redhat.com> | ||
16 | [created symbols.c] | ||
17 | Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
18 | Signed-off-by: He Zhe <zhe.he@windriver.com> | ||
19 | --- | ||
20 | kexec/Makefile | 1 + | ||
21 | kexec/arch/arm/crashdump-arm.c | 40 +--------------------------------------- | ||
22 | kexec/arch/i386/crashdump-x86.c | 29 ----------------------------- | ||
23 | kexec/kexec.h | 2 ++ | ||
24 | kexec/symbols.c | 41 +++++++++++++++++++++++++++++++++++++++++ | ||
25 | 5 files changed, 45 insertions(+), 68 deletions(-) | ||
26 | create mode 100644 kexec/symbols.c | ||
27 | |||
28 | diff --git a/kexec/Makefile b/kexec/Makefile | ||
29 | index 39f365f..2b4fb3d 100644 | ||
30 | --- a/kexec/Makefile | ||
31 | +++ b/kexec/Makefile | ||
32 | @@ -26,6 +26,7 @@ KEXEC_SRCS_base += kexec/kernel_version.c | ||
33 | KEXEC_SRCS_base += kexec/lzma.c | ||
34 | KEXEC_SRCS_base += kexec/zlib.c | ||
35 | KEXEC_SRCS_base += kexec/kexec-xen.c | ||
36 | +KEXEC_SRCS_base += kexec/symbols.c | ||
37 | |||
38 | KEXEC_GENERATED_SRCS += $(PURGATORY_HEX_C) | ||
39 | |||
40 | diff --git a/kexec/arch/arm/crashdump-arm.c b/kexec/arch/arm/crashdump-arm.c | ||
41 | index 4a89b5e..245c21a 100644 | ||
42 | --- a/kexec/arch/arm/crashdump-arm.c | ||
43 | +++ b/kexec/arch/arm/crashdump-arm.c | ||
44 | @@ -73,48 +73,10 @@ static struct crash_elf_info elf_info = { | ||
45 | |||
46 | extern unsigned long long user_page_offset; | ||
47 | |||
48 | -/* Retrieve kernel _stext symbol virtual address from /proc/kallsyms */ | ||
49 | -static unsigned long long get_kernel_stext_sym(void) | ||
50 | -{ | ||
51 | - const char *kallsyms = "/proc/kallsyms"; | ||
52 | - const char *stext = "_stext"; | ||
53 | - char sym[128]; | ||
54 | - char line[128]; | ||
55 | - FILE *fp; | ||
56 | - unsigned long long vaddr = 0; | ||
57 | - char type; | ||
58 | - | ||
59 | - fp = fopen(kallsyms, "r"); | ||
60 | - if (!fp) { | ||
61 | - fprintf(stderr, "Cannot open %s\n", kallsyms); | ||
62 | - return 0; | ||
63 | - } | ||
64 | - | ||
65 | - while(fgets(line, sizeof(line), fp) != NULL) { | ||
66 | - unsigned long long addr; | ||
67 | - | ||
68 | - if (sscanf(line, "%Lx %c %s", &addr, &type, sym) != 3) | ||
69 | - continue; | ||
70 | - | ||
71 | - if (strcmp(sym, stext) == 0) { | ||
72 | - dbgprintf("kernel symbol %s vaddr = %#llx\n", stext, addr); | ||
73 | - vaddr = addr; | ||
74 | - break; | ||
75 | - } | ||
76 | - } | ||
77 | - | ||
78 | - fclose(fp); | ||
79 | - | ||
80 | - if (vaddr == 0) | ||
81 | - fprintf(stderr, "Cannot get kernel %s symbol address\n", stext); | ||
82 | - | ||
83 | - return vaddr; | ||
84 | -} | ||
85 | - | ||
86 | static int get_kernel_page_offset(struct kexec_info *info, | ||
87 | struct crash_elf_info *elf_info) | ||
88 | { | ||
89 | - unsigned long long stext_sym_addr = get_kernel_stext_sym(); | ||
90 | + unsigned long long stext_sym_addr = get_kernel_sym("_stext"); | ||
91 | if (stext_sym_addr == 0) { | ||
92 | if (user_page_offset != (-1ULL)) { | ||
93 | elf_info->page_offset = user_page_offset; | ||
94 | diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c | ||
95 | index ab833d4..abf82a5 100644 | ||
96 | --- a/kexec/arch/i386/crashdump-x86.c | ||
97 | +++ b/kexec/arch/i386/crashdump-x86.c | ||
98 | @@ -102,35 +102,6 @@ static int get_kernel_paddr(struct kexec_info *UNUSED(info), | ||
99 | return -1; | ||
100 | } | ||
101 | |||
102 | -/* Retrieve kernel symbol virtual address from /proc/kallsyms */ | ||
103 | -static unsigned long long get_kernel_sym(const char *symbol) | ||
104 | -{ | ||
105 | - const char *kallsyms = "/proc/kallsyms"; | ||
106 | - char sym[128]; | ||
107 | - char line[128]; | ||
108 | - FILE *fp; | ||
109 | - unsigned long long vaddr; | ||
110 | - char type; | ||
111 | - | ||
112 | - fp = fopen(kallsyms, "r"); | ||
113 | - if (!fp) { | ||
114 | - fprintf(stderr, "Cannot open %s\n", kallsyms); | ||
115 | - return 0; | ||
116 | - } | ||
117 | - | ||
118 | - while(fgets(line, sizeof(line), fp) != NULL) { | ||
119 | - if (sscanf(line, "%Lx %c %s", &vaddr, &type, sym) != 3) | ||
120 | - continue; | ||
121 | - if (strcmp(sym, symbol) == 0) { | ||
122 | - dbgprintf("kernel symbol %s vaddr = %16llx\n", symbol, vaddr); | ||
123 | - return vaddr; | ||
124 | - } | ||
125 | - } | ||
126 | - | ||
127 | - fprintf(stderr, "Cannot get kernel %s symbol address\n", symbol); | ||
128 | - return 0; | ||
129 | -} | ||
130 | - | ||
131 | /* Retrieve info regarding virtual address kernel has been compiled for and | ||
132 | * size of the kernel from /proc/kcore. Current /proc/kcore parsing from | ||
133 | * from kexec-tools fails because of malformed elf notes. A kernel patch has | ||
134 | diff --git a/kexec/kexec.h b/kexec/kexec.h | ||
135 | index 9194f1c..b4fafad 100644 | ||
136 | --- a/kexec/kexec.h | ||
137 | +++ b/kexec/kexec.h | ||
138 | @@ -312,4 +312,6 @@ int xen_kexec_load(struct kexec_info *info); | ||
139 | int xen_kexec_unload(uint64_t kexec_flags); | ||
140 | void xen_kexec_exec(void); | ||
141 | |||
142 | +extern unsigned long long get_kernel_sym(const char *text); | ||
143 | + | ||
144 | #endif /* KEXEC_H */ | ||
145 | diff --git a/kexec/symbols.c b/kexec/symbols.c | ||
146 | new file mode 100644 | ||
147 | index 0000000..ea6e327 | ||
148 | --- /dev/null | ||
149 | +++ b/kexec/symbols.c | ||
150 | @@ -0,0 +1,41 @@ | ||
151 | +#include <stdio.h> | ||
152 | +#include <string.h> | ||
153 | +#include "kexec.h" | ||
154 | + | ||
155 | +/* Retrieve kernel symbol virtual address from /proc/kallsyms */ | ||
156 | +unsigned long long get_kernel_sym(const char *text) | ||
157 | +{ | ||
158 | + const char *kallsyms = "/proc/kallsyms"; | ||
159 | + char sym[128]; | ||
160 | + char line[128]; | ||
161 | + FILE *fp; | ||
162 | + unsigned long long vaddr = 0; | ||
163 | + char type; | ||
164 | + | ||
165 | + fp = fopen(kallsyms, "r"); | ||
166 | + if (!fp) { | ||
167 | + fprintf(stderr, "Cannot open %s\n", kallsyms); | ||
168 | + return 0; | ||
169 | + } | ||
170 | + | ||
171 | + while (fgets(line, sizeof(line), fp) != NULL) { | ||
172 | + unsigned long long addr; | ||
173 | + | ||
174 | + if (sscanf(line, "%Lx %c %s", &addr, &type, sym) != 3) | ||
175 | + continue; | ||
176 | + | ||
177 | + if (strcmp(sym, text) == 0) { | ||
178 | + dbgprintf("kernel symbol %s vaddr = %#llx\n", | ||
179 | + text, addr); | ||
180 | + vaddr = addr; | ||
181 | + break; | ||
182 | + } | ||
183 | + } | ||
184 | + | ||
185 | + fclose(fp); | ||
186 | + | ||
187 | + if (vaddr == 0) | ||
188 | + fprintf(stderr, "Cannot get kernel %s symbol address\n", text); | ||
189 | + | ||
190 | + return vaddr; | ||
191 | +} | ||
192 | -- | ||
193 | 1.9.1 | ||
194 | |||
diff --git a/meta/recipes-kernel/kexec/kexec-tools/0003-arm64-identify-PHYS_OFFSET-correctly.patch b/meta/recipes-kernel/kexec/kexec-tools/0003-arm64-identify-PHYS_OFFSET-correctly.patch new file mode 100644 index 0000000000..1a1c317436 --- /dev/null +++ b/meta/recipes-kernel/kexec/kexec-tools/0003-arm64-identify-PHYS_OFFSET-correctly.patch | |||
@@ -0,0 +1,76 @@ | |||
1 | From 16df170ad4808d12acd5e919ac4f6e7f33a247b3 Mon Sep 17 00:00:00 2001 | ||
2 | From: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
3 | Date: Thu, 1 Sep 2016 10:57:42 +0900 | ||
4 | Subject: [PATCH 3/9] arm64: identify PHYS_OFFSET correctly | ||
5 | |||
6 | Due to the kernel patch, commit e7cd190385d1 ("arm64: mark reserved | ||
7 | memblock regions explicitly in iomem"), the current code will not be able | ||
8 | to identify the correct value of PHYS_OFFSET if some "reserved" memory | ||
9 | region, which is likely to be UEFI runtime services code/data, exists at | ||
10 | an address below the first "System RAM" regions. | ||
11 | |||
12 | This patch fixes this issue. | ||
13 | |||
14 | Upstream-Status: Backport [https://git.linaro.org/people/takahiro.akashi/kexec-tools.git] | ||
15 | |||
16 | Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
17 | Signed-off-by: He Zhe <zhe.he@windriver.com> | ||
18 | --- | ||
19 | kexec/arch/arm64/iomem.h | 7 +++++++ | ||
20 | kexec/arch/arm64/kexec-arm64.c | 12 ++++++++++-- | ||
21 | 2 files changed, 17 insertions(+), 2 deletions(-) | ||
22 | create mode 100644 kexec/arch/arm64/iomem.h | ||
23 | |||
24 | diff --git a/kexec/arch/arm64/iomem.h b/kexec/arch/arm64/iomem.h | ||
25 | new file mode 100644 | ||
26 | index 0000000..7fd66eb | ||
27 | --- /dev/null | ||
28 | +++ b/kexec/arch/arm64/iomem.h | ||
29 | @@ -0,0 +1,7 @@ | ||
30 | +#ifndef IOMEM_H | ||
31 | +#define IOMEM_H | ||
32 | + | ||
33 | +#define SYSTEM_RAM "System RAM\n" | ||
34 | +#define IOMEM_RESERVED "reserved\n" | ||
35 | + | ||
36 | +#endif | ||
37 | diff --git a/kexec/arch/arm64/kexec-arm64.c b/kexec/arch/arm64/kexec-arm64.c | ||
38 | index 2e8839a..8ac811d 100644 | ||
39 | --- a/kexec/arch/arm64/kexec-arm64.c | ||
40 | +++ b/kexec/arch/arm64/kexec-arm64.c | ||
41 | @@ -21,6 +21,7 @@ | ||
42 | #include "crashdump-arm64.h" | ||
43 | #include "dt-ops.h" | ||
44 | #include "fs2dt.h" | ||
45 | +#include "iomem.h" | ||
46 | #include "kexec-syscall.h" | ||
47 | #include "arch/options.h" | ||
48 | |||
49 | @@ -475,7 +476,14 @@ static int get_memory_ranges_iomem_cb(void *data, int nr, char *str, | ||
50 | return -1; | ||
51 | |||
52 | r = (struct memory_range *)data + nr; | ||
53 | - r->type = RANGE_RAM; | ||
54 | + | ||
55 | + if (!strncmp(str, SYSTEM_RAM, strlen(SYSTEM_RAM))) | ||
56 | + r->type = RANGE_RAM; | ||
57 | + else if (!strncmp(str, IOMEM_RESERVED, strlen(IOMEM_RESERVED))) | ||
58 | + r->type = RANGE_RESERVED; | ||
59 | + else | ||
60 | + return 1; | ||
61 | + | ||
62 | r->start = base; | ||
63 | r->end = base + length - 1; | ||
64 | |||
65 | @@ -494,7 +502,7 @@ static int get_memory_ranges_iomem_cb(void *data, int nr, char *str, | ||
66 | static int get_memory_ranges_iomem(struct memory_range *array, | ||
67 | unsigned int *count) | ||
68 | { | ||
69 | - *count = kexec_iomem_for_each_line("System RAM\n", | ||
70 | + *count = kexec_iomem_for_each_line(NULL, | ||
71 | get_memory_ranges_iomem_cb, array); | ||
72 | |||
73 | if (!*count) { | ||
74 | -- | ||
75 | 1.9.1 | ||
76 | |||
diff --git a/meta/recipes-kernel/kexec/kexec-tools/0004-arm64-kdump-identify-memory-regions.patch b/meta/recipes-kernel/kexec/kexec-tools/0004-arm64-kdump-identify-memory-regions.patch new file mode 100644 index 0000000000..66600f3070 --- /dev/null +++ b/meta/recipes-kernel/kexec/kexec-tools/0004-arm64-kdump-identify-memory-regions.patch | |||
@@ -0,0 +1,202 @@ | |||
1 | From 48a4c7874d8264ddbfaec2e9858d7866a2d2eb60 Mon Sep 17 00:00:00 2001 | ||
2 | From: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
3 | Date: Wed, 5 Aug 2015 13:16:30 +0900 | ||
4 | Subject: [PATCH 4/9] arm64: kdump: identify memory regions | ||
5 | |||
6 | The following regions need to be identified for later use: | ||
7 | a) memory regions which belong to the 1st kernel | ||
8 | b) usable memory reserved for crash dump kernel | ||
9 | |||
10 | We go through /proc/iomem to find out a) and b) which are marked | ||
11 | as "System RAM" and "Crash kernel", respectively. | ||
12 | |||
13 | Upstream-Status: Backport [https://git.linaro.org/people/takahiro.akashi/kexec-tools.git] | ||
14 | |||
15 | Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
16 | Signed-off-by: He Zhe <zhe.he@windriver.com> | ||
17 | --- | ||
18 | kexec/arch/arm64/Makefile | 2 + | ||
19 | kexec/arch/arm64/crashdump-arm64.c | 100 ++++++++++++++++++++++++++++++++++++- | ||
20 | kexec/arch/arm64/crashdump-arm64.h | 14 +++++- | ||
21 | kexec/arch/arm64/iomem.h | 1 + | ||
22 | 4 files changed, 114 insertions(+), 3 deletions(-) | ||
23 | |||
24 | diff --git a/kexec/arch/arm64/Makefile b/kexec/arch/arm64/Makefile | ||
25 | index 74b677f..2d4ae0e 100644 | ||
26 | --- a/kexec/arch/arm64/Makefile | ||
27 | +++ b/kexec/arch/arm64/Makefile | ||
28 | @@ -6,6 +6,8 @@ arm64_FS2DT_INCLUDE += \ | ||
29 | |||
30 | arm64_DT_OPS += kexec/dt-ops.c | ||
31 | |||
32 | +arm64_MEM_REGIONS = kexec/mem_regions.c | ||
33 | + | ||
34 | arm64_CPPFLAGS += -I $(srcdir)/kexec/ | ||
35 | |||
36 | arm64_KEXEC_SRCS += \ | ||
37 | diff --git a/kexec/arch/arm64/crashdump-arm64.c b/kexec/arch/arm64/crashdump-arm64.c | ||
38 | index d2272c8..dcaca43 100644 | ||
39 | --- a/kexec/arch/arm64/crashdump-arm64.c | ||
40 | +++ b/kexec/arch/arm64/crashdump-arm64.c | ||
41 | @@ -1,5 +1,13 @@ | ||
42 | /* | ||
43 | * ARM64 crashdump. | ||
44 | + * partly derived from arm implementation | ||
45 | + * | ||
46 | + * Copyright (c) 2014-2016 Linaro Limited | ||
47 | + * Author: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
48 | + * | ||
49 | + * This program is free software; you can redistribute it and/or modify | ||
50 | + * it under the terms of the GNU General Public License version 2 as | ||
51 | + * published by the Free Software Foundation. | ||
52 | */ | ||
53 | |||
54 | #define _GNU_SOURCE | ||
55 | @@ -10,12 +18,102 @@ | ||
56 | #include "kexec.h" | ||
57 | #include "crashdump.h" | ||
58 | #include "crashdump-arm64.h" | ||
59 | +#include "iomem.h" | ||
60 | #include "kexec-arm64.h" | ||
61 | #include "kexec-elf.h" | ||
62 | +#include "mem_regions.h" | ||
63 | |||
64 | -struct memory_ranges usablemem_rgns = {}; | ||
65 | +/* memory ranges on crashed kernel */ | ||
66 | +static struct memory_range crash_memory_ranges[CRASH_MAX_MEMORY_RANGES]; | ||
67 | +static struct memory_ranges crash_memory_rgns = { | ||
68 | + .size = 0, | ||
69 | + .max_size = CRASH_MAX_MEMORY_RANGES, | ||
70 | + .ranges = crash_memory_ranges, | ||
71 | +}; | ||
72 | + | ||
73 | +/* memory range reserved for crashkernel */ | ||
74 | +struct memory_range crash_reserved_mem; | ||
75 | +struct memory_ranges usablemem_rgns = { | ||
76 | + .size = 0, | ||
77 | + .max_size = 1, | ||
78 | + .ranges = &crash_reserved_mem, | ||
79 | +}; | ||
80 | + | ||
81 | +/* | ||
82 | + * iomem_range_callback() - callback called for each iomem region | ||
83 | + * @data: not used | ||
84 | + * @nr: not used | ||
85 | + * @str: name of the memory region | ||
86 | + * @base: start address of the memory region | ||
87 | + * @length: size of the memory region | ||
88 | + * | ||
89 | + * This function is called once for each memory region found in /proc/iomem. | ||
90 | + * It locates system RAM and crashkernel reserved memory and places these to | ||
91 | + * variables, respectively, crash_memory_ranges and crash_reserved_mem. | ||
92 | + */ | ||
93 | + | ||
94 | +static int iomem_range_callback(void *UNUSED(data), int UNUSED(nr), | ||
95 | + char *str, unsigned long long base, | ||
96 | + unsigned long long length) | ||
97 | +{ | ||
98 | + if (strncmp(str, CRASH_KERNEL, strlen(CRASH_KERNEL)) == 0) | ||
99 | + return mem_regions_add(&usablemem_rgns, | ||
100 | + base, length, RANGE_RAM); | ||
101 | + else if (strncmp(str, SYSTEM_RAM, strlen(SYSTEM_RAM)) == 0) | ||
102 | + return mem_regions_add(&crash_memory_rgns, | ||
103 | + base, length, RANGE_RAM); | ||
104 | + | ||
105 | + return 0; | ||
106 | +} | ||
107 | |||
108 | int is_crashkernel_mem_reserved(void) | ||
109 | { | ||
110 | + if (!crash_reserved_mem.end) | ||
111 | + kexec_iomem_for_each_line(NULL, iomem_range_callback, NULL); | ||
112 | + | ||
113 | + return crash_reserved_mem.start != crash_reserved_mem.end; | ||
114 | +} | ||
115 | + | ||
116 | +/* | ||
117 | + * crash_get_memory_ranges() - read system physical memory | ||
118 | + * | ||
119 | + * Function reads through system physical memory and stores found memory | ||
120 | + * regions in crash_memory_ranges. | ||
121 | + * Regions are sorted in ascending order. | ||
122 | + * | ||
123 | + * Returns 0 in case of success and -1 otherwise (errno is set). | ||
124 | + */ | ||
125 | +static int crash_get_memory_ranges(void) | ||
126 | +{ | ||
127 | + /* | ||
128 | + * First read all memory regions that can be considered as | ||
129 | + * system memory including the crash area. | ||
130 | + */ | ||
131 | + if (!usablemem_rgns.size) | ||
132 | + kexec_iomem_for_each_line(NULL, iomem_range_callback, NULL); | ||
133 | + | ||
134 | + /* allow only a single region for crash dump kernel */ | ||
135 | + if (usablemem_rgns.size != 1) { | ||
136 | + errno = EINVAL; | ||
137 | + return -1; | ||
138 | + } | ||
139 | + | ||
140 | + dbgprint_mem_range("Reserved memory range", &crash_reserved_mem, 1); | ||
141 | + | ||
142 | + if (mem_regions_exclude(&crash_memory_rgns, &crash_reserved_mem)) { | ||
143 | + fprintf(stderr, | ||
144 | + "Error: Number of crash memory ranges excedeed the max limit\n"); | ||
145 | + errno = ENOMEM; | ||
146 | + return -1; | ||
147 | + } | ||
148 | + | ||
149 | + /* | ||
150 | + * Make sure that the memory regions are sorted. | ||
151 | + */ | ||
152 | + mem_regions_sort(&crash_memory_rgns); | ||
153 | + | ||
154 | + dbgprint_mem_range("Coredump memory ranges", | ||
155 | + crash_memory_rgns.ranges, crash_memory_rgns.size); | ||
156 | + | ||
157 | return 0; | ||
158 | } | ||
159 | diff --git a/kexec/arch/arm64/crashdump-arm64.h b/kexec/arch/arm64/crashdump-arm64.h | ||
160 | index f33c7a2..07a0ed0 100644 | ||
161 | --- a/kexec/arch/arm64/crashdump-arm64.h | ||
162 | +++ b/kexec/arch/arm64/crashdump-arm64.h | ||
163 | @@ -1,12 +1,22 @@ | ||
164 | /* | ||
165 | * ARM64 crashdump. | ||
166 | + * | ||
167 | + * Copyright (c) 2014-2016 Linaro Limited | ||
168 | + * Author: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
169 | + * | ||
170 | + * This program is free software; you can redistribute it and/or modify | ||
171 | + * it under the terms of the GNU General Public License version 2 as | ||
172 | + * published by the Free Software Foundation. | ||
173 | */ | ||
174 | |||
175 | -#if !defined(CRASHDUMP_ARM64_H) | ||
176 | +#ifndef CRASHDUMP_ARM64_H | ||
177 | #define CRASHDUMP_ARM64_H | ||
178 | |||
179 | #include "kexec.h" | ||
180 | |||
181 | +#define CRASH_MAX_MEMORY_RANGES 32 | ||
182 | + | ||
183 | extern struct memory_ranges usablemem_rgns; | ||
184 | +extern struct memory_range crash_reserved_mem; | ||
185 | |||
186 | -#endif | ||
187 | +#endif /* CRASHDUMP_ARM64_H */ | ||
188 | diff --git a/kexec/arch/arm64/iomem.h b/kexec/arch/arm64/iomem.h | ||
189 | index 7fd66eb..20cda87 100644 | ||
190 | --- a/kexec/arch/arm64/iomem.h | ||
191 | +++ b/kexec/arch/arm64/iomem.h | ||
192 | @@ -2,6 +2,7 @@ | ||
193 | #define IOMEM_H | ||
194 | |||
195 | #define SYSTEM_RAM "System RAM\n" | ||
196 | +#define CRASH_KERNEL "Crash kernel\n" | ||
197 | #define IOMEM_RESERVED "reserved\n" | ||
198 | |||
199 | #endif | ||
200 | -- | ||
201 | 1.9.1 | ||
202 | |||
diff --git a/meta/recipes-kernel/kexec/kexec-tools/0005-arm64-kdump-add-elf-core-header-segment.patch b/meta/recipes-kernel/kexec/kexec-tools/0005-arm64-kdump-add-elf-core-header-segment.patch new file mode 100644 index 0000000000..fe535b6070 --- /dev/null +++ b/meta/recipes-kernel/kexec/kexec-tools/0005-arm64-kdump-add-elf-core-header-segment.patch | |||
@@ -0,0 +1,191 @@ | |||
1 | From 769da25627cebb2a53caee5d5be78a32d376adc1 Mon Sep 17 00:00:00 2001 | ||
2 | From: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
3 | Date: Wed, 5 Aug 2015 13:45:15 +0900 | ||
4 | Subject: [PATCH 5/9] arm64: kdump: add elf core header segment | ||
5 | |||
6 | Elf core header contains the information necessary for the coredump of | ||
7 | the 1st kernel, including its physcal memory layout as well as cpu register | ||
8 | states at the panic. | ||
9 | The segment is allocated inside the reserved memory of crash dump kernel. | ||
10 | |||
11 | Upstream-Status: Backport [https://git.linaro.org/people/takahiro.akashi/kexec-tools.git] | ||
12 | |||
13 | Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
14 | Signed-off-by: He Zhe <zhe.he@windriver.com> | ||
15 | --- | ||
16 | kexec/arch/arm64/crashdump-arm64.c | 96 ++++++++++++++++++++++++++++++++++++++ | ||
17 | kexec/arch/arm64/crashdump-arm64.h | 3 ++ | ||
18 | kexec/arch/arm64/iomem.h | 2 + | ||
19 | kexec/arch/arm64/kexec-elf-arm64.c | 10 ++++ | ||
20 | 4 files changed, 111 insertions(+) | ||
21 | |||
22 | diff --git a/kexec/arch/arm64/crashdump-arm64.c b/kexec/arch/arm64/crashdump-arm64.c | ||
23 | index dcaca43..8346131 100644 | ||
24 | --- a/kexec/arch/arm64/crashdump-arm64.c | ||
25 | +++ b/kexec/arch/arm64/crashdump-arm64.c | ||
26 | @@ -39,6 +39,39 @@ struct memory_ranges usablemem_rgns = { | ||
27 | .ranges = &crash_reserved_mem, | ||
28 | }; | ||
29 | |||
30 | +struct memory_range elfcorehdr_mem; | ||
31 | + | ||
32 | +static struct crash_elf_info elf_info = { | ||
33 | + .class = ELFCLASS64, | ||
34 | +#if (__BYTE_ORDER == __LITTLE_ENDIAN) | ||
35 | + .data = ELFDATA2LSB, | ||
36 | +#else | ||
37 | + .data = ELFDATA2MSB, | ||
38 | +#endif | ||
39 | + .machine = EM_AARCH64, | ||
40 | +}; | ||
41 | + | ||
42 | +/* | ||
43 | + * Note: The returned value is correct only if !CONFIG_RANDOMIZE_BASE. | ||
44 | + */ | ||
45 | +static uint64_t get_kernel_page_offset(void) | ||
46 | +{ | ||
47 | + int i; | ||
48 | + | ||
49 | + if (elf_info.kern_vaddr_start == UINT64_MAX) | ||
50 | + return UINT64_MAX; | ||
51 | + | ||
52 | + /* Current max virtual memory range is 48-bits. */ | ||
53 | + for (i = 48; i > 0; i--) | ||
54 | + if (!(elf_info.kern_vaddr_start & (1UL << i))) | ||
55 | + break; | ||
56 | + | ||
57 | + if (i <= 0) | ||
58 | + return UINT64_MAX; | ||
59 | + else | ||
60 | + return UINT64_MAX << i; | ||
61 | +} | ||
62 | + | ||
63 | /* | ||
64 | * iomem_range_callback() - callback called for each iomem region | ||
65 | * @data: not used | ||
66 | @@ -62,6 +95,10 @@ static int iomem_range_callback(void *UNUSED(data), int UNUSED(nr), | ||
67 | else if (strncmp(str, SYSTEM_RAM, strlen(SYSTEM_RAM)) == 0) | ||
68 | return mem_regions_add(&crash_memory_rgns, | ||
69 | base, length, RANGE_RAM); | ||
70 | + else if (strncmp(str, KERNEL_CODE, strlen(KERNEL_CODE)) == 0) | ||
71 | + elf_info.kern_paddr_start = base; | ||
72 | + else if (strncmp(str, KERNEL_DATA, strlen(KERNEL_DATA)) == 0) | ||
73 | + elf_info.kern_size = base + length - elf_info.kern_paddr_start; | ||
74 | |||
75 | return 0; | ||
76 | } | ||
77 | @@ -115,5 +152,64 @@ static int crash_get_memory_ranges(void) | ||
78 | dbgprint_mem_range("Coredump memory ranges", | ||
79 | crash_memory_rgns.ranges, crash_memory_rgns.size); | ||
80 | |||
81 | + /* | ||
82 | + * For additional kernel code/data segment. | ||
83 | + * kern_paddr_start/kern_size are determined in iomem_range_callback | ||
84 | + */ | ||
85 | + elf_info.kern_vaddr_start = get_kernel_sym("_text"); | ||
86 | + if (!elf_info.kern_vaddr_start) | ||
87 | + elf_info.kern_vaddr_start = UINT64_MAX; | ||
88 | + | ||
89 | + return 0; | ||
90 | +} | ||
91 | + | ||
92 | +/* | ||
93 | + * load_crashdump_segments() - load the elf core header | ||
94 | + * @info: kexec info structure | ||
95 | + * | ||
96 | + * This function creates and loads an additional segment of elf core header | ||
97 | + : which is used to construct /proc/vmcore on crash dump kernel. | ||
98 | + * | ||
99 | + * Return 0 in case of success and -1 in case of error. | ||
100 | + */ | ||
101 | + | ||
102 | +int load_crashdump_segments(struct kexec_info *info) | ||
103 | +{ | ||
104 | + unsigned long elfcorehdr; | ||
105 | + unsigned long bufsz; | ||
106 | + void *buf; | ||
107 | + int err; | ||
108 | + | ||
109 | + /* | ||
110 | + * First fetch all the memory (RAM) ranges that we are going to | ||
111 | + * pass to the crash dump kernel during panic. | ||
112 | + */ | ||
113 | + | ||
114 | + err = crash_get_memory_ranges(); | ||
115 | + | ||
116 | + if (err) | ||
117 | + return err; | ||
118 | + | ||
119 | + elf_info.page_offset = get_kernel_page_offset(); | ||
120 | + dbgprintf("%s: page_offset: %016llx\n", __func__, | ||
121 | + elf_info.page_offset); | ||
122 | + | ||
123 | + err = crash_create_elf64_headers(info, &elf_info, | ||
124 | + crash_memory_rgns.ranges, crash_memory_rgns.size, | ||
125 | + &buf, &bufsz, ELF_CORE_HEADER_ALIGN); | ||
126 | + | ||
127 | + if (err) | ||
128 | + return err; | ||
129 | + | ||
130 | + elfcorehdr = add_buffer_phys_virt(info, buf, bufsz, bufsz, 0, | ||
131 | + crash_reserved_mem.start, crash_reserved_mem.end, | ||
132 | + -1, 0); | ||
133 | + | ||
134 | + elfcorehdr_mem.start = elfcorehdr; | ||
135 | + elfcorehdr_mem.end = elfcorehdr + bufsz - 1; | ||
136 | + | ||
137 | + dbgprintf("%s: elfcorehdr 0x%llx-0x%llx\n", __func__, | ||
138 | + elfcorehdr_mem.start, elfcorehdr_mem.end); | ||
139 | + | ||
140 | return 0; | ||
141 | } | ||
142 | diff --git a/kexec/arch/arm64/crashdump-arm64.h b/kexec/arch/arm64/crashdump-arm64.h | ||
143 | index 07a0ed0..da75a2d 100644 | ||
144 | --- a/kexec/arch/arm64/crashdump-arm64.h | ||
145 | +++ b/kexec/arch/arm64/crashdump-arm64.h | ||
146 | @@ -18,5 +18,8 @@ | ||
147 | |||
148 | extern struct memory_ranges usablemem_rgns; | ||
149 | extern struct memory_range crash_reserved_mem; | ||
150 | +extern struct memory_range elfcorehdr_mem; | ||
151 | + | ||
152 | +extern int load_crashdump_segments(struct kexec_info *info); | ||
153 | |||
154 | #endif /* CRASHDUMP_ARM64_H */ | ||
155 | diff --git a/kexec/arch/arm64/iomem.h b/kexec/arch/arm64/iomem.h | ||
156 | index 20cda87..d4864bb 100644 | ||
157 | --- a/kexec/arch/arm64/iomem.h | ||
158 | +++ b/kexec/arch/arm64/iomem.h | ||
159 | @@ -2,6 +2,8 @@ | ||
160 | #define IOMEM_H | ||
161 | |||
162 | #define SYSTEM_RAM "System RAM\n" | ||
163 | +#define KERNEL_CODE "Kernel code\n" | ||
164 | +#define KERNEL_DATA "Kernel data\n" | ||
165 | #define CRASH_KERNEL "Crash kernel\n" | ||
166 | #define IOMEM_RESERVED "reserved\n" | ||
167 | |||
168 | diff --git a/kexec/arch/arm64/kexec-elf-arm64.c b/kexec/arch/arm64/kexec-elf-arm64.c | ||
169 | index daf8bf0..c70a37a 100644 | ||
170 | --- a/kexec/arch/arm64/kexec-elf-arm64.c | ||
171 | +++ b/kexec/arch/arm64/kexec-elf-arm64.c | ||
172 | @@ -119,6 +119,16 @@ int elf_arm64_load(int argc, char **argv, const char *kernel_buf, | ||
173 | dbgprintf("%s: PE format: %s\n", __func__, | ||
174 | (arm64_header_check_pe_sig(header) ? "yes" : "no")); | ||
175 | |||
176 | + if (info->kexec_flags & KEXEC_ON_CRASH) { | ||
177 | + /* create and initialize elf core header segment */ | ||
178 | + result = load_crashdump_segments(info); | ||
179 | + if (result) { | ||
180 | + dbgprintf("%s: Creating eflcorehdr failed.\n", | ||
181 | + __func__); | ||
182 | + goto exit; | ||
183 | + } | ||
184 | + } | ||
185 | + | ||
186 | /* load the kernel */ | ||
187 | result = elf_exec_load(&ehdr, info); | ||
188 | |||
189 | -- | ||
190 | 1.9.1 | ||
191 | |||
diff --git a/meta/recipes-kernel/kexec/kexec-tools/0006-arm64-kdump-set-up-kernel-image-segment.patch b/meta/recipes-kernel/kexec/kexec-tools/0006-arm64-kdump-set-up-kernel-image-segment.patch new file mode 100644 index 0000000000..414955107a --- /dev/null +++ b/meta/recipes-kernel/kexec/kexec-tools/0006-arm64-kdump-set-up-kernel-image-segment.patch | |||
@@ -0,0 +1,137 @@ | |||
1 | From 4079c93ac5453ef5f7889ab64920c1e9427690ef Mon Sep 17 00:00:00 2001 | ||
2 | From: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
3 | Date: Tue, 17 Feb 2015 16:06:55 +0900 | ||
4 | Subject: [PATCH 6/9] arm64: kdump: set up kernel image segment | ||
5 | |||
6 | On arm64, we can use the same kernel image as 1st kernel, but | ||
7 | we have to modify the entry point as well as segments' addresses | ||
8 | in the kernel's elf header in order to load them into correct places. | ||
9 | |||
10 | Upstream-Status: Backport [https://git.linaro.org/people/takahiro.akashi/kexec-tools.git] | ||
11 | |||
12 | Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
13 | Signed-off-by: He Zhe <zhe.he@windriver.com> | ||
14 | --- | ||
15 | kexec/arch/arm64/crashdump-arm64.c | 23 +++++++++++++++++++++++ | ||
16 | kexec/arch/arm64/crashdump-arm64.h | 1 + | ||
17 | kexec/arch/arm64/kexec-arm64.c | 25 ++++++++++++++++++++----- | ||
18 | kexec/arch/arm64/kexec-elf-arm64.c | 10 +++++++++- | ||
19 | 4 files changed, 53 insertions(+), 6 deletions(-) | ||
20 | |||
21 | diff --git a/kexec/arch/arm64/crashdump-arm64.c b/kexec/arch/arm64/crashdump-arm64.c | ||
22 | index 8346131..9517329 100644 | ||
23 | --- a/kexec/arch/arm64/crashdump-arm64.c | ||
24 | +++ b/kexec/arch/arm64/crashdump-arm64.c | ||
25 | @@ -213,3 +213,26 @@ int load_crashdump_segments(struct kexec_info *info) | ||
26 | |||
27 | return 0; | ||
28 | } | ||
29 | + | ||
30 | +/* | ||
31 | + * e_entry and p_paddr are actually in virtual address space. | ||
32 | + * Those values will be translated to physcal addresses by | ||
33 | + * using virt_to_phys(). | ||
34 | + * So let's get ready for later use so the memory base (phys_offset) | ||
35 | + * will be correctly replaced with crash_reserved_mem.start. | ||
36 | + */ | ||
37 | +void modify_ehdr_for_crashdump(struct mem_ehdr *ehdr) | ||
38 | +{ | ||
39 | + struct mem_phdr *phdr; | ||
40 | + int i; | ||
41 | + | ||
42 | + ehdr->e_entry += - arm64_mem.phys_offset + crash_reserved_mem.start; | ||
43 | + | ||
44 | + for (i = 0; i < ehdr->e_phnum; i++) { | ||
45 | + phdr = &ehdr->e_phdr[i]; | ||
46 | + if (phdr->p_type != PT_LOAD) | ||
47 | + continue; | ||
48 | + phdr->p_paddr += | ||
49 | + (-arm64_mem.phys_offset + crash_reserved_mem.start); | ||
50 | + } | ||
51 | +} | ||
52 | diff --git a/kexec/arch/arm64/crashdump-arm64.h b/kexec/arch/arm64/crashdump-arm64.h | ||
53 | index da75a2d..382f571 100644 | ||
54 | --- a/kexec/arch/arm64/crashdump-arm64.h | ||
55 | +++ b/kexec/arch/arm64/crashdump-arm64.h | ||
56 | @@ -21,5 +21,6 @@ extern struct memory_range crash_reserved_mem; | ||
57 | extern struct memory_range elfcorehdr_mem; | ||
58 | |||
59 | extern int load_crashdump_segments(struct kexec_info *info); | ||
60 | +extern void modify_ehdr_for_crashdump(struct mem_ehdr *ehdr); | ||
61 | |||
62 | #endif /* CRASHDUMP_ARM64_H */ | ||
63 | diff --git a/kexec/arch/arm64/kexec-arm64.c b/kexec/arch/arm64/kexec-arm64.c | ||
64 | index 8ac811d..cec4e41 100644 | ||
65 | --- a/kexec/arch/arm64/kexec-arm64.c | ||
66 | +++ b/kexec/arch/arm64/kexec-arm64.c | ||
67 | @@ -307,12 +307,27 @@ unsigned long arm64_locate_kernel_segment(struct kexec_info *info) | ||
68 | { | ||
69 | unsigned long hole; | ||
70 | |||
71 | - hole = locate_hole(info, | ||
72 | - arm64_mem.text_offset + arm64_mem.image_size, | ||
73 | - MiB(2), 0, ULONG_MAX, 1); | ||
74 | + if (info->kexec_flags & KEXEC_ON_CRASH) { | ||
75 | + unsigned long hole_end; | ||
76 | + | ||
77 | + hole = (crash_reserved_mem.start < mem_min ? | ||
78 | + mem_min : crash_reserved_mem.start); | ||
79 | + hole = _ALIGN_UP(hole, MiB(2)); | ||
80 | + hole_end = hole + arm64_mem.text_offset + arm64_mem.image_size; | ||
81 | + | ||
82 | + if ((hole_end > mem_max) || | ||
83 | + (hole_end > crash_reserved_mem.end)) { | ||
84 | + dbgprintf("%s: Crash kernel out of range\n", __func__); | ||
85 | + hole = ULONG_MAX; | ||
86 | + } | ||
87 | + } else { | ||
88 | + hole = locate_hole(info, | ||
89 | + arm64_mem.text_offset + arm64_mem.image_size, | ||
90 | + MiB(2), 0, ULONG_MAX, 1); | ||
91 | |||
92 | - if (hole == ULONG_MAX) | ||
93 | - dbgprintf("%s: locate_hole failed\n", __func__); | ||
94 | + if (hole == ULONG_MAX) | ||
95 | + dbgprintf("%s: locate_hole failed\n", __func__); | ||
96 | + } | ||
97 | |||
98 | return hole; | ||
99 | } | ||
100 | diff --git a/kexec/arch/arm64/kexec-elf-arm64.c b/kexec/arch/arm64/kexec-elf-arm64.c | ||
101 | index c70a37a..842ce21 100644 | ||
102 | --- a/kexec/arch/arm64/kexec-elf-arm64.c | ||
103 | +++ b/kexec/arch/arm64/kexec-elf-arm64.c | ||
104 | @@ -9,6 +9,7 @@ | ||
105 | #include <stdlib.h> | ||
106 | #include <linux/elf.h> | ||
107 | |||
108 | +#include "crashdump-arm64.h" | ||
109 | #include "kexec-arm64.h" | ||
110 | #include "kexec-elf.h" | ||
111 | #include "kexec-syscall.h" | ||
112 | @@ -105,7 +106,8 @@ int elf_arm64_load(int argc, char **argv, const char *kernel_buf, | ||
113 | } | ||
114 | |||
115 | arm64_mem.vp_offset = _ALIGN_DOWN(ehdr.e_entry, MiB(2)); | ||
116 | - arm64_mem.vp_offset -= kernel_segment - get_phys_offset(); | ||
117 | + if (!(info->kexec_flags & KEXEC_ON_CRASH)) | ||
118 | + arm64_mem.vp_offset -= kernel_segment - get_phys_offset(); | ||
119 | |||
120 | dbgprintf("%s: kernel_segment: %016lx\n", __func__, kernel_segment); | ||
121 | dbgprintf("%s: text_offset: %016lx\n", __func__, | ||
122 | @@ -127,6 +129,12 @@ int elf_arm64_load(int argc, char **argv, const char *kernel_buf, | ||
123 | __func__); | ||
124 | goto exit; | ||
125 | } | ||
126 | + | ||
127 | + /* | ||
128 | + * offset addresses in order to fit vmlinux | ||
129 | + * (elf_exec) into crash kernel's memory | ||
130 | + */ | ||
131 | + modify_ehdr_for_crashdump(&ehdr); | ||
132 | } | ||
133 | |||
134 | /* load the kernel */ | ||
135 | -- | ||
136 | 1.9.1 | ||
137 | |||
diff --git a/meta/recipes-kernel/kexec/kexec-tools/0007-arm64-kdump-set-up-other-segments.patch b/meta/recipes-kernel/kexec/kexec-tools/0007-arm64-kdump-set-up-other-segments.patch new file mode 100644 index 0000000000..2745466dbe --- /dev/null +++ b/meta/recipes-kernel/kexec/kexec-tools/0007-arm64-kdump-set-up-other-segments.patch | |||
@@ -0,0 +1,35 @@ | |||
1 | From 07ad14e12665221d754fde8e47c32ac18c24586a Mon Sep 17 00:00:00 2001 | ||
2 | From: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
3 | Date: Fri, 31 Jul 2015 20:01:39 +0900 | ||
4 | Subject: [PATCH 7/9] arm64: kdump: set up other segments | ||
5 | |||
6 | We make sure that all the other segments, initrd and device-tree blob, | ||
7 | also be loaded into the reserved memory of crash dump kernel. | ||
8 | |||
9 | Upstream-Status: Backport [https://git.linaro.org/people/takahiro.akashi/kexec-tools.git] | ||
10 | |||
11 | Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
12 | Signed-off-by: He Zhe <zhe.he@windriver.com> | ||
13 | --- | ||
14 | kexec/arch/arm64/kexec-arm64.c | 5 ++++- | ||
15 | 1 file changed, 4 insertions(+), 1 deletion(-) | ||
16 | |||
17 | diff --git a/kexec/arch/arm64/kexec-arm64.c b/kexec/arch/arm64/kexec-arm64.c | ||
18 | index cec4e41..78a0035 100644 | ||
19 | --- a/kexec/arch/arm64/kexec-arm64.c | ||
20 | +++ b/kexec/arch/arm64/kexec-arm64.c | ||
21 | @@ -374,7 +374,10 @@ int arm64_load_other_segments(struct kexec_info *info, | ||
22 | /* Put the other segments after the image. */ | ||
23 | |||
24 | hole_min = image_base + arm64_mem.image_size; | ||
25 | - hole_max = ULONG_MAX; | ||
26 | + if (info->kexec_flags & KEXEC_ON_CRASH) | ||
27 | + hole_max = crash_reserved_mem.end; | ||
28 | + else | ||
29 | + hole_max = ULONG_MAX; | ||
30 | |||
31 | if (arm64_opts.initrd) { | ||
32 | initrd_buf = slurp_file(arm64_opts.initrd, &initrd_size); | ||
33 | -- | ||
34 | 1.9.1 | ||
35 | |||
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 | |||
diff --git a/meta/recipes-kernel/kexec/kexec-tools/0009-arm64-kdump-Add-support-for-binary-image-files.patch b/meta/recipes-kernel/kexec/kexec-tools/0009-arm64-kdump-Add-support-for-binary-image-files.patch new file mode 100644 index 0000000000..8b1c0183e0 --- /dev/null +++ b/meta/recipes-kernel/kexec/kexec-tools/0009-arm64-kdump-Add-support-for-binary-image-files.patch | |||
@@ -0,0 +1,52 @@ | |||
1 | From 5a4958f01a793c3e7f440f5bae75666a4349cc50 Mon Sep 17 00:00:00 2001 | ||
2 | From: Pratyush Anand <panand@redhat.com> | ||
3 | Date: Thu, 14 May 2015 11:25:37 +0530 | ||
4 | Subject: [PATCH 9/9] arm64: kdump: Add support for binary image files | ||
5 | |||
6 | This patch adds support to use binary image ie arch/arm64/boot/Image with | ||
7 | kdump. | ||
8 | |||
9 | Upstream-Status: Backport [https://git.linaro.org/people/takahiro.akashi/kexec-tools.git] | ||
10 | |||
11 | Signed-off-by: Pratyush Anand <panand@redhat.com> | ||
12 | [takahiro.akashi@linaro.org: a bit reworked] | ||
13 | Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
14 | Signed-off-by: He Zhe <zhe.he@windriver.com> | ||
15 | --- | ||
16 | kexec/arch/arm64/kexec-image-arm64.c | 12 ++++++++++++ | ||
17 | 1 file changed, 12 insertions(+) | ||
18 | |||
19 | diff --git a/kexec/arch/arm64/kexec-image-arm64.c b/kexec/arch/arm64/kexec-image-arm64.c | ||
20 | index 960ed96..982e431 100644 | ||
21 | --- a/kexec/arch/arm64/kexec-image-arm64.c | ||
22 | +++ b/kexec/arch/arm64/kexec-image-arm64.c | ||
23 | @@ -4,7 +4,9 @@ | ||
24 | |||
25 | #define _GNU_SOURCE | ||
26 | |||
27 | +#include "crashdump-arm64.h" | ||
28 | #include "kexec-arm64.h" | ||
29 | +#include "kexec-syscall.h" | ||
30 | #include <limits.h> | ||
31 | |||
32 | int image_arm64_probe(const char *kernel_buf, off_t kernel_size) | ||
33 | @@ -58,6 +60,16 @@ int image_arm64_load(int argc, char **argv, const char *kernel_buf, | ||
34 | dbgprintf("%s: PE format: %s\n", __func__, | ||
35 | (arm64_header_check_pe_sig(header) ? "yes" : "no")); | ||
36 | |||
37 | + if (info->kexec_flags & KEXEC_ON_CRASH) { | ||
38 | + /* create and initialize elf core header segment */ | ||
39 | + result = load_crashdump_segments(info); | ||
40 | + if (result) { | ||
41 | + dbgprintf("%s: Creating eflcorehdr failed.\n", | ||
42 | + __func__); | ||
43 | + goto exit; | ||
44 | + } | ||
45 | + } | ||
46 | + | ||
47 | /* load the kernel */ | ||
48 | add_segment_phys_virt(info, kernel_buf, kernel_size, | ||
49 | kernel_segment + arm64_mem.text_offset, | ||
50 | -- | ||
51 | 1.9.1 | ||
52 | |||
diff --git a/meta/recipes-kernel/kexec/kexec-tools_2.0.12.bb b/meta/recipes-kernel/kexec/kexec-tools_2.0.14.bb index 59376c804a..899b391ecf 100644 --- a/meta/recipes-kernel/kexec/kexec-tools_2.0.12.bb +++ b/meta/recipes-kernel/kexec/kexec-tools_2.0.14.bb | |||
@@ -2,16 +2,23 @@ require kexec-tools.inc | |||
2 | export LDFLAGS = "-L${STAGING_LIBDIR}" | 2 | export LDFLAGS = "-L${STAGING_LIBDIR}" |
3 | EXTRA_OECONF = " --with-zlib=yes" | 3 | EXTRA_OECONF = " --with-zlib=yes" |
4 | 4 | ||
5 | SRC_URI += " \ | 5 | SRC_URI += "${KERNELORG_MIRROR}/linux/utils/kernel/kexec/kexec-tools-${PV}.tar.gz \ |
6 | file://kexec-aarch64.patch \ | ||
7 | file://kexec-x32.patch \ | ||
8 | file://0002-powerpc-change-the-memory-size-limit.patch \ | 6 | file://0002-powerpc-change-the-memory-size-limit.patch \ |
9 | file://0001-purgatory-Pass-r-directly-to-linker.patch \ | 7 | file://0001-purgatory-Pass-r-directly-to-linker.patch \ |
10 | file://0001-vmcore-dmesg-Define-_GNU_SOURCE.patch \ | 8 | file://0001-vmcore-dmesg-Define-_GNU_SOURCE.patch \ |
9 | file://0001-kexec-exntend-the-semantics-of-kexec_iomem_for_each_.patch \ | ||
10 | file://0002-kexec-generalize-and-rename-get_kernel_stext_sym.patch \ | ||
11 | file://0003-arm64-identify-PHYS_OFFSET-correctly.patch \ | ||
12 | file://0004-arm64-kdump-identify-memory-regions.patch \ | ||
13 | file://0005-arm64-kdump-add-elf-core-header-segment.patch \ | ||
14 | file://0006-arm64-kdump-set-up-kernel-image-segment.patch \ | ||
15 | file://0007-arm64-kdump-set-up-other-segments.patch \ | ||
16 | file://0008-arm64-kdump-add-DT-properties-to-crash-dump-kernel-s.patch \ | ||
17 | file://0009-arm64-kdump-Add-support-for-binary-image-files.patch \ | ||
11 | " | 18 | " |
12 | 19 | ||
13 | SRC_URI[md5sum] = "10ddaae0e86af54407b164a1f5a39cc3" | 20 | SRC_URI[md5sum] = "b2b2c5e6b29d467d6e99d587fb6b7cf5" |
14 | SRC_URI[sha256sum] = "cc7b60dad0da202004048a6179d8a53606943062dd627a2edba45a8ea3a85135" | 21 | SRC_URI[sha256sum] = "b3e69519d2acced256843b1e8f1ecfa00d9b54fa07449ed78f05b9193f239370" |
15 | 22 | ||
16 | PACKAGES =+ "kexec kdump vmcore-dmesg" | 23 | PACKAGES =+ "kexec kdump vmcore-dmesg" |
17 | 24 | ||