Commit 978e30c9 authored by Xunlei Pang's avatar Xunlei Pang Committed by Linus Torvalds

kexec: move some memembers and definitions within the scope of CONFIG_KEXEC_FILE

Move the stuff currently only used by the kexec file code within
CONFIG_KEXEC_FILE (and CONFIG_KEXEC_VERIFY_SIG).

Also move internal "struct kexec_sha_region" and "struct kexec_buf" into
"kexec_internal.h".
Signed-off-by: default avatarXunlei Pang <xlpang@redhat.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Dave Young <dyoung@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 2b24692b
...@@ -385,6 +385,7 @@ int arch_kimage_file_post_load_cleanup(struct kimage *image) ...@@ -385,6 +385,7 @@ int arch_kimage_file_post_load_cleanup(struct kimage *image)
return image->fops->cleanup(image->image_loader_data); return image->fops->cleanup(image->image_loader_data);
} }
#ifdef CONFIG_KEXEC_VERIFY_SIG
int arch_kexec_kernel_verify_sig(struct kimage *image, void *kernel, int arch_kexec_kernel_verify_sig(struct kimage *image, void *kernel,
unsigned long kernel_len) unsigned long kernel_len)
{ {
...@@ -395,6 +396,7 @@ int arch_kexec_kernel_verify_sig(struct kimage *image, void *kernel, ...@@ -395,6 +396,7 @@ int arch_kexec_kernel_verify_sig(struct kimage *image, void *kernel,
return image->fops->verify_sig(kernel, kernel_len); return image->fops->verify_sig(kernel, kernel_len);
} }
#endif
/* /*
* Apply purgatory relocations. * Apply purgatory relocations.
......
...@@ -109,11 +109,7 @@ struct compat_kexec_segment { ...@@ -109,11 +109,7 @@ struct compat_kexec_segment {
}; };
#endif #endif
struct kexec_sha_region { #ifdef CONFIG_KEXEC_FILE
unsigned long start;
unsigned long len;
};
struct purgatory_info { struct purgatory_info {
/* Pointer to elf header of read only purgatory */ /* Pointer to elf header of read only purgatory */
Elf_Ehdr *ehdr; Elf_Ehdr *ehdr;
...@@ -130,6 +126,28 @@ struct purgatory_info { ...@@ -130,6 +126,28 @@ struct purgatory_info {
unsigned long purgatory_load_addr; unsigned long purgatory_load_addr;
}; };
typedef int (kexec_probe_t)(const char *kernel_buf, unsigned long kernel_size);
typedef void *(kexec_load_t)(struct kimage *image, char *kernel_buf,
unsigned long kernel_len, char *initrd,
unsigned long initrd_len, char *cmdline,
unsigned long cmdline_len);
typedef int (kexec_cleanup_t)(void *loader_data);
#ifdef CONFIG_KEXEC_VERIFY_SIG
typedef int (kexec_verify_sig_t)(const char *kernel_buf,
unsigned long kernel_len);
#endif
struct kexec_file_ops {
kexec_probe_t *probe;
kexec_load_t *load;
kexec_cleanup_t *cleanup;
#ifdef CONFIG_KEXEC_VERIFY_SIG
kexec_verify_sig_t *verify_sig;
#endif
};
#endif
struct kimage { struct kimage {
kimage_entry_t head; kimage_entry_t head;
kimage_entry_t *entry; kimage_entry_t *entry;
...@@ -161,6 +179,7 @@ struct kimage { ...@@ -161,6 +179,7 @@ struct kimage {
struct kimage_arch arch; struct kimage_arch arch;
#endif #endif
#ifdef CONFIG_KEXEC_FILE
/* Additional fields for file based kexec syscall */ /* Additional fields for file based kexec syscall */
void *kernel_buf; void *kernel_buf;
unsigned long kernel_buf_len; unsigned long kernel_buf_len;
...@@ -179,38 +198,7 @@ struct kimage { ...@@ -179,38 +198,7 @@ struct kimage {
/* Information for loading purgatory */ /* Information for loading purgatory */
struct purgatory_info purgatory_info; struct purgatory_info purgatory_info;
}; #endif
/*
* Keeps track of buffer parameters as provided by caller for requesting
* memory placement of buffer.
*/
struct kexec_buf {
struct kimage *image;
char *buffer;
unsigned long bufsz;
unsigned long mem;
unsigned long memsz;
unsigned long buf_align;
unsigned long buf_min;
unsigned long buf_max;
bool top_down; /* allocate from top of memory hole */
};
typedef int (kexec_probe_t)(const char *kernel_buf, unsigned long kernel_size);
typedef void *(kexec_load_t)(struct kimage *image, char *kernel_buf,
unsigned long kernel_len, char *initrd,
unsigned long initrd_len, char *cmdline,
unsigned long cmdline_len);
typedef int (kexec_cleanup_t)(void *loader_data);
typedef int (kexec_verify_sig_t)(const char *kernel_buf,
unsigned long kernel_len);
struct kexec_file_ops {
kexec_probe_t *probe;
kexec_load_t *load;
kexec_cleanup_t *cleanup;
kexec_verify_sig_t *verify_sig;
}; };
/* kexec interface functions */ /* kexec interface functions */
......
...@@ -109,11 +109,13 @@ int __weak arch_kimage_file_post_load_cleanup(struct kimage *image) ...@@ -109,11 +109,13 @@ int __weak arch_kimage_file_post_load_cleanup(struct kimage *image)
return -EINVAL; return -EINVAL;
} }
#ifdef CONFIG_KEXEC_VERIFY_SIG
int __weak arch_kexec_kernel_verify_sig(struct kimage *image, void *buf, int __weak arch_kexec_kernel_verify_sig(struct kimage *image, void *buf,
unsigned long buf_len) unsigned long buf_len)
{ {
return -EKEYREJECTED; return -EKEYREJECTED;
} }
#endif
/* Apply relocations of type RELA */ /* Apply relocations of type RELA */
int __weak int __weak
......
...@@ -15,6 +15,27 @@ int kimage_is_destination_range(struct kimage *image, ...@@ -15,6 +15,27 @@ int kimage_is_destination_range(struct kimage *image,
extern struct mutex kexec_mutex; extern struct mutex kexec_mutex;
#ifdef CONFIG_KEXEC_FILE #ifdef CONFIG_KEXEC_FILE
struct kexec_sha_region {
unsigned long start;
unsigned long len;
};
/*
* Keeps track of buffer parameters as provided by caller for requesting
* memory placement of buffer.
*/
struct kexec_buf {
struct kimage *image;
char *buffer;
unsigned long bufsz;
unsigned long mem;
unsigned long memsz;
unsigned long buf_align;
unsigned long buf_min;
unsigned long buf_max;
bool top_down; /* allocate from top of memory hole */
};
void kimage_file_post_load_cleanup(struct kimage *image); void kimage_file_post_load_cleanup(struct kimage *image);
#else /* CONFIG_KEXEC_FILE */ #else /* CONFIG_KEXEC_FILE */
static inline void kimage_file_post_load_cleanup(struct kimage *image) { } static inline void kimage_file_post_load_cleanup(struct kimage *image) { }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment