kexec.h 7.7 KB
Newer Older
1 2 3
#ifndef LINUX_KEXEC_H
#define LINUX_KEXEC_H

4 5 6 7 8
/* 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.
 */

9
#include <linux/types.h>
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

/* 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
56 57 58
#include <linux/list.h>
#include <linux/linkage.h>
#include <linux/compat.h>
59
#include <linux/ioport.h>
60 61
#include <linux/elfcore.h>
#include <linux/elf.h>
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
#include <asm/kexec.h>

/* Verify architecture specific macros are defined */

#ifndef KEXEC_SOURCE_MEMORY_LIMIT
#error KEXEC_SOURCE_MEMORY_LIMIT not defined
#endif

#ifndef KEXEC_DESTINATION_MEMORY_LIMIT
#error KEXEC_DESTINATION_MEMORY_LIMIT not defined
#endif

#ifndef KEXEC_CONTROL_MEMORY_LIMIT
#error KEXEC_CONTROL_MEMORY_LIMIT not defined
#endif

78 79
#ifndef KEXEC_CONTROL_PAGE_SIZE
#error KEXEC_CONTROL_PAGE_SIZE not defined
80 81 82 83 84 85
#endif

#ifndef KEXEC_ARCH
#error KEXEC_ARCH not defined
#endif

86 87 88 89
#ifndef KEXEC_CRASH_CONTROL_MEMORY_LIMIT
#define KEXEC_CRASH_CONTROL_MEMORY_LIMIT KEXEC_CONTROL_MEMORY_LIMIT
#endif

90 91 92 93
#ifndef KEXEC_CRASH_MEM_ALIGN
#define KEXEC_CRASH_MEM_ALIGN PAGE_SIZE
#endif

94 95 96 97 98 99 100 101 102
#define KEXEC_NOTE_HEAD_BYTES ALIGN(sizeof(struct elf_note), 4)
#define KEXEC_CORE_NOTE_NAME "CORE"
#define KEXEC_CORE_NOTE_NAME_BYTES ALIGN(sizeof(KEXEC_CORE_NOTE_NAME), 4)
#define KEXEC_CORE_NOTE_DESC_BYTES ALIGN(sizeof(struct elf_prstatus), 4)
/*
 * The per-cpu notes area is a list of notes terminated by a "NULL"
 * note header.  For kdump, the code in vmcore.c runs in the context
 * of the second kernel to combine them into one note.
 */
103
#ifndef KEXEC_NOTE_BYTES
104 105 106
#define KEXEC_NOTE_BYTES ( (KEXEC_NOTE_HEAD_BYTES * 2) +		\
			    KEXEC_CORE_NOTE_NAME_BYTES +		\
			    KEXEC_CORE_NOTE_DESC_BYTES )
107
#endif
108

109 110 111 112 113 114 115 116 117 118 119 120 121 122
/*
 * This structure is used to hold the arguments that are used when loading
 * kernel binaries.
 */

typedef unsigned long kimage_entry_t;
#define IND_DESTINATION  0x1
#define IND_INDIRECTION  0x2
#define IND_DONE         0x4
#define IND_SOURCE       0x8

struct kexec_segment {
	void __user *buf;
	size_t bufsz;
123
	unsigned long mem;
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
	size_t memsz;
};

#ifdef CONFIG_COMPAT
struct compat_kexec_segment {
	compat_uptr_t buf;
	compat_size_t bufsz;
	compat_ulong_t mem;	/* User space sees this as a (void *) ... */
	compat_size_t memsz;
};
#endif

struct kimage {
	kimage_entry_t head;
	kimage_entry_t *entry;
	kimage_entry_t *last_entry;

	unsigned long destination;

	unsigned long start;
	struct page *control_code_page;
H
Huang Ying 已提交
145
	struct page *swap_page;
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160

	unsigned long nr_segments;
	struct kexec_segment segment[KEXEC_SEGMENT_MAX];

	struct list_head control_pages;
	struct list_head dest_pages;
	struct list_head unuseable_pages;

	/* Address of next control page to allocate for crash kernels. */
	unsigned long control_page;

	/* Flags to indicate special processing */
	unsigned int type : 1;
#define KEXEC_TYPE_DEFAULT 0
#define KEXEC_TYPE_CRASH   1
H
Huang Ying 已提交
161
	unsigned int preserve_context : 1;
162 163 164 165

#ifdef ARCH_HAS_KIMAGE_ARCH
	struct kimage_arch arch;
#endif
166 167 168 169 170
};



/* kexec interface functions */
H
Huang Ying 已提交
171
extern void machine_kexec(struct kimage *image);
172 173 174
extern int machine_kexec_prepare(struct kimage *image);
extern void machine_kexec_cleanup(struct kimage *image);
extern asmlinkage long sys_kexec_load(unsigned long entry,
M
Maneesh Soni 已提交
175 176 177
					unsigned long nr_segments,
					struct kexec_segment __user *segments,
					unsigned long flags);
H
Huang Ying 已提交
178
extern int kernel_kexec(void);
179 180
#ifdef CONFIG_COMPAT
extern asmlinkage long compat_sys_kexec_load(unsigned long entry,
M
Maneesh Soni 已提交
181 182 183
				unsigned long nr_segments,
				struct compat_kexec_segment __user *segments,
				unsigned long flags);
