Hello,
This patch causes a warning in GCC 4.6.3:
arch/powerpc/kernel/kexec_elf_64.c:211:6: error: 'initrd_load_addr' may be used
uninitialized in this function [-Werror=uninitialized]
cc1: all warnings being treated as errors
make[2]: *** [arch/powerpc/kernel/kexec_elf_64.o] Error 1
make[1]: *** [arch/powerpc/kernel] Error 2
make: *** [sub-make] Error 2
It's true that setup_new_fdt may be called with an uninitialised value
for initrd_load_addr if initrd == NULL, but in that case initrd_len
will be 0 as well (because both are set at the same time by
kernel_read_file_from_fd in kimage_file_prepare_segments) and
setup_new_fdt won't try to use initrd_load_addr. Therefore the warning
is harmless, because the situation where initrd_load_addr may be used
unitialized can't happen.
The patch below has the following change:
@@ -153,7 +153,7 @@ void *elf64_load(struct kimage *image, char *kernel_buf,
int i, ret;
unsigned int fdt_size;
unsigned long kernel_load_addr, purgatory_load_addr;
- unsigned long initrd_load_addr, fdt_load_addr, stack_top;
+ unsigned long initrd_load_addr = 0, fdt_load_addr, stack_top;
void *fdt;
const void *slave_code;
struct elfhdr ehdr;
--
[]'s
Thiago Jung Bauermann
IBM Linux Technology Center
Subject: [PATCH v8 11/13] powerpc: Add support for loading ELF kernels with
kexec_file_load.
This uses all the infrastructure built up by the previous patches
in the series to load an ELF vmlinux file and an initrd. It uses the
flattened device tree at initial_boot_params as a base and adjusts memory
reservations and its /chosen node for the next kernel.
Signed-off-by: Thiago Jung Bauermann
---
arch/powerpc/include/asm/kexec_elf_64.h | 10 ++
arch/powerpc/kernel/Makefile| 1 +
arch/powerpc/kernel/kexec_elf_64.c | 282
arch/powerpc/kernel/machine_kexec_64.c | 5 +-
4 files changed, 297 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/include/asm/kexec_elf_64.h
b/arch/powerpc/include/asm/kexec_elf_64.h
new file mode 100644
index ..30da6bc0ccf8
--- /dev/null
+++ b/arch/powerpc/include/asm/kexec_elf_64.h
@@ -0,0 +1,10 @@
+#ifndef __POWERPC_KEXEC_ELF_64_H__
+#define __POWERPC_KEXEC_ELF_64_H__
+
+#ifdef CONFIG_KEXEC_FILE
+
+extern struct kexec_file_ops kexec_elf64_ops;
+
+#endif /* CONFIG_KEXEC_FILE */
+
+#endif /* __POWERPC_KEXEC_ELF_64_H__ */
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
index fef0d730acc4..d12a84003283 100644
--- a/arch/powerpc/kernel/Makefile
+++ b/arch/powerpc/kernel/Makefile
@@ -109,6 +109,7 @@ obj-$(CONFIG_PCI) += pci_$(CONFIG_WORD_SIZE).o
$(pci64-y) \
obj-$(CONFIG_PCI_MSI) += msi.o
obj-$(CONFIG_KEXEC_CORE) += machine_kexec.o crash.o \
machine_kexec_$(CONFIG_WORD_SIZE).o
+obj-$(CONFIG_KEXEC_FILE) += kexec_elf_$(CONFIG_WORD_SIZE).o
obj-$(CONFIG_AUDIT)+= audit.o
obj64-$(CONFIG_AUDIT) += compat_audit.o
diff --git a/arch/powerpc/kernel/kexec_elf_64.c
b/arch/powerpc/kernel/kexec_elf_64.c
new file mode 100644
index ..c61243668bc3
--- /dev/null
+++ b/arch/powerpc/kernel/kexec_elf_64.c
@@ -0,0 +1,282 @@
+/*
+ * Load ELF vmlinux file for the kexec_file_load syscall.
+ *
+ * Copyright (C) 2004 Adam Litke (a...@us.ibm.com)
+ * Copyright (C) 2004 IBM Corp.
+ * Copyright (C) 2005 R Sharada (shar...@in.ibm.com)
+ * Copyright (C) 2006 Mohan Kumar M (mo...@in.ibm.com)
+ * Copyright (C) 2016 IBM Corporation
+ *
+ * Based on kexec-tools' kexec-elf-exec.c and kexec-elf-ppc64.c.
+ * Heavily modified for the kernel by
+ * Thiago Jung Bauermann .
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation (version 2 of the License).
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#define pr_fmt(fmt)"kexec_elf: " fmt
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+extern size_t kexec_purgatory_size;
+
+#define PURGATORY_STACK_SIZE (16 * 1024)
+
+/**
+ * build_elf_exec_info - read ELF executable and check that we can use it
+ */
+static int build_elf_exec_info(const char *buf, size_t len, struct elfhdr
*ehdr,
+ struct elf_info *elf_info)
+{
+ int i;
+ int ret;
+
+ ret = elf_read_from_buffer(buf, len, ehdr, elf_info);
+ if (ret)
+ return ret;
+
+ /* Big endian vmlinux has type ET_DYN. */
+ if (ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN) {
+ pr_err("Not an ELF executable.\n"