|
@@ -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 */
|