kexec_file,x86,powerpc: factor out kexec_file_ops functions
As arch_kexec_kernel_image_{probe,load}(),
arch_kimage_file_post_load_cleanup() and arch_kexec_kernel_verify_sig()
are almost duplicated among architectures, they can be commonalized with
an architecture-defined kexec_file_ops array. So let's factor them out.
Link: http://lkml.kernel.org/r/20180306102303.9063-3-takahiro.akashi@linaro.org
Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
Acked-by: Dave Young <dyoung@redhat.com>
Tested-by: Dave Young <dyoung@redhat.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: Baoquan He <bhe@redhat.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
b799a09f63
commit
9ec4ecef0a
@@ -2,6 +2,6 @@
|
||||
#ifndef _ASM_KEXEC_BZIMAGE64_H
|
||||
#define _ASM_KEXEC_BZIMAGE64_H
|
||||
|
||||
extern struct kexec_file_ops kexec_bzImage64_ops;
|
||||
extern const struct kexec_file_ops kexec_bzImage64_ops;
|
||||
|
||||
#endif /* _ASM_KEXE_BZIMAGE64_H */
|
||||
|
||||
@@ -538,7 +538,7 @@ static int bzImage64_verify_sig(const char *kernel, unsigned long kernel_len)
|
||||
}
|
||||
#endif
|
||||
|
||||
struct kexec_file_ops kexec_bzImage64_ops = {
|
||||
const struct kexec_file_ops kexec_bzImage64_ops = {
|
||||
.probe = bzImage64_probe,
|
||||
.load = bzImage64_load,
|
||||
.cleanup = bzImage64_cleanup,
|
||||
|
||||
@@ -30,8 +30,9 @@
|
||||
#include <asm/set_memory.h>
|
||||
|
||||
#ifdef CONFIG_KEXEC_FILE
|
||||
static struct kexec_file_ops *kexec_file_loaders[] = {
|
||||
const struct kexec_file_ops * const kexec_file_loaders[] = {
|
||||
&kexec_bzImage64_ops,
|
||||
NULL
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -364,27 +365,6 @@ void arch_crash_save_vmcoreinfo(void)
|
||||
/* arch-dependent functionality related to kexec file-based syscall */
|
||||
|
||||
#ifdef CONFIG_KEXEC_FILE
|
||||
int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
|
||||
unsigned long buf_len)
|
||||
{
|
||||
int i, ret = -ENOEXEC;
|
||||
struct kexec_file_ops *fops;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(kexec_file_loaders); i++) {
|
||||
fops = kexec_file_loaders[i];
|
||||
if (!fops || !fops->probe)
|
||||
continue;
|
||||
|
||||
ret = fops->probe(buf, buf_len);
|
||||
if (!ret) {
|
||||
image->fops = fops;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void *arch_kexec_kernel_image_load(struct kimage *image)
|
||||
{
|
||||
vfree(image->arch.elf_headers);
|
||||
@@ -399,27 +379,6 @@ void *arch_kexec_kernel_image_load(struct kimage *image)
|
||||
image->cmdline_buf_len);
|
||||
}
|
||||
|
||||
int arch_kimage_file_post_load_cleanup(struct kimage *image)
|
||||
{
|
||||
if (!image->fops || !image->fops->cleanup)
|
||||
return 0;
|
||||
|
||||
return image->fops->cleanup(image->image_loader_data);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KEXEC_VERIFY_SIG
|
||||
int arch_kexec_kernel_verify_sig(struct kimage *image, void *kernel,
|
||||
unsigned long kernel_len)
|
||||
{
|
||||
if (!image->fops || !image->fops->verify_sig) {
|
||||
pr_debug("kernel loader does not support signature verification.");
|
||||
return -EKEYREJECTED;
|
||||
}
|
||||
|
||||
return image->fops->verify_sig(kernel, kernel_len);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Apply purgatory relocations.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user