1#ifndef LINUX_KEXEC_H
2#define LINUX_KEXEC_H
3
4#ifdef CONFIG_KEXEC
5#include <linux/types.h>
6#include <linux/list.h>
7#include <linux/linkage.h>
8#include <linux/compat.h>
9#include <linux/ioport.h>
10#include <asm/kexec.h>
11
12/* Verify architecture specific macros are defined */
13
14#ifndef KEXEC_SOURCE_MEMORY_LIMIT
15#error KEXEC_SOURCE_MEMORY_LIMIT not defined
16#endif
17
18#ifndef KEXEC_DESTINATION_MEMORY_LIMIT
19#error KEXEC_DESTINATION_MEMORY_LIMIT not defined
20#endif
21
22#ifndef KEXEC_CONTROL_MEMORY_LIMIT
23#error KEXEC_CONTROL_MEMORY_LIMIT not defined
24#endif
25
26#ifndef KEXEC_CONTROL_CODE_SIZE
27#error KEXEC_CONTROL_CODE_SIZE not defined
28#endif
29
30#ifndef KEXEC_ARCH
31#error KEXEC_ARCH not defined
32#endif
33
34/*
35 * This structure is used to hold the arguments that are used when loading
36 * kernel binaries.
37 */
38
39typedef unsigned long kimage_entry_t;
40#define IND_DESTINATION  0x1
41#define IND_INDIRECTION  0x2
42#define IND_DONE         0x4
43#define IND_SOURCE       0x8
44
45#define KEXEC_SEGMENT_MAX 16
46struct kexec_segment {
47	void __user *buf;
48	size_t bufsz;
49	unsigned long mem;	/* User space sees this as a (void *) ... */
50	size_t memsz;
51};
52
53#ifdef CONFIG_COMPAT
54struct compat_kexec_segment {
55	compat_uptr_t buf;
56	compat_size_t bufsz;
57	compat_ulong_t mem;	/* User space sees this as a (void *) ... */
58	compat_size_t memsz;
59};
60#endif
61
62struct kimage {
63	kimage_entry_t head;
64	kimage_entry_t *entry;
65	kimage_entry_t *last_entry;
66
67	unsigned long destination;
68
69	unsigned long start;
70	struct page *control_code_page;
71
72	unsigned long nr_segments;
73	struct kexec_segment segment[KEXEC_SEGMENT_MAX];
74
75	struct list_head control_pages;
76	struct list_head dest_pages;
77	struct list_head unuseable_pages;
78
79	/* Address of next control page to allocate for crash kernels. */
80	unsigned long control_page;
81
82	/* Flags to indicate special processing */
83	unsigned int type : 1;
84#define KEXEC_TYPE_DEFAULT 0
85#define KEXEC_TYPE_CRASH   1
86};
87
88
89
90/* kexec interface functions */
91extern NORET_TYPE void machine_kexec(struct kimage *image) ATTRIB_NORET;
92extern int machine_kexec_prepare(struct kimage *image);
93extern void machine_kexec_cleanup(struct kimage *image);
94extern asmlinkage long sys_kexec_load(unsigned long entry,
95					unsigned long nr_segments,
96					struct kexec_segment __user *segments,
97					unsigned long flags);
98#ifdef CONFIG_COMPAT
99extern asmlinkage long compat_sys_kexec_load(unsigned long entry,
100				unsigned long nr_segments,
101				struct compat_kexec_segment __user *segments,
102				unsigned long flags);
103#endif
104extern struct page *kimage_alloc_control_pages(struct kimage *image,
105						unsigned int order);
106extern void crash_kexec(struct pt_regs *);
107int kexec_should_crash(struct task_struct *);
108extern struct kimage *kexec_image;
109extern struct kimage *kexec_crash_image;
110
111#define KEXEC_ON_CRASH  0x00000001
112#define KEXEC_ARCH_MASK 0xffff0000
113
114/* These values match the ELF architecture values.
115 * Unless there is a good reason that should continue to be the case.
116 */
117#define KEXEC_ARCH_DEFAULT ( 0 << 16)
118#define KEXEC_ARCH_386     ( 3 << 16)
119#define KEXEC_ARCH_X86_64  (62 << 16)
120#define KEXEC_ARCH_PPC     (20 << 16)
121#define KEXEC_ARCH_PPC64   (21 << 16)
122#define KEXEC_ARCH_IA_64   (50 << 16)
123#define KEXEC_ARCH_S390    (22 << 16)
124#define KEXEC_ARCH_SH      (42 << 16)
125
126#define KEXEC_FLAGS    (KEXEC_ON_CRASH)  /* List of defined/legal kexec flags */
127
128/* Location of a reserved region to hold the crash kernel.
129 */
130extern struct resource crashk_res;
131typedef u32 note_buf_t[MAX_NOTE_BYTES/4];
132extern note_buf_t *crash_notes;
133
134#else /* !CONFIG_KEXEC */
135struct pt_regs;
136struct task_struct;
137static inline void crash_kexec(struct pt_regs *regs) { }
138static inline int kexec_should_crash(struct task_struct *p) { return 0; }
139#endif /* CONFIG_KEXEC */
140#endif /* LINUX_KEXEC_H */
141