+++ /dev/null
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef _ASM_POWERPC_IMA_H
-#define _ASM_POWERPC_IMA_H
-
-struct kimage;
-
-int ima_get_kexec_buffer(void **addr, size_t *size);
-int ima_free_kexec_buffer(void);
-
-#ifdef CONFIG_IMA
-void remove_ima_buffer(void *fdt, int chosen_node);
-#else
-static inline void remove_ima_buffer(void *fdt, int chosen_node) {}
-#endif
-
-#ifdef CONFIG_IMA_KEXEC
-int setup_ima_buffer(const struct kimage *image, void *fdt, int chosen_node);
-#else
-static inline int setup_ima_buffer(const struct kimage *image, void *fdt,
-                                  int chosen_node)
-{
-       remove_ima_buffer(fdt, chosen_node);
-       return 0;
-}
-#endif /* CONFIG_IMA_KEXEC */
-
-#endif /* _ASM_POWERPC_IMA_H */
 
 int setup_purgatory(struct kimage *image, const void *slave_code,
                    const void *fdt, unsigned long kernel_load_addr,
                    unsigned long fdt_load_addr);
-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
 
 
 obj-$(CONFIG_KEXEC_FILE)       += file_load.o ranges.o file_load_$(BITS).o elf_$(BITS).o
 
-ifdef CONFIG_HAVE_IMA_KEXEC
-ifdef CONFIG_IMA
-obj-y                          += ima.o
-endif
-endif
-
-
 # Disable GCOV, KCOV & sanitizers in odd or sensitive code
 GCOV_PROFILE_core_$(BITS).o := n
 KCOV_INSTRUMENT_core_$(BITS).o := n
 
 #include <linux/of_fdt.h>
 #include <linux/libfdt.h>
 #include <asm/setup.h>
-#include <asm/ima.h>
 
 #define SLAVE_CODE_SIZE                256     /* First 0x100 bytes */
 
 
        return -ENOENT;
 }
-
-/*
- * setup_new_fdt - modify /chosen and memory reservation for the next kernel
- * @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.
- *
- * Return: 0 on success, or negative errno on error.
- */
-int setup_new_fdt(const struct kimage *image, void *fdt,
-                 unsigned long initrd_load_addr, unsigned long initrd_len,
-                 const char *cmdline)
-{
-       int ret;
-
-       ret = setup_ima_buffer(image, fdt, fdt_path_offset(fdt, "/chosen"));
-       if (ret)
-               pr_err("Error setting up the new device tree.\n");
-
-       return ret;
-}
 
        struct crash_mem *umem = NULL, *rmem = NULL;
        int i, nr_ranges, ret;
 