184
#endif
M
Maneesh Soni 已提交
185 186
extern struct page *kimage_alloc_control_pages(struct kimage *image,
						unsigned int order);
187 188
extern void crash_kexec(struct pt_regs *);
int kexec_should_crash(struct task_struct *);
189
void crash_save_cpu(struct pt_regs *regs, int cpu);
K
Ken'ichi Ohmichi 已提交
190
void crash_save_vmcoreinfo(void);
191 192
void crash_map_reserved_pages(void);
void crash_unmap_reserved_pages(void);
K
Ken'ichi Ohmichi 已提交
193
void arch_crash_save_vmcoreinfo(void);
194 195
__printf(1, 2)
void vmcoreinfo_append_str(const char *fmt, ...);
K
Ken'ichi Ohmichi 已提交
196 197
unsigned long paddr_vmcoreinfo_note(void);

198 199
#define VMCOREINFO_OSRELEASE(value) \
	vmcoreinfo_append_str("OSRELEASE=%s\n", value)
200 201
#define VMCOREINFO_PAGESIZE(value) \
	vmcoreinfo_append_str("PAGESIZE=%ld\n", value)
202
#define VMCOREINFO_SYMBOL(name) \
K
Ken'ichi Ohmichi 已提交
203
	vmcoreinfo_append_str("SYMBOL(%s)=%lx\n", #name, (unsigned long)&name)
204
#define VMCOREINFO_SIZE(name) \
205 206
	vmcoreinfo_append_str("SIZE(%s)=%lu\n", #name, \
			      (unsigned long)sizeof(name))
207 208 209
#define VMCOREINFO_STRUCT_SIZE(name) \
	vmcoreinfo_append_str("SIZE(%s)=%lu\n", #name, \
			      (unsigned long)sizeof(struct name))
210
#define VMCOREINFO_OFFSET(name, field) \
211
	vmcoreinfo_append_str("OFFSET(%s.%s)=%lu\n", #name, #field, \
212
			      (unsigned long)offsetof(struct name, field))
213
#define VMCOREINFO_LENGTH(name, value) \
214
	vmcoreinfo_append_str("LENGTH(%s)=%lu\n", #name, (unsigned long)value)
215
#define VMCOREINFO_NUMBER(name) \
216
	vmcoreinfo_append_str("NUMBER(%s)=%ld\n", #name, (long)name)
217
#define VMCOREINFO_CONFIG(name) \
K
Ken'ichi Ohmichi 已提交
218 219
	vmcoreinfo_append_str("CONFIG_%s=y\n", #name)

220
extern struct kimage *kexec_image;
221
extern struct kimage *kexec_crash_image;
222

Z
Zou Nan hai 已提交
223 224 225 226
#ifndef kexec_flush_icache_page
#define kexec_flush_icache_page(page)
#endif

H
Huang Ying 已提交
227 228 229 230 231 232
/* List of defined/legal kexec flags */
#ifndef CONFIG_KEXEC_JUMP
#define KEXEC_FLAGS    KEXEC_ON_CRASH
#else
#define KEXEC_FLAGS    (KEXEC_ON_CRASH | KEXEC_PRESERVE_CONTEXT)
#endif
233

K
Ken'ichi Ohmichi 已提交
234 235 236 237 238 239
#define VMCOREINFO_BYTES           (4096)
#define VMCOREINFO_NOTE_NAME       "VMCOREINFO"
#define VMCOREINFO_NOTE_NAME_BYTES ALIGN(sizeof(VMCOREINFO_NOTE_NAME), 4)
#define VMCOREINFO_NOTE_SIZE       (KEXEC_NOTE_HEAD_BYTES*2 + VMCOREINFO_BYTES \
				    + VMCOREINFO_NOTE_NAME_BYTES)

240 241 242
/* Location of a reserved region to hold the crash kernel.
 */
extern struct resource crashk_res;
243
typedef u32 note_buf_t[KEXEC_NOTE_BYTES/4];
244
extern note_buf_t __percpu *crash_notes;
K
Ken'ichi Ohmichi 已提交
245
extern u32 vmcoreinfo_note[VMCOREINFO_NOTE_SIZE/4];
246 247
extern size_t vmcoreinfo_size;
extern size_t vmcoreinfo_max_size;
248

B
Bernhard Walle 已提交
249 250
int __init parse_crashkernel(char *cmdline, unsigned long long system_ram,
		unsigned long long *crash_size, unsigned long long *crash_base);
251 252
int crash_shrink_memory(unsigned long new_size);
size_t crash_get_memory_size(void);
253
void crash_free_reserved_phys_range(unsigned long begin, unsigned long end);
Z
Zou Nan hai 已提交
254

255
#else /* !CONFIG_KEXEC */
256 257 258 259
struct pt_regs;
struct task_struct;
static inline void crash_kexec(struct pt_regs *regs) { }
static inline int kexec_should_crash(struct task_struct *p) { return 0; }
260
#endif /* CONFIG_KEXEC */
261
#endif /* __KERNEL__ */
262
#endif /* LINUX_KEXEC_H */