powerpc/kexec_file: Mark PPC64 specific code
authorHari Bathini <hbathini@linux.ibm.com>
Wed, 29 Jul 2020 11:39:41 +0000 (17:09 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 29 Jul 2020 13:47:53 +0000 (23:47 +1000)
Some of the kexec_file_load code isn't PPC64 specific. Move PPC64
specific code from kexec/file_load.c to kexec/file_load_64.c. Also,
rename purgatory/trampoline.S to purgatory/trampoline_64.S in the same
spirit. No functional changes.

Signed-off-by: Hari Bathini <hbathini@linux.ibm.com>
Tested-by: Pingfan Liu <piliu@redhat.com>
Reviewed-by: Laurent Dufour <ldufour@linux.ibm.com>
Reviewed-by: Thiago Jung Bauermann <bauerman@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/159602276920.575379.10390965946438306388.stgit@hbathini
arch/powerpc/include/asm/kexec.h
arch/powerpc/kexec/Makefile
arch/powerpc/kexec/elf_64.c
arch/powerpc/kexec/file_load.c
arch/powerpc/kexec/file_load_64.c [new file with mode: 0644]
arch/powerpc/purgatory/Makefile
arch/powerpc/purgatory/trampoline_64.S [moved from arch/powerpc/purgatory/trampoline.S with 100% similarity]

index 89f7e34..9b3feef 100644 (file)
@@ -116,6 +116,15 @@ int setup_new_fdt(const struct kimage *image, void *fdt,
                  unsigned long initrd_load_addr, unsigned long initrd_len,
                  const char *cmdline);
 int delete_fdt_mem_rsv(void *fdt, unsigned long start, unsigned long size);
+
+#ifdef CONFIG_PPC64
+int setup_purgatory_ppc64(struct kimage *image, const void *slave_code,
+                         const void *fdt, unsigned long kernel_load_addr,
+                         unsigned long fdt_load_addr);
+int setup_new_fdt_ppc64(const struct kimage *image, void *fdt,
+                       unsigned long initrd_load_addr,
+                       unsigned long initrd_len, const char *cmdline);
+#endif /* CONFIG_PPC64 */
 #endif /* CONFIG_KEXEC_FILE */
 
 #else /* !CONFIG_KEXEC_CORE */
index 86380c6..67c3553 100644 (file)
@@ -7,7 +7,7 @@ obj-y                           += core.o crash.o core_$(BITS).o
 
 obj-$(CONFIG_PPC32)            += relocate_32.o
 
-obj-$(CONFIG_KEXEC_FILE)       += file_load.o elf_$(BITS).o
+obj-$(CONFIG_KEXEC_FILE)       += file_load.o file_load_$(BITS).o elf_$(BITS).o
 
 ifdef CONFIG_HAVE_IMA_KEXEC
 ifdef CONFIG_IMA
index 3072fd6..23ad04c 100644 (file)
@@ -88,7 +88,8 @@ static void *elf64_load(struct kimage *image, char *kernel_buf,
                goto out;
        }
 
-       ret = setup_new_fdt(image, fdt, initrd_load_addr, initrd_len, cmdline);
+       ret = setup_new_fdt_ppc64(image, fdt, initrd_load_addr,
+                                 initrd_len, cmdline);
        if (ret)
                goto out;
 
@@ -107,8 +108,8 @@ static void *elf64_load(struct kimage *image, char *kernel_buf,
        pr_debug("Loaded device tree at 0x%lx\n", fdt_load_addr);
 
        slave_code = elf_info.buffer + elf_info.proghdrs[0].p_offset;
-       ret = setup_purgatory(image, slave_code, fdt, kernel_load_addr,
-                             fdt_load_addr);
+       ret = setup_purgatory_ppc64(image, slave_code, fdt, kernel_load_addr,
+                                   fdt_load_addr);
        if (ret)
                pr_err("Error setting up the purgatory.\n");
 
index 143c917..38439ab 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * ppc64 code to implement the kexec_file_load syscall
+ * powerpc code to implement the kexec_file_load syscall
  *
  * Copyright (C) 2004  Adam Litke (agl@us.ibm.com)
  * Copyright (C) 2004  IBM Corp.
 #include <linux/libfdt.h>
 #include <asm/ima.h>
 
-#define SLAVE_CODE_SIZE                256
-
-const struct kexec_file_ops * const kexec_file_loaders[] = {
-       &kexec_elf64_ops,
-       NULL
-};
-
-int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
-                                 unsigned long buf_len)
-{
-       /* We don't support crash kernels yet. */
-       if (image->type == KEXEC_TYPE_CRASH)
-               return -EOPNOTSUPP;
-
-       return kexec_image_probe_default(image, buf, buf_len);
-}
+#define SLAVE_CODE_SIZE                256     /* First 0x100 bytes */
 
 /**
  * setup_purgatory - initialize the purgatory's global variables
diff --git a/arch/powerpc/kexec/file_load_64.c b/arch/powerpc/kexec/file_load_64.c
new file mode 100644 (file)
index 0000000..3e9ac5f
--- /dev/null
@@ -0,0 +1,87 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * ppc64 code to implement the kexec_file_load syscall
+ *
+ * Copyright (C) 2004  Adam Litke (agl@us.ibm.com)
+ * Copyright (C) 2004  IBM Corp.
+ * Copyright (C) 2004,2005  Milton D Miller II, IBM Corporation
+ * Copyright (C) 2005  R Sharada (sharada@in.ibm.com)
+ * Copyright (C) 2006  Mohan Kumar M (mohan@in.ibm.com)
+ * Copyright (C) 2020  IBM Corporation
+ *
+ * Based on kexec-tools' kexec-ppc64.c, kexec-elf-rel-ppc64.c, fs2dt.c.
+ * Heavily modified for the kernel by
+ * Hari Bathini, IBM Corporation.
+ */
+
+#include <linux/kexec.h>
+#include <linux/of_fdt.h>
+#include <linux/libfdt.h>
+
+const struct kexec_file_ops * const kexec_file_loaders[] = {
+       &kexec_elf64_ops,
+       NULL
+};
+
+/**
+ * setup_purgatory_ppc64 - initialize PPC64 specific purgatory's global
+ *                         variables and call setup_purgatory() to initialize
+ *                         common global variable.
+ * @image:                 kexec image.
+ * @slave_code:            Slave code for the purgatory.
+ * @fdt:                   Flattened device tree for the next kernel.
+ * @kernel_load_addr:      Address where the kernel is loaded.
+ * @fdt_load_addr:         Address where the flattened device tree is loaded.
+ *
+ * Returns 0 on success, negative errno on error.
+ */
+int setup_purgatory_ppc64(struct kimage *image, const void *slave_code,
+                         const void *fdt, unsigned long kernel_load_addr,
+                         unsigned long fdt_load_addr)
+{
+       int ret;
+
+       ret = setup_purgatory(image, slave_code, fdt, kernel_load_addr,
+                             fdt_load_addr);
+       if (ret)
+               pr_err("Failed to setup purgatory symbols");
+       return ret;
+}
+
+/**
+ * setup_new_fdt_ppc64 - Update the flattend device-tree of the kernel
+ *                       being loaded.
+ * @image:               kexec image being loaded.
+ * @fdt:                 Flattened device tree for the next kernel.
+ * @initrd_load_addr:    Address where the next initrd will be loaded.
+ * @initrd_len:          Size of the next initrd, or 0 if there will be none.
+ * @cmdline:             Command line for the next kernel, or NULL if there will
+ *                       be none.
+ *
+ * Returns 0 on success, negative errno on error.
+ */
+int setup_new_fdt_ppc64(const struct kimage *image, void *fdt,
+                       unsigned long initrd_load_addr,
+                       unsigned long initrd_len, const char *cmdline)
+{
+       return setup_new_fdt(image, fdt, initrd_load_addr, initrd_len, cmdline);
+}
+
+/**
+ * arch_kexec_kernel_image_probe - Does additional handling needed to setup
+ *                                 kexec segments.
+ * @image:                         kexec image being loaded.
+ * @buf:                           Buffer pointing to elf data.
+ * @buf_len:                       Length of the buffer.
+ *
+ * Returns 0 on success, negative errno on error.
+ */
+int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
+                                 unsigned long buf_len)
+{
+       /* We don't support crash kernels yet. */
+       if (image->type == KEXEC_TYPE_CRASH)
+               return -EOPNOTSUPP;
+
+       return kexec_image_probe_default(image, buf, buf_len);
+}
index 7c6d8b1..348f595 100644 (file)
@@ -2,11 +2,11 @@
 
 KASAN_SANITIZE := n
 
-targets += trampoline.o purgatory.ro kexec-purgatory.c
+targets += trampoline_$(BITS).o purgatory.ro kexec-purgatory.c
 
 LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined
 
-$(obj)/purgatory.ro: $(obj)/trampoline.o FORCE
+$(obj)/purgatory.ro: $(obj)/trampoline_$(BITS).o FORCE
                $(call if_changed,ld)
 
 quiet_cmd_bin2c = BIN2C   $@