aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrea Adami <andrea.adami@gmail.com>2018-12-17 19:17:48 +0100
committerKhem Raj <raj.khem@gmail.com>2018-12-18 18:44:59 -0800
commit62779390653d869f64ed655a3cd0b194a131a789 (patch)
tree24ccedd7c464666a02a8419f137fc7a73b3b4a7e
parentafadc2ca4d72f5cdf3d191d96ec56057d9ca07b5 (diff)
downloadmeta-openembedded-contrib-62779390653d869f64ed655a3cd0b194a131a789.tar.gz
meta-openembedded-contrib-62779390653d869f64ed655a3cd0b194a131a789.tar.bz2
meta-openembedded-contrib-62779390653d869f64ed655a3cd0b194a131a789.zip
kexec-tools-klibc: implement the --no-dtb option for older mips kernels
Fix borrowed from LEDE-DEV. Signed-off-by: Andrea Adami <andrea.adami@gmail.com> Signed-off-by: Khem Raj <raj.khem@gmail.com>
-rw-r--r--meta-initramfs/recipes-kernel/kexec/kexec-tools-klibc/140-mips_disable_devicetree_support.patch163
-rw-r--r--meta-initramfs/recipes-kernel/kexec/kexec-tools-klibc_git.bb3
2 files changed, 166 insertions, 0 deletions
diff --git a/meta-initramfs/recipes-kernel/kexec/kexec-tools-klibc/140-mips_disable_devicetree_support.patch b/meta-initramfs/recipes-kernel/kexec/kexec-tools-klibc/140-mips_disable_devicetree_support.patch
new file mode 100644
index 0000000000..b3ef3c82d1
--- /dev/null
+++ b/meta-initramfs/recipes-kernel/kexec/kexec-tools-klibc/140-mips_disable_devicetree_support.patch
@@ -0,0 +1,163 @@
+From 5ea7cd78cd252ffd3a9f3fbc8dc795d6e1596084 Mon Sep 17 00:00:00 2001
+From: Andrea Adami <andrea.adami@gmail.com>
+Date: Mon, 17 Dec 2018 11:25:20 +0100
+Subject: [PATCH] kexec-tools: fix non-device tree devices on mips
+
+Add additional argument '--no-dtb' which disables device tree
+search in currently loaded kernel.
+
+Taken from LEDE-DEV:
+https://patchwork.ozlabs.org/patch/852961/
+
+Rebased for kexec-tools 2.0.18
+Removed ppc change (unwanted ?)
+
+Signed-off-by: Konstantin Kuzov <master.nosferatu@gmail.com>
+Signed-off-by: Andrea Adami <andrea.adami@gmail.com>
+---
+ kexec/arch/mips/include/arch/options.h | 4 +-
+ kexec/arch/mips/kexec-elf-mips.c | 58 ++++++++++++++------------
+ kexec/arch/mips/kexec-mips.c | 4 ++
+ kexec/arch/mips/kexec-mips.h | 1 +
+ 4 files changed, 39 insertions(+), 28 deletions(-)
+
+diff --git a/kexec/arch/mips/include/arch/options.h b/kexec/arch/mips/include/arch/options.h
+index 416e224..18d2811 100644
+--- a/kexec/arch/mips/include/arch/options.h
++++ b/kexec/arch/mips/include/arch/options.h
+@@ -5,6 +5,7 @@
+ #define OPT_APPEND (OPT_ARCH_MAX+0)
+ #define OPT_DTB (OPT_ARCH_MAX+1)
+ #define OPT_RAMDISK (OPT_ARCH_MAX+2)
++#define OPT_NO_DTB (OPT_ARCH_MAX+3)
+
+ /* Options relevant to the architecture (excluding loader-specific ones),
+ * in this case none:
+@@ -14,7 +15,8 @@
+ {"command-line", 1, 0, OPT_APPEND}, \
+ {"append", 1, 0, OPT_APPEND}, \
+ {"dtb", 1, 0, OPT_DTB }, \
+- {"initrd", 1, 0, OPT_RAMDISK },
++ {"initrd", 1, 0, OPT_RAMDISK }, \
++ {"no-dtb", 0, 0, OPT_NO_DTB },
+
+
+ #define KEXEC_ARCH_OPT_STR KEXEC_OPT_STR ""
+diff --git a/kexec/arch/mips/kexec-elf-mips.c b/kexec/arch/mips/kexec-elf-mips.c
+index 849a7ba..5c0e535 100644
+--- a/kexec/arch/mips/kexec-elf-mips.c
++++ b/kexec/arch/mips/kexec-elf-mips.c
+@@ -141,35 +141,37 @@ int elf_mips_load(int argc, char **argv, const char *buf, off_t len,
+ else
+ cmdline_addr = 0;
+
+- /* MIPS systems that have been converted to use device tree
+- * passed through UHI will use commandline in the DTB and
+- * the DTB passed as a separate buffer. Note that
+- * CMDLINE_PREFIX is skipped here intentionally, as it is
+- * used only in the legacy method */
+-
+- if (arch_options.dtb_file) {
+- dtb_buf = slurp_file(arch_options.dtb_file, &dtb_length);
+- } else {
+- create_flatten_tree(&dtb_buf, &dtb_length, cmdline_buf + strlen(CMDLINE_PREFIX));
+- }
+
+- if (arch_options.initrd_file) {
+- initrd_buf = slurp_file(arch_options.initrd_file, &initrd_size);
++ if (!arch_options.no_dtb) {
++ /* MIPS systems that have been converted to use device tree
++ * passed through UHI will use commandline in the DTB and
++ * the DTB passed as a separate buffer. Note that
++ * CMDLINE_PREFIX is skipped here intentionally, as it is
++ * used only in the legacy method */
++
++ if (arch_options.dtb_file) {
++ dtb_buf = slurp_file(arch_options.dtb_file, &dtb_length);
++ } else {
++ create_flatten_tree(&dtb_buf, &dtb_length, cmdline_buf + strlen(CMDLINE_PREFIX));
++ }
+
+- /* Create initrd entries in dtb - although at this time
+- * they would not point to the correct location */
+- dtb_set_initrd(&dtb_buf, &dtb_length, initrd_buf, initrd_buf + initrd_size);
++ if (arch_options.initrd_file) {
++ initrd_buf = slurp_file(arch_options.initrd_file, &initrd_size);
+
+- initrd_base = add_buffer(info, initrd_buf, initrd_size,
+- initrd_size, sizeof(void *),
+- _ALIGN_UP(kernel_addr + kernel_size + dtb_length,
+- pagesize), 0x0fffffff, 1);
++ /* Create initrd entries in dtb - although at this time
++ * they would not point to the correct location */
++ dtb_set_initrd(&dtb_buf, &dtb_length, initrd_buf, initrd_buf + initrd_size);
+
+- /* Now that the buffer for initrd is prepared, update the dtb
+- * with an appropriate location */
+- dtb_set_initrd(&dtb_buf, &dtb_length, initrd_base, initrd_base + initrd_size);
+- }
++ initrd_base = add_buffer(info, initrd_buf, initrd_size,
++ initrd_size, sizeof(void *),
++ _ALIGN_UP(kernel_addr + kernel_size + dtb_length,
++ pagesize), 0x0fffffff, 1);
+
++ /* Now that the buffer for initrd is prepared, update the dtb
++ * with an appropriate location */
++ dtb_set_initrd(&dtb_buf, &dtb_length, initrd_base, initrd_base + initrd_size);
++ }
++ }
+
+ /* This is a legacy method for commandline passing used
+ * currently by Octeon CPUs only */
+@@ -177,9 +179,11 @@ int elf_mips_load(int argc, char **argv, const char *buf, off_t len,
+ sizeof(cmdline_buf), sizeof(void *),
+ cmdline_addr, 0x0fffffff, 1);
+
+- add_buffer(info, dtb_buf, dtb_length, dtb_length, 0,
+- _ALIGN_UP(kernel_addr + kernel_size, pagesize),
+- 0x0fffffff, 1);
++ if (!arch_options.no_dtb) {
++ add_buffer(info, dtb_buf, dtb_length, dtb_length, 0,
++ _ALIGN_UP(kernel_addr + kernel_size, pagesize),
++ 0x0fffffff, 1);
++ }
+
+ return 0;
+ }
+diff --git a/kexec/arch/mips/kexec-mips.c b/kexec/arch/mips/kexec-mips.c
+index 415c2ed..e557f8b 100644
+--- a/kexec/arch/mips/kexec-mips.c
++++ b/kexec/arch/mips/kexec-mips.c
+@@ -89,6 +89,7 @@ void arch_usage(void)
+ " --append=STRING Set the kernel command line to STRING.\n"
+ " --dtb=FILE Use FILE as the device tree blob.\n"
+ " --initrd=FILE Use FILE as initial ramdisk.\n"
++ " --no-dtb Don't try to find device tree\n"
+ );
+ }
+
+@@ -121,6 +122,9 @@ int arch_process_options(int argc, char **argv)
+ case OPT_RAMDISK:
+ arch_options.initrd_file = optarg;
+ break;
++ case OPT_NO_DTB:
++ arch_options.no_dtb = 1;
++ break;
+ default:
+ break;
+ }
+diff --git a/kexec/arch/mips/kexec-mips.h b/kexec/arch/mips/kexec-mips.h
+index 222c815..90b21c3 100644
+--- a/kexec/arch/mips/kexec-mips.h
++++ b/kexec/arch/mips/kexec-mips.h
+@@ -22,6 +22,7 @@ struct arch_options_t {
+ char *dtb_file;
+ char *initrd_file;
+ int core_header_type;
++ int no_dtb;
+ };
+
+ extern struct memory_ranges usablemem_rgns;
+--
+2.17.1
+
diff --git a/meta-initramfs/recipes-kernel/kexec/kexec-tools-klibc_git.bb b/meta-initramfs/recipes-kernel/kexec/kexec-tools-klibc_git.bb
index 6ffa2aad61..ebf5ff5ae4 100644
--- a/meta-initramfs/recipes-kernel/kexec/kexec-tools-klibc_git.bb
+++ b/meta-initramfs/recipes-kernel/kexec/kexec-tools-klibc_git.bb
@@ -42,6 +42,9 @@ SRC_URI += "${BUILD_PATCHES} ${KLIBC_PATCHES} ${WARNING_FIXES} ${FROM_OE_CORE}"
SRC_URI_append_arm = " file://arm_crashdump.patch"
+SRC_URI_append_mips = " file://140-mips_disable_devicetree_support.patch"
+SRC_URI_append_mipsel = " file://140-mips_disable_devicetree_support.patch"
+
SRC_URI_append_x86 = " file://x86_sys_io.patch file://x86_basename.patch \
file://x86_vfscanf.patch file://x86_kexec_test.patch"