-       ret = setup_new_fdt(image, fdt, initrd_load_addr, initrd_len, cmdline);
-       if (ret)
-               goto out;
-
        /*
         * Restrict memory usage for kdump kernel by setting up
         * usable memory ranges and memory reserve map.
 
+++ /dev/null
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * Copyright (C) 2016 IBM Corporation
- *
- * Authors:
- * Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com>
- */
-
-#include <linux/slab.h>
-#include <linux/kexec.h>
-#include <linux/of.h>
-#include <linux/memblock.h>
-#include <linux/libfdt.h>
-
-static int get_addr_size_cells(int *addr_cells, int *size_cells)
-{
-       struct device_node *root;
-
-       root = of_find_node_by_path("/");
-       if (!root)
-               return -EINVAL;
-
-       *addr_cells = of_n_addr_cells(root);
-       *size_cells = of_n_size_cells(root);
-
-       of_node_put(root);
-
-       return 0;
-}
-
-static int do_get_kexec_buffer(const void *prop, int len, unsigned long *addr,
-                              size_t *size)
-{
-       int ret, addr_cells, size_cells;
-
-       ret = get_addr_size_cells(&addr_cells, &size_cells);
-       if (ret)
-               return ret;
-
-       if (len < 4 * (addr_cells + size_cells))
-               return -ENOENT;
-
-       *addr = of_read_number(prop, addr_cells);
-       *size = of_read_number(prop + 4 * addr_cells, size_cells);
-
-       return 0;
-}
-
-/**
- * ima_get_kexec_buffer - get IMA buffer from the previous kernel
- * @addr:      On successful return, set to point to the buffer contents.
- * @size:      On successful return, set to the buffer size.
- *
- * Return: 0 on success, negative errno on error.
- */
-int ima_get_kexec_buffer(void **addr, size_t *size)
-{
-       int ret, len;
-       unsigned long tmp_addr;
-       size_t tmp_size;
-       const void *prop;
-
-       prop = of_get_property(of_chosen, "linux,ima-kexec-buffer", &len);
-       if (!prop)
-               return -ENOENT;
-
-       ret = do_get_kexec_buffer(prop, len, &tmp_addr, &tmp_size);
-       if (ret)
-               return ret;
-
-       *addr = __va(tmp_addr);
-       *size = tmp_size;
-
-       return 0;
-}
-
-/**
- * ima_free_kexec_buffer - free memory used by the IMA buffer
- */
-int ima_free_kexec_buffer(void)
-{
-       int ret;
-       unsigned long addr;
-       size_t size;
-       struct property *prop;
-
-       prop = of_find_property(of_chosen, "linux,ima-kexec-buffer", NULL);
-       if (!prop)
-               return -ENOENT;
-
-       ret = do_get_kexec_buffer(prop->value, prop->length, &addr, &size);
-       if (ret)
-               return ret;
-
-       ret = of_remove_property(of_chosen, prop);
-       if (ret)
-               return ret;
-
-       return memblock_free(addr, size);
-
-}
-
-/**
- * remove_ima_buffer - remove the IMA buffer property and reservation from @fdt
- *
- * The IMA measurement buffer is of no use to a subsequent kernel, so we always
- * remove it from the device tree.
- */
-void remove_ima_buffer(void *fdt, int chosen_node)
-{
-       int ret, len;
-       unsigned long addr;
-       size_t size;
-       const void *prop;
-
-       prop = fdt_getprop(fdt, chosen_node, "linux,ima-kexec-buffer", &len);
-       if (!prop)
-               return;
-
-       ret = do_get_kexec_buffer(prop, len, &addr, &size);
-       fdt_delprop(fdt, chosen_node, "linux,ima-kexec-buffer");
-       if (ret)
-               return;
-
-       ret = delete_fdt_mem_rsv(fdt, addr, size);
-       if (!ret)
-               pr_debug("Removed old IMA buffer reservation.\n");
-}
-
-#ifdef CONFIG_IMA_KEXEC
-static int write_number(void *p, u64 value, int cells)
-{
-       if (cells == 1) {
-               u32 tmp;
-
-               if (value > U32_MAX)
-                       return -EINVAL;
-
-               tmp = cpu_to_be32(value);
-               memcpy(p, &tmp, sizeof(tmp));
-       } else if (cells == 2) {
-               u64 tmp;
-
-               tmp = cpu_to_be64(value);
-               memcpy(p, &tmp, sizeof(tmp));
-       } else
-               return -EINVAL;
-
-       return 0;
-}
-
-/**
- * setup_ima_buffer - add IMA buffer information to the fdt
- * @image:             kexec image being loaded.
- * @fdt:               Flattened device tree for the next kernel.
- * @chosen_node:       Offset to the chosen node.
- *
- * Return: 0 on success, or negative errno on error.
- */
-int setup_ima_buffer(const struct kimage *image, void *fdt, int chosen_node)
-{
-       int ret, addr_cells, size_cells, entry_size;
-       u8 value[16];
-
-       remove_ima_buffer(fdt, chosen_node);
-       if (!image->ima_buffer_size)
-               return 0;
-
-       ret = get_addr_size_cells(&addr_cells, &size_cells);
-       if (ret)
-               return ret;
-
-       entry_size = 4 * (addr_cells + size_cells);
-
-       if (entry_size > sizeof(value))
-               return -EINVAL;
-
-       ret = write_number(value, image->ima_buffer_addr, addr_cells);
-       if (ret)
-               return ret;
-
-       ret = write_number(value + 4 * addr_cells, image->ima_buffer_size,
-                          size_cells);
-       if (ret)
-               return ret;
-
-       ret = fdt_setprop(fdt, chosen_node, "linux,ima-kexec-buffer", value,
-                         entry_size);
-       if (ret < 0)
-               return -EINVAL;
-
-       ret = fdt_add_mem_rsv(fdt, image->ima_buffer_addr,
-                             image->ima_buffer_size);
-       if (ret)
-               return -EINVAL;
-
-       pr_debug("IMA buffer at 0x%llx, size = 0x%zx\n",
-                image->ima_buffer_addr, image->ima_buffer_size);
-
-       return 0;
-}
-#endif /* CONFIG_IMA_KEXEC */
 
 
 #include <linux/kernel.h>
 #include <linux/kexec.h>
