blob: bd728ccb49580f28f05d256efe432d17f59d3bab [file] [log] [blame]
Brad Bishop26bdd442019-08-16 17:08:17 -04001From 7bd94a64cd5424e74ad49dbda65a15e83670268f Mon Sep 17 00:00:00 2001
Brad Bishop19323692019-04-05 15:28:33 -04002From: Andrea Adami <andrea.adami@gmail.com>
3Date: Mon, 17 Dec 2018 11:25:20 +0100
4Subject: [PATCH] kexec-tools: fix non-device tree devices on mips
5
6Add additional argument '--no-dtb' which disables device tree
7search in currently loaded kernel.
8
9Taken from LEDE-DEV:
10https://patchwork.ozlabs.org/patch/852961/
11
12Rebased for kexec-tools 2.0.18
13Removed ppc change (unwanted ?)
14
15Signed-off-by: Konstantin Kuzov <master.nosferatu@gmail.com>
16Signed-off-by: Andrea Adami <andrea.adami@gmail.com>
Brad Bishop26bdd442019-08-16 17:08:17 -040017
Brad Bishop19323692019-04-05 15:28:33 -040018---
19 kexec/arch/mips/include/arch/options.h | 4 +-
20 kexec/arch/mips/kexec-elf-mips.c | 58 ++++++++++++++------------
21 kexec/arch/mips/kexec-mips.c | 4 ++
22 kexec/arch/mips/kexec-mips.h | 1 +
23 4 files changed, 39 insertions(+), 28 deletions(-)
24
25diff --git a/kexec/arch/mips/include/arch/options.h b/kexec/arch/mips/include/arch/options.h
26index 416e224..18d2811 100644
27--- a/kexec/arch/mips/include/arch/options.h
28+++ b/kexec/arch/mips/include/arch/options.h
29@@ -5,6 +5,7 @@
30 #define OPT_APPEND (OPT_ARCH_MAX+0)
31 #define OPT_DTB (OPT_ARCH_MAX+1)
32 #define OPT_RAMDISK (OPT_ARCH_MAX+2)
33+#define OPT_NO_DTB (OPT_ARCH_MAX+3)
34
35 /* Options relevant to the architecture (excluding loader-specific ones),
36 * in this case none:
37@@ -14,7 +15,8 @@
38 {"command-line", 1, 0, OPT_APPEND}, \
39 {"append", 1, 0, OPT_APPEND}, \
40 {"dtb", 1, 0, OPT_DTB }, \
41- {"initrd", 1, 0, OPT_RAMDISK },
42+ {"initrd", 1, 0, OPT_RAMDISK }, \
43+ {"no-dtb", 0, 0, OPT_NO_DTB },
44
45
46 #define KEXEC_ARCH_OPT_STR KEXEC_OPT_STR ""
47diff --git a/kexec/arch/mips/kexec-elf-mips.c b/kexec/arch/mips/kexec-elf-mips.c
48index 849a7ba..5c0e535 100644
49--- a/kexec/arch/mips/kexec-elf-mips.c
50+++ b/kexec/arch/mips/kexec-elf-mips.c
51@@ -141,35 +141,37 @@ int elf_mips_load(int argc, char **argv, const char *buf, off_t len,
52 else
53 cmdline_addr = 0;
54
55- /* MIPS systems that have been converted to use device tree
56- * passed through UHI will use commandline in the DTB and
57- * the DTB passed as a separate buffer. Note that
58- * CMDLINE_PREFIX is skipped here intentionally, as it is
59- * used only in the legacy method */
60-
61- if (arch_options.dtb_file) {
62- dtb_buf = slurp_file(arch_options.dtb_file, &dtb_length);
63- } else {
64- create_flatten_tree(&dtb_buf, &dtb_length, cmdline_buf + strlen(CMDLINE_PREFIX));
65- }
66
67- if (arch_options.initrd_file) {
68- initrd_buf = slurp_file(arch_options.initrd_file, &initrd_size);
69+ if (!arch_options.no_dtb) {
70+ /* MIPS systems that have been converted to use device tree
71+ * passed through UHI will use commandline in the DTB and
72+ * the DTB passed as a separate buffer. Note that
73+ * CMDLINE_PREFIX is skipped here intentionally, as it is
74+ * used only in the legacy method */
75+
76+ if (arch_options.dtb_file) {
77+ dtb_buf = slurp_file(arch_options.dtb_file, &dtb_length);
78+ } else {
79+ create_flatten_tree(&dtb_buf, &dtb_length, cmdline_buf + strlen(CMDLINE_PREFIX));
80+ }
81
82- /* Create initrd entries in dtb - although at this time
83- * they would not point to the correct location */
84- dtb_set_initrd(&dtb_buf, &dtb_length, initrd_buf, initrd_buf + initrd_size);
85+ if (arch_options.initrd_file) {
86+ initrd_buf = slurp_file(arch_options.initrd_file, &initrd_size);
87
88- initrd_base = add_buffer(info, initrd_buf, initrd_size,
89- initrd_size, sizeof(void *),
90- _ALIGN_UP(kernel_addr + kernel_size + dtb_length,
91- pagesize), 0x0fffffff, 1);
92+ /* Create initrd entries in dtb - although at this time
93+ * they would not point to the correct location */
94+ dtb_set_initrd(&dtb_buf, &dtb_length, initrd_buf, initrd_buf + initrd_size);
95
96- /* Now that the buffer for initrd is prepared, update the dtb
97- * with an appropriate location */
98- dtb_set_initrd(&dtb_buf, &dtb_length, initrd_base, initrd_base + initrd_size);
99- }
100+ initrd_base = add_buffer(info, initrd_buf, initrd_size,
101+ initrd_size, sizeof(void *),
102+ _ALIGN_UP(kernel_addr + kernel_size + dtb_length,
103+ pagesize), 0x0fffffff, 1);
104
105+ /* Now that the buffer for initrd is prepared, update the dtb
106+ * with an appropriate location */
107+ dtb_set_initrd(&dtb_buf, &dtb_length, initrd_base, initrd_base + initrd_size);
108+ }
109+ }
110
111 /* This is a legacy method for commandline passing used
112 * currently by Octeon CPUs only */
113@@ -177,9 +179,11 @@ int elf_mips_load(int argc, char **argv, const char *buf, off_t len,
114 sizeof(cmdline_buf), sizeof(void *),
115 cmdline_addr, 0x0fffffff, 1);
116
117- add_buffer(info, dtb_buf, dtb_length, dtb_length, 0,
118- _ALIGN_UP(kernel_addr + kernel_size, pagesize),
119- 0x0fffffff, 1);
120+ if (!arch_options.no_dtb) {
121+ add_buffer(info, dtb_buf, dtb_length, dtb_length, 0,
122+ _ALIGN_UP(kernel_addr + kernel_size, pagesize),
123+ 0x0fffffff, 1);
124+ }
125
126 return 0;
127 }
128diff --git a/kexec/arch/mips/kexec-mips.c b/kexec/arch/mips/kexec-mips.c
129index 415c2ed..e557f8b 100644
130--- a/kexec/arch/mips/kexec-mips.c
131+++ b/kexec/arch/mips/kexec-mips.c
132@@ -89,6 +89,7 @@ void arch_usage(void)
133 " --append=STRING Set the kernel command line to STRING.\n"
134 " --dtb=FILE Use FILE as the device tree blob.\n"
135 " --initrd=FILE Use FILE as initial ramdisk.\n"
136+ " --no-dtb Don't try to find device tree\n"
137 );
138 }
139
140@@ -121,6 +122,9 @@ int arch_process_options(int argc, char **argv)
141 case OPT_RAMDISK:
142 arch_options.initrd_file = optarg;
143 break;
144+ case OPT_NO_DTB:
145+ arch_options.no_dtb = 1;
146+ break;
147 default:
148 break;
149 }
150diff --git a/kexec/arch/mips/kexec-mips.h b/kexec/arch/mips/kexec-mips.h
151index 222c815..90b21c3 100644
152--- a/kexec/arch/mips/kexec-mips.h
153+++ b/kexec/arch/mips/kexec-mips.h
154@@ -22,6 +22,7 @@ struct arch_options_t {
155 char *dtb_file;
156 char *initrd_file;
157 int core_header_type;
158+ int no_dtb;
159 };
160
161 extern struct memory_ranges usablemem_rgns;