powerpc/kexec_file: Mark PPC64 specific code
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
This commit is contained in:
parent
f891f19736
commit
19031275a5
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
@ -20,22 +20,7 @@
|
|||
#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
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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 $@
|
||||
|
|
Loading…
Reference in New Issue