diff options
Diffstat (limited to 'include/linux/kexec.h')
| -rw-r--r-- | include/linux/kexec.h | 75 | 
1 files changed, 53 insertions, 22 deletions
diff --git a/include/linux/kexec.h b/include/linux/kexec.h index 0d7d6a1b172..37c5f726114 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h @@ -1,8 +1,58 @@  #ifndef LINUX_KEXEC_H  #define LINUX_KEXEC_H -#ifdef CONFIG_KEXEC +/* kexec system call -  It loads the new kernel to boot into. + * kexec does not sync, or unmount filesystems so if you need + * that to happen you need to do that yourself. + */ +  #include <linux/types.h> + +/* kexec flags for different usage scenarios */ +#define KEXEC_ON_CRASH		0x00000001 +#define KEXEC_PRESERVE_CONTEXT	0x00000002 +#define KEXEC_ARCH_MASK		0xffff0000 + +/* These values match the ELF architecture values. + * Unless there is a good reason that should continue to be the case. + */ +#define KEXEC_ARCH_DEFAULT ( 0 << 16) +#define KEXEC_ARCH_386     ( 3 << 16) +#define KEXEC_ARCH_X86_64  (62 << 16) +#define KEXEC_ARCH_PPC     (20 << 16) +#define KEXEC_ARCH_PPC64   (21 << 16) +#define KEXEC_ARCH_IA_64   (50 << 16) +#define KEXEC_ARCH_ARM     (40 << 16) +#define KEXEC_ARCH_S390    (22 << 16) +#define KEXEC_ARCH_SH      (42 << 16) +#define KEXEC_ARCH_MIPS_LE (10 << 16) +#define KEXEC_ARCH_MIPS    ( 8 << 16) + +/* The artificial cap on the number of segments passed to kexec_load. */ +#define KEXEC_SEGMENT_MAX 16 + +#ifndef __KERNEL__ +/* + * This structure is used to hold the arguments that are used when + * loading  kernel binaries. + */ +struct kexec_segment { +	const void *buf; +	size_t bufsz; +	const void *mem; +	size_t memsz; +}; + +/* Load a new kernel image as described by the kexec_segment array + * consisting of passed number of segments at the entry-point address. + * The flags allow different useage types. + */ +extern int kexec_load(void *, size_t, struct kexec_segment *, +		unsigned long int); +#endif /* __KERNEL__ */ + +#ifdef __KERNEL__ +#ifdef CONFIG_KEXEC  #include <linux/list.h>  #include <linux/linkage.h>  #include <linux/compat.h> @@ -67,11 +117,10 @@ typedef unsigned long kimage_entry_t;  #define IND_DONE         0x4  #define IND_SOURCE       0x8 -#define KEXEC_SEGMENT_MAX 16  struct kexec_segment {  	void __user *buf;  	size_t bufsz; -	unsigned long mem;	/* User space sees this as a (void *) ... */ +	unsigned long mem;  	size_t memsz;  }; @@ -175,25 +224,6 @@ extern struct kimage *kexec_crash_image;  #define kexec_flush_icache_page(page)  #endif -#define KEXEC_ON_CRASH		0x00000001 -#define KEXEC_PRESERVE_CONTEXT	0x00000002 -#define KEXEC_ARCH_MASK		0xffff0000 - -/* These values match the ELF architecture values. - * Unless there is a good reason that should continue to be the case. - */ -#define KEXEC_ARCH_DEFAULT ( 0 << 16) -#define KEXEC_ARCH_386     ( 3 << 16) -#define KEXEC_ARCH_X86_64  (62 << 16) -#define KEXEC_ARCH_PPC     (20 << 16) -#define KEXEC_ARCH_PPC64   (21 << 16) -#define KEXEC_ARCH_IA_64   (50 << 16) -#define KEXEC_ARCH_ARM     (40 << 16) -#define KEXEC_ARCH_S390    (22 << 16) -#define KEXEC_ARCH_SH      (42 << 16) -#define KEXEC_ARCH_MIPS_LE (10 << 16) -#define KEXEC_ARCH_MIPS    ( 8 << 16) -  /* List of defined/legal kexec flags */  #ifndef CONFIG_KEXEC_JUMP  #define KEXEC_FLAGS    KEXEC_ON_CRASH @@ -228,4 +258,5 @@ struct task_struct;  static inline void crash_kexec(struct pt_regs *regs) { }  static inline int kexec_should_crash(struct task_struct *p) { return 0; }  #endif /* CONFIG_KEXEC */ +#endif /* __KERNEL__ */  #endif /* LINUX_KEXEC_H */  |