kexec: create a new config option CONFIG_KEXEC_FILE for new syscall
Currently new system call kexec_file_load() and all the associated code compiles if CONFIG_KEXEC=y. But new syscall also compiles purgatory code which currently uses gcc option -mcmodel=large. This option seems to be available only gcc 4.4 onwards. Hiding new functionality behind a new config option will not break existing users of old gcc. Those who wish to enable new functionality will require new gcc. Having said that, I am trying to figure out how can I move away from using -mcmodel=large but that can take a while. I think there are other advantages of introducing this new config option. As this option will be enabled only on x86_64, other arches don't have to compile generic kexec code which will never be used. This new code selects CRYPTO=y and CRYPTO_SHA256=y. And all other arches had to do this for CONFIG_KEXEC. Now with introduction of new config option, we can remove crypto dependency from other arches. Now CONFIG_KEXEC_FILE is available only on x86_64. So whereever I had CONFIG_X86_64 defined, I got rid of that. For CONFIG_KEXEC_FILE, instead of doing select CRYPTO=y, I changed it to "depends on CRYPTO=y". This should be safer as "select" is not recursive. Signed-off-by: Vivek Goyal <vgoyal@redhat.com> Cc: Eric Biederman <ebiederm@xmission.com> Cc: H. Peter Anvin <hpa@zytor.com> Tested-by: Shaun Ruffell <sruffell@digium.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
b38af4721f
commit
74ca317c26
@@ -64,7 +64,9 @@ bool kexec_in_progress = false;
|
||||
char __weak kexec_purgatory[0];
|
||||
size_t __weak kexec_purgatory_size = 0;
|
||||
|
||||
#ifdef CONFIG_KEXEC_FILE
|
||||
static int kexec_calculate_store_digests(struct kimage *image);
|
||||
#endif
|
||||
|
||||
/* Location of the reserved area for the crash kernel */
|
||||
struct resource crashk_res = {
|
||||
@@ -341,6 +343,7 @@ out_free_image:
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KEXEC_FILE
|
||||
static int copy_file_from_fd(int fd, void **buf, unsigned long *buf_len)
|
||||
{
|
||||
struct fd f = fdget(fd);
|
||||
@@ -612,6 +615,9 @@ out_free_image:
|
||||
kfree(image);
|
||||
return ret;
|
||||
}
|
||||
#else /* CONFIG_KEXEC_FILE */
|
||||
static inline void kimage_file_post_load_cleanup(struct kimage *image) { }
|
||||
#endif /* CONFIG_KEXEC_FILE */
|
||||
|
||||
static int kimage_is_destination_range(struct kimage *image,
|
||||
unsigned long start,
|
||||
@@ -1375,6 +1381,7 @@ COMPAT_SYSCALL_DEFINE4(kexec_load, compat_ulong_t, entry,
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_KEXEC_FILE
|
||||
SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd, int, initrd_fd,
|
||||
unsigned long, cmdline_len, const char __user *, cmdline_ptr,
|
||||
unsigned long, flags)
|
||||
@@ -1451,6 +1458,8 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_KEXEC_FILE */
|
||||
|
||||
void crash_kexec(struct pt_regs *regs)
|
||||
{
|
||||
/* Take the kexec_mutex here to prevent sys_kexec_load
|
||||
@@ -2006,6 +2015,7 @@ static int __init crash_save_vmcoreinfo_init(void)
|
||||
|
||||
subsys_initcall(crash_save_vmcoreinfo_init);
|
||||
|
||||
#ifdef CONFIG_KEXEC_FILE
|
||||
static int __kexec_add_segment(struct kimage *image, char *buf,
|
||||
unsigned long bufsz, unsigned long mem,
|
||||
unsigned long memsz)
|
||||
@@ -2682,6 +2692,7 @@ int kexec_purgatory_get_set_symbol(struct kimage *image, const char *name,
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_KEXEC_FILE */
|
||||
|
||||
/*
|
||||
* Move into place and start executing a preloaded standalone
|
||||
|
Reference in New Issue
Block a user