+#include <linux/memblock.h>
 #include <linux/libfdt.h>
 #include <linux/of.h>
 #include <linux/of_fdt.h>
        return -ENOENT;
 }
 
+/**
+ * get_addr_size_cells - Get address and size of root node
+ *
+ * @addr_cells: Return address of the root node
+ * @size_cells: Return size of the root node
+ *
+ * Return: 0 on success, or negative errno on error.
+ */
+static int get_addr_size_cells(int *addr_cells, int *size_cells)
+{
+       struct device_node *root;
+
+       root = of_find_node_by_path("/");
+       if (!root)
+               return -EINVAL;
+
+       *addr_cells = of_n_addr_cells(root);
+       *size_cells = of_n_size_cells(root);
+
+       of_node_put(root);
+
+       return 0;
+}
+
+/**
+ * do_get_kexec_buffer - Get address and size of device tree property
+ *
+ * @prop: Device tree property
+ * @len: Size of @prop
+ * @addr: Return address of the node
+ * @size: Return size of the node
+ *
+ * Return: 0 on success, or negative errno on error.
+ */
+static int do_get_kexec_buffer(const void *prop, int len, unsigned long *addr,
+                              size_t *size)
+{
+       int ret, addr_cells, size_cells;
+
+       ret = get_addr_size_cells(&addr_cells, &size_cells);
+       if (ret)
+               return ret;
+
+       if (len < 4 * (addr_cells + size_cells))
+               return -ENOENT;
+
+       *addr = of_read_number(prop, addr_cells);
+       *size = of_read_number(prop + 4 * addr_cells, size_cells);
+
+       return 0;
+}
+
+/**
+ * ima_get_kexec_buffer - get IMA buffer from the previous kernel
+ * @addr:      On successful return, set to point to the buffer contents.
+ * @size:      On successful return, set to the buffer size.
+ *
+ * Return: 0 on success, negative errno on error.
+ */
+int ima_get_kexec_buffer(void **addr, size_t *size)
+{
+       int ret, len;
+       unsigned long tmp_addr;
+       size_t tmp_size;
+       const void *prop;
+
+       if (!IS_ENABLED(CONFIG_HAVE_IMA_KEXEC))
+               return -ENOTSUPP;
+
+       prop = of_get_property(of_chosen, "linux,ima-kexec-buffer", &len);
+       if (!prop)
+               return -ENOENT;
+
+       ret = do_get_kexec_buffer(prop, len, &tmp_addr, &tmp_size);
+       if (ret)
+               return ret;
+
+       *addr = __va(tmp_addr);
+       *size = tmp_size;
+
+       return 0;
+}
+
+/**
+ * ima_free_kexec_buffer - free memory used by the IMA buffer
+ */
+int ima_free_kexec_buffer(void)
+{
+       int ret;
+       unsigned long addr;
+       size_t size;
+       struct property *prop;
+
+       if (!IS_ENABLED(CONFIG_HAVE_IMA_KEXEC))
+               return -ENOTSUPP;
+
+       prop = of_find_property(of_chosen, "linux,ima-kexec-buffer", NULL);
+       if (!prop)
+               return -ENOENT;
+
+       ret = do_get_kexec_buffer(prop->value, prop->length, &addr, &size);
+       if (ret)
+               return ret;
+
+       ret = of_remove_property(of_chosen, prop);
+       if (ret)
+               return ret;
+
+       return memblock_free(addr, size);
+
+}
+
+/**
+ * remove_ima_buffer - remove the IMA buffer property and reservation from @fdt
+ *
+ * @fdt: Flattened Device Tree to update
+ * @chosen_node: Offset to the chosen node in the device tree
+ *
+ * The IMA measurement buffer is of no use to a subsequent kernel, so we always
+ * remove it from the device tree.
+ */
+static void remove_ima_buffer(void *fdt, int chosen_node)
+{
+       int ret, len;
+       unsigned long addr;
+       size_t size;
+       const void *prop;
+
+       if (!IS_ENABLED(CONFIG_HAVE_IMA_KEXEC))
+               return;
+
+       prop = fdt_getprop(fdt, chosen_node, "linux,ima-kexec-buffer", &len);
+       if (!prop)
+               return;
+
+       ret = do_get_kexec_buffer(prop, len, &addr, &size);
+       fdt_delprop(fdt, chosen_node, "linux,ima-kexec-buffer");
+       if (ret)
+               return;
+
+       ret = fdt_find_and_del_mem_rsv(fdt, addr, size);
+       if (!ret)
+               pr_debug("Removed old IMA buffer reservation.\n");
+}
+
+#ifdef CONFIG_IMA_KEXEC
+/**
+ * write_number - Convert number to big-endian format
+ *
+ * @p:         Buffer to write the number to
+ * @value:     Number to convert
+ * @cells:     Number of cells
+ *
+ * Return: 0 on success, or negative errno on error.
+ */
+static int write_number(void *p, u64 value, int cells)
+{
+       if (cells == 1) {
+               u32 tmp;
+
+               if (value > U32_MAX)
+                       return -EINVAL;
+
+               tmp = cpu_to_be32(value);
+               memcpy(p, &tmp, sizeof(tmp));
+       } else if (cells == 2) {
+               u64 tmp;
+
+               tmp = cpu_to_be64(value);
+               memcpy(p, &tmp, sizeof(tmp));
+       } else
+               return -EINVAL;
+
+       return 0;
+}
+
+/**
+ * setup_ima_buffer - add IMA buffer information to the fdt
+ * @image:             kexec image being loaded.
+ * @fdt:               Flattened device tree for the next kernel.
+ * @chosen_node:       Offset to the chosen node.
+ *
+ * Return: 0 on success, or negative errno on error.
+ */
+static int setup_ima_buffer(const struct kimage *image, void *fdt,
+                           int chosen_node)
+{
+       int ret, addr_cells, size_cells, entry_size;
+       u8 value[16];
+
+       if (!image->ima_buffer_size)
+               return 0;
+
+       ret = get_addr_size_cells(&addr_cells, &size_cells);
+       if (ret)
+               return ret;
+
+       entry_size = 4 * (addr_cells + size_cells);
+
+       if (entry_size > sizeof(value))
+               return -EINVAL;
+
+       ret = write_number(value, image->ima_buffer_addr, addr_cells);
+       if (ret)
+               return ret;
+
+       ret = write_number(value + 4 * addr_cells, image->ima_buffer_size,
+                          size_cells);
+       if (ret)
+               return ret;
+
+       ret = fdt_setprop(fdt, chosen_node, "linux,ima-kexec-buffer", value,
+                         entry_size);
+       if (ret < 0)
+               return -EINVAL;
+
+       ret = fdt_add_mem_rsv(fdt, image->ima_buffer_addr,
+                             image->ima_buffer_size);
+       if (ret)
+               return -EINVAL;
+
+       pr_debug("IMA buffer at 0x%llx, size = 0x%zx\n",
+                image->ima_buffer_addr, image->ima_buffer_size);
+
+       return 0;
+}
+#else /* CONFIG_IMA_KEXEC */
+static inline int setup_ima_buffer(const struct kimage *image, void *fdt,
+                                  int chosen_node)
+{
+       return 0;
+}
+#endif /* CONFIG_IMA_KEXEC */
+
 /*
  * of_kexec_alloc_and_setup_fdt - Alloc and setup a new Flattened Device Tree
  *
        }
 
        ret = fdt_setprop(fdt, chosen_node, "linux,booted-from-kexec", NULL, 0);
+       if (ret)
+               goto out;
+
+       remove_ima_buffer(fdt, chosen_node);
+       ret = setup_ima_buffer(image, fdt, fdt_path_offset(fdt, "/chosen"));
 
 out:
        if (ret) {
 
                                   unsigned long initrd_load_addr,
                                   unsigned long initrd_len,
                                   const char *cmdline, size_t extra_fdt_size);
+int ima_get_kexec_buffer(void **addr, size_t *size);
+int ima_free_kexec_buffer(void);
 #else /* CONFIG_OF */
 
 static inline void of_core_init(void)
 
 
 #include "../integrity.h"
 
-#ifdef CONFIG_HAVE_IMA_KEXEC
-#include <asm/ima.h>
-#endif
-
 enum ima_show_type { IMA_SHOW_BINARY, IMA_SHOW_BINARY_NO_FIELD_LEN,
                     IMA_SHOW_BINARY_OLD_STRING_FMT, IMA_SHOW_ASCII };
 enum tpm_pcrs { TPM_PCR0 = 0, TPM_PCR8 = 8, TPM_PCR10 = 10 };
 
 #include <linux/seq_file.h>
 #include <linux/vmalloc.h>
 #include <linux/kexec.h>
+#include <linux/of.h>
 #include "ima.h"
 
 #ifdef CONFIG_IMA_KEXEC