Commit 74ca317c authored by Vivek Goyal's avatar Vivek Goyal Committed by Linus Torvalds
Browse files

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: default avatarVivek Goyal <vgoyal@redhat.com>
Cc: Eric Biederman <ebiederm@xmission.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Tested-by: default avatarShaun Ruffell <sruffell@digium.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent b38af472
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -17,6 +17,4 @@ obj-$(CONFIG_IA32_EMULATION) += ia32/
obj-y += platform/
obj-y += net/

ifeq ($(CONFIG_X86_64),y)
obj-$(CONFIG_KEXEC) += purgatory/
endif
obj-$(CONFIG_KEXEC_FILE) += purgatory/
+14 −4
Original line number Diff line number Diff line
@@ -1585,9 +1585,6 @@ source kernel/Kconfig.hz

config KEXEC
	bool "kexec system call"
	select BUILD_BIN2C
	select CRYPTO
	select CRYPTO_SHA256
	---help---
	  kexec is a system call that implements the ability to shutdown your
	  current kernel, and to start another kernel.  It is like a reboot
@@ -1602,9 +1599,22 @@ config KEXEC
	  interface is strongly in flux, so no good recommendation can be
	  made.

config KEXEC_FILE
	bool "kexec file based system call"
	select BUILD_BIN2C
	depends on KEXEC
	depends on X86_64
	depends on CRYPTO=y
	depends on CRYPTO_SHA256=y
	---help---
	  This is new version of kexec system call. This system call is
	  file based and takes file descriptors as system call argument
	  for kernel and initramfs as opposed to list of segments as
	  accepted by previous system call.

config KEXEC_VERIFY_SIG
	bool "Verify kernel signature during kexec_file_load() syscall"
	depends on KEXEC
	depends on KEXEC_FILE
	---help---
	  This option makes kernel signature verification mandatory for
	  kexec_file_load() syscall. If kernel is signature can not be
+1 −4
Original line number Diff line number Diff line
@@ -184,12 +184,9 @@ archheaders:
	$(Q)$(MAKE) $(build)=arch/x86/syscalls all

archprepare:
ifeq ($(CONFIG_KEXEC),y)
# Build only for 64bit. No loaders for 32bit yet.
 ifeq ($(CONFIG_X86_64),y)
ifeq ($(CONFIG_KEXEC_FILE),y)
	$(Q)$(MAKE) $(build)=arch/x86/purgatory arch/x86/purgatory/kexec-purgatory.c
endif
endif

###
# Kernel objects
+1 −1
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ obj-$(CONFIG_FTRACE_SYSCALLS) += ftrace.o
obj-$(CONFIG_X86_TSC)		+= trace_clock.o
obj-$(CONFIG_KEXEC)		+= machine_kexec_$(BITS).o
obj-$(CONFIG_KEXEC)		+= relocate_kernel_$(BITS).o crash.o
obj-$(CONFIG_KEXEC_FILE)	+= kexec-bzimage64.o
obj-$(CONFIG_CRASH_DUMP)	+= crash_dump_$(BITS).o
obj-y				+= kprobes/
obj-$(CONFIG_MODULES)		+= module.o
@@ -118,5 +119,4 @@ ifeq ($(CONFIG_X86_64),y)

	obj-$(CONFIG_PCI_MMCONFIG)	+= mmconf-fam10h_64.o
	obj-y				+= vsmp_64.o
	obj-$(CONFIG_KEXEC)		+= kexec-bzimage64.o
endif
+2 −4
Original line number Diff line number Diff line
@@ -182,8 +182,7 @@ void native_machine_crash_shutdown(struct pt_regs *regs)
	crash_save_cpu(regs, safe_smp_processor_id());
}

#ifdef CONFIG_X86_64

#ifdef CONFIG_KEXEC_FILE
static int get_nr_ram_ranges_callback(unsigned long start_pfn,
				unsigned long nr_pfn, void *arg)
{
@@ -696,5 +695,4 @@ int crash_load_segments(struct kimage *image)

	return ret;
}

#endif /* CONFIG_X86_64 */
#endif /* CONFIG_KEXEC_FILE */
Loading