Blame view

include/linux/kexec.h 11 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  /* SPDX-License-Identifier: GPL-2.0 */
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
2
3
  #ifndef LINUX_KEXEC_H
  #define LINUX_KEXEC_H
cf2df6396   Geoff Levand   kexec: add bit de...
4
5
6
7
8
9
10
11
12
  #define IND_DESTINATION_BIT 0
  #define IND_INDIRECTION_BIT 1
  #define IND_DONE_BIT        2
  #define IND_SOURCE_BIT      3
  
  #define IND_DESTINATION  (1 << IND_DESTINATION_BIT)
  #define IND_INDIRECTION  (1 << IND_INDIRECTION_BIT)
  #define IND_DONE         (1 << IND_DONE_BIT)
  #define IND_SOURCE       (1 << IND_SOURCE_BIT)
b28c2ee86   Geoff Levand   kexec: add IND_FL...
13
  #define IND_FLAGS (IND_DESTINATION | IND_INDIRECTION | IND_DONE | IND_SOURCE)
cf2df6396   Geoff Levand   kexec: add bit de...
14
15
  
  #if !defined(__ASSEMBLY__)
692f66f26   Hari Bathini   crash: move crash...
16
  #include <linux/crash_core.h>
43546d866   Russell King   kexec: allow arch...
17
  #include <asm/io.h>
607ca46e9   David Howells   UAPI: (Scripted) ...
18
  #include <uapi/linux/kexec.h>
29a5c67e7   maximilian attems   kexec: export kex...
19

2965faa5e   Dave Young   kexec: split kexe...
20
  #ifdef CONFIG_KEXEC_CORE
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
21
  #include <linux/list.h>
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
22
  #include <linux/compat.h>
9c15e852a   Haren Myneni   [PATCH] kexec: fi...
23
  #include <linux/ioport.h>
12db5562e   Vivek Goyal   kexec: load and r...
24
  #include <linux/module.h>
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  #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
7e01b5acd   Martin Schwidefsky   kexec: allocate t...
40
  #ifndef KEXEC_CONTROL_MEMORY_GFP
dc5cccacf   Russell King   kexec: don't invo...
41
  #define KEXEC_CONTROL_MEMORY_GFP (GFP_KERNEL | __GFP_NORETRY)
7e01b5acd   Martin Schwidefsky   kexec: allocate t...
42
  #endif
163f6876f   Huang Ying   kexec jump: renam...
43
44
  #ifndef KEXEC_CONTROL_PAGE_SIZE
  #error KEXEC_CONTROL_PAGE_SIZE not defined
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
45
46
47
48
49
  #endif
  
  #ifndef KEXEC_ARCH
  #error KEXEC_ARCH not defined
  #endif
3d214faea   Michael Holzheu   [S390] kdump: Add...
50
51
52
  #ifndef KEXEC_CRASH_CONTROL_MEMORY_LIMIT
  #define KEXEC_CRASH_CONTROL_MEMORY_LIMIT KEXEC_CONTROL_MEMORY_LIMIT
  #endif
558df7209   Michael Holzheu   [S390] kdump: Add...
53
54
55
  #ifndef KEXEC_CRASH_MEM_ALIGN
  #define KEXEC_CRASH_MEM_ALIGN PAGE_SIZE
  #endif
692f66f26   Hari Bathini   crash: move crash...
56
  #define KEXEC_CORE_NOTE_NAME	CRASH_CORE_NOTE_NAME
6672f76a5   Simon Horman   kdump/kexec: calc...
57
  /*
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
58
59
60
61
62
   * This structure is used to hold the arguments that are used when loading
   * kernel binaries.
   */
  
  typedef unsigned long kimage_entry_t;
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
63

dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
64
  struct kexec_segment {
815d5704a   Vivek Goyal   kexec: make kexec...
65
66
67
68
69
70
71
72
73
74
75
76
  	/*
  	 * This pointer can point to user memory if kexec_load() system
  	 * call is used or will point to kernel memory if
  	 * kexec_file_load() system call is used.
  	 *
  	 * Use ->buf when expecting to deal with user memory and use ->kbuf
  	 * when expecting to deal with kernel memory.
  	 */
  	union {
  		void __user *buf;
  		void *kbuf;
  	};
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
77
  	size_t bufsz;
29a5c67e7   maximilian attems   kexec: export kex...
78
  	unsigned long mem;
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
79
80
81
82
83
84
85
86
87
88
89
  	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
978e30c9b   Xunlei Pang   kexec: move some ...
90
  #ifdef CONFIG_KEXEC_FILE
12db5562e   Vivek Goyal   kexec: load and r...
91
  struct purgatory_info {
65c225d32   Philipp Rudo   kernel/kexec_file...
92
93
94
95
96
97
98
99
100
  	/*
  	 * Pointer to elf header at the beginning of kexec_purgatory.
  	 * Note: kexec_purgatory is read only
  	 */
  	const Elf_Ehdr *ehdr;
  	/*
  	 * Temporary, modifiable buffer for sechdrs used for relocation.
  	 * This memory can be freed post image load.
  	 */
12db5562e   Vivek Goyal   kexec: load and r...
101
102
  	Elf_Shdr *sechdrs;
  	/*
65c225d32   Philipp Rudo   kernel/kexec_file...
103
104
  	 * Temporary, modifiable buffer for stripped purgatory used for
  	 * relocation. This memory can be freed post image load.
12db5562e   Vivek Goyal   kexec: load and r...
105
106
  	 */
  	void *purgatory_buf;
12db5562e   Vivek Goyal   kexec: load and r...
107
  };
ee6ebeda8   Philipp Rudo   include/linux/kex...
108
  struct kimage;
978e30c9b   Xunlei Pang   kexec: move some ...
109
110
111
112
113
114
  typedef int (kexec_probe_t)(const char *kernel_buf, unsigned long kernel_size);
  typedef void *(kexec_load_t)(struct kimage *image, char *kernel_buf,
  			     unsigned long kernel_len, char *initrd,
  			     unsigned long initrd_len, char *cmdline,
  			     unsigned long cmdline_len);
  typedef int (kexec_cleanup_t)(void *loader_data);
99d5cadfd   Jiri Bohac   kexec_file: split...
115
  #ifdef CONFIG_KEXEC_SIG
978e30c9b   Xunlei Pang   kexec: move some ...
116
117
118
119
120
121
122
123
  typedef int (kexec_verify_sig_t)(const char *kernel_buf,
  				 unsigned long kernel_len);
  #endif
  
  struct kexec_file_ops {
  	kexec_probe_t *probe;
  	kexec_load_t *load;
  	kexec_cleanup_t *cleanup;
99d5cadfd   Jiri Bohac   kexec_file: split...
124
  #ifdef CONFIG_KEXEC_SIG
978e30c9b   Xunlei Pang   kexec: move some ...
125
126
127
  	kexec_verify_sig_t *verify_sig;
  #endif
  };
60fe3910b   Thiago Jung Bauermann   kexec_file: Allow...
128

9ec4ecef0   AKASHI Takahiro   kexec_file,x86,po...
129
130
131
132
  extern const struct kexec_file_ops * const kexec_file_loaders[];
  
  int kexec_image_probe_default(struct kimage *image, void *buf,
  			      unsigned long buf_len);
92a98a2b9   AKASHI Takahiro   kexec_file: make ...
133
  int kexec_image_post_load_cleanup_default(struct kimage *image);
9ec4ecef0   AKASHI Takahiro   kexec_file,x86,po...
134

b6664ba42   AKASHI Takahiro   s390, kexec_file:...
135
136
137
138
139
140
141
  /*
   * If kexec_buf.mem is set to this value, kexec_locate_mem_hole()
   * will try to allocate free memory. Arch may overwrite it.
   */
  #ifndef KEXEC_BUF_MEM_UNKNOWN
  #define KEXEC_BUF_MEM_UNKNOWN 0
  #endif
60fe3910b   Thiago Jung Bauermann   kexec_file: Allow...
142
143
144
145
146
147
148
149
150
151
152
153
154
155
  /**
   * struct kexec_buf - parameters for finding a place for a buffer in memory
   * @image:	kexec image in which memory to search.
   * @buffer:	Contents which will be copied to the allocated memory.
   * @bufsz:	Size of @buffer.
   * @mem:	On return will have address of the buffer in memory.
   * @memsz:	Size for the buffer in memory.
   * @buf_align:	Minimum alignment needed.
   * @buf_min:	The buffer can't be placed below this address.
   * @buf_max:	The buffer can't be placed above this address.
   * @top_down:	Allocate from top of memory.
   */
  struct kexec_buf {
  	struct kimage *image;
ec2b9bfaa   Thiago Jung Bauermann   kexec_file: Chang...
156
  	void *buffer;
60fe3910b   Thiago Jung Bauermann   kexec_file: Allow...
157
158
159
160
161
162
163
164
  	unsigned long bufsz;
  	unsigned long mem;
  	unsigned long memsz;
  	unsigned long buf_align;
  	unsigned long buf_min;
  	unsigned long buf_max;
  	bool top_down;
  };
3be3f61d2   Philipp Rudo   kernel/kexec_file...
165
166
167
168
169
  int kexec_load_purgatory(struct kimage *image, struct kexec_buf *kbuf);
  int kexec_purgatory_get_set_symbol(struct kimage *image, const char *name,
  				   void *buf, unsigned int size,
  				   bool get_value);
  void *kexec_purgatory_get_symbol_addr(struct kimage *image, const char *name);
f891f1973   Hari Bathini   kexec_file: Allow...
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
  /* Architectures may override the below functions */
  int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
  				  unsigned long buf_len);
  void *arch_kexec_kernel_image_load(struct kimage *image);
  int arch_kexec_apply_relocations_add(struct purgatory_info *pi,
  				     Elf_Shdr *section,
  				     const Elf_Shdr *relsec,
  				     const Elf_Shdr *symtab);
  int arch_kexec_apply_relocations(struct purgatory_info *pi,
  				 Elf_Shdr *section,
  				 const Elf_Shdr *relsec,
  				 const Elf_Shdr *symtab);
  int arch_kimage_file_post_load_cleanup(struct kimage *image);
  #ifdef CONFIG_KEXEC_SIG
  int arch_kexec_kernel_verify_sig(struct kimage *image, void *buf,
  				 unsigned long buf_len);
  #endif
  int arch_kexec_locate_mem_hole(struct kexec_buf *kbuf);
8aec395b8   Philipp Rudo   kernel/kexec_file...
188

ec2b9bfaa   Thiago Jung Bauermann   kexec_file: Chang...
189
  extern int kexec_add_buffer(struct kexec_buf *kbuf);
e2e806f9e   Thiago Jung Bauermann   kexec_file: Facto...
190
  int kexec_locate_mem_hole(struct kexec_buf *kbuf);
babac4a84   AKASHI Takahiro   kexec_file, x86: ...
191
192
193
194
195
196
197
198
199
200
201
  
  /* Alignment required for elf header segment */
  #define ELF_CORE_HEADER_ALIGN   4096
  
  struct crash_mem_range {
  	u64 start, end;
  };
  
  struct crash_mem {
  	unsigned int max_nr_ranges;
  	unsigned int nr_ranges;
50b6951fe   Gustavo A. R. Silva   kexec: Replace ze...
202
  	struct crash_mem_range ranges[];
babac4a84   AKASHI Takahiro   kexec_file, x86: ...
203
204
205
206
207
208
209
  };
  
  extern int crash_exclude_mem_range(struct crash_mem *mem,
  				   unsigned long long mstart,
  				   unsigned long long mend);
  extern int crash_prepare_elf64_headers(struct crash_mem *mem, int kernel_map,
  				       void **addr, unsigned long *sz);
60fe3910b   Thiago Jung Bauermann   kexec_file: Allow...
210
  #endif /* CONFIG_KEXEC_FILE */
978e30c9b   Xunlei Pang   kexec: move some ...
211

175fca3bf   Sven Schnelle   kexec: add KEXEC_ELF
212
213
214
215
216
217
218
219
220
221
  #ifdef CONFIG_KEXEC_ELF
  struct kexec_elf_info {
  	/*
  	 * Where the ELF binary contents are kept.
  	 * Memory managed by the user of the struct.
  	 */
  	const char *buffer;
  
  	const struct elfhdr *ehdr;
  	const struct elf_phdr *proghdrs;
175fca3bf   Sven Schnelle   kexec: add KEXEC_ELF
222
223
224
225
226
227
228
229
230
231
232
233
234
  };
  
  int kexec_build_elf_info(const char *buf, size_t len, struct elfhdr *ehdr,
  			       struct kexec_elf_info *elf_info);
  
  int kexec_elf_load(struct kimage *image, struct elfhdr *ehdr,
  			 struct kexec_elf_info *elf_info,
  			 struct kexec_buf *kbuf,
  			 unsigned long *lowest_load_addr);
  
  void kexec_free_elf_info(struct kexec_elf_info *elf_info);
  int kexec_elf_probe(const char *buf, unsigned long len);
  #endif
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
235
236
237
238
  struct kimage {
  	kimage_entry_t head;
  	kimage_entry_t *entry;
  	kimage_entry_t *last_entry;
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
239
240
  	unsigned long start;
  	struct page *control_code_page;
3ab835213   Huang Ying   kexec jump
241
  	struct page *swap_page;
1229384f5   Xunlei Pang   kdump: protect vm...
242
  	void *vmcoreinfo_data_copy; /* locates in the crash memory */
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
243
244
245
246
247
248
  
  	unsigned long nr_segments;
  	struct kexec_segment segment[KEXEC_SEGMENT_MAX];
  
  	struct list_head control_pages;
  	struct list_head dest_pages;
7d3e2bca2   Vivek Goyal   kexec: rename unu...
249
  	struct list_head unusable_pages;
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
250
251
252
253
254
255
256
257
  
  	/* 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
3ab835213   Huang Ying   kexec jump
258
  	unsigned int preserve_context : 1;
cb1052581   Vivek Goyal   kexec: implementa...
259
260
  	/* If set, we are using file mode kexec syscall */
  	unsigned int file_mode:1;
92be3d6bd   Huang Ying   kexec/i386: alloc...
261
262
263
264
  
  #ifdef ARCH_HAS_KIMAGE_ARCH
  	struct kimage_arch arch;
  #endif
cb1052581   Vivek Goyal   kexec: implementa...
265

978e30c9b   Xunlei Pang   kexec: move some ...
266
  #ifdef CONFIG_KEXEC_FILE
cb1052581   Vivek Goyal   kexec: implementa...
267
268
269
270
271
272
273
274
275
276
277
  	/* Additional fields for file based kexec syscall */
  	void *kernel_buf;
  	unsigned long kernel_buf_len;
  
  	void *initrd_buf;
  	unsigned long initrd_buf_len;
  
  	char *cmdline_buf;
  	unsigned long cmdline_buf_len;
  
  	/* File operations provided by image loader */
9ec4ecef0   AKASHI Takahiro   kexec_file,x86,po...
278
  	const struct kexec_file_ops *fops;
cb1052581   Vivek Goyal   kexec: implementa...
279
280
281
  
  	/* Image loader handling the kernel can store a pointer here */
  	void *image_loader_data;
12db5562e   Vivek Goyal   kexec: load and r...
282
283
284
  
  	/* Information for loading purgatory */
  	struct purgatory_info purgatory_info;
978e30c9b   Xunlei Pang   kexec: move some ...
285
  #endif
cb1052581   Vivek Goyal   kexec: implementa...
286
  };
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
287
288
  
  /* kexec interface functions */
3ab835213   Huang Ying   kexec jump
289
  extern void machine_kexec(struct kimage *image);
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
290
291
  extern int machine_kexec_prepare(struct kimage *image);
  extern void machine_kexec_cleanup(struct kimage *image);
3ab835213   Huang Ying   kexec jump
292
  extern int kernel_kexec(void);
72414d3f1   Maneesh Soni   [PATCH] kexec cod...
293
294
  extern struct page *kimage_alloc_control_pages(struct kimage *image,
  						unsigned int order);
7bbee5ca3   Hidehiro Kawai   kexec: Fix race b...
295
  extern void __crash_kexec(struct pt_regs *);
6e274d144   Alexander Nyberg   [PATCH] kdump: Us...
296
297
  extern void crash_kexec(struct pt_regs *);
  int kexec_should_crash(struct task_struct *);
21db79e8b   Petr Tesarik   kexec: add a kexe...
298
  int kexec_crash_loaded(void);
85916f816   Magnus Damm   [PATCH] Kexec / K...
299
  void crash_save_cpu(struct pt_regs *regs, int cpu);
1229384f5   Xunlei Pang   kdump: protect vm...
300
  extern int kimage_crash_copy_vmcoreinfo(struct kimage *image);
fd59d231f   Ken'ichi Ohmichi   Add vmcoreinfo
301

dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
302
  extern struct kimage *kexec_image;
c330dda90   Jeff Moyer   [PATCH] Add a sys...
303
  extern struct kimage *kexec_crash_image;
7984754b9   Kees Cook   kexec: add sysctl...
304
  extern int kexec_load_disabled;
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
305

a79561134   Zou Nan hai   [IA64] IA64 Kexec...
306
307
308
  #ifndef kexec_flush_icache_page
  #define kexec_flush_icache_page(page)
  #endif
3ab835213   Huang Ying   kexec jump
309
310
311
312
313
314
  /* 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
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
315

cb1052581   Vivek Goyal   kexec: implementa...
316
317
318
  /* List of defined/legal kexec file flags */
  #define KEXEC_FILE_FLAGS	(KEXEC_FILE_UNLOAD | KEXEC_FILE_ON_CRASH | \
  				 KEXEC_FILE_NO_INITRAMFS)
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
319
320
321
  /* Location of a reserved region to hold the crash kernel.
   */
  extern struct resource crashk_res;
0212f9159   Yinghai Lu   x86: Add Crash ke...
322
  extern struct resource crashk_low_res;
43cf38eb5   Tejun Heo   percpu: add __per...
323
  extern note_buf_t __percpu *crash_notes;
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
324

4fc9bbf98   Khalid Aziz   PCI: Disable Bus ...
325
326
  /* flag to track if kexec reboot is in progress */
  extern bool kexec_in_progress;
06a7f7112   Amerigo Wang   kexec: premit red...
327
328
  int crash_shrink_memory(unsigned long new_size);
  size_t crash_get_memory_size(void);
c0bb9e45f   Anton Blanchard   kdump: Allow shri...
329
  void crash_free_reserved_phys_range(unsigned long begin, unsigned long end);
a79561134   Zou Nan hai   [IA64] IA64 Kexec...
330

9b492cf58   Xunlei Pang   kexec: introduce ...
331
332
  void arch_kexec_protect_crashkres(void);
  void arch_kexec_unprotect_crashkres(void);
a43cac0d9   Dave Young   kexec: split kexe...
333

43546d866   Russell King   kexec: allow arch...
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
  #ifndef page_to_boot_pfn
  static inline unsigned long page_to_boot_pfn(struct page *page)
  {
  	return page_to_pfn(page);
  }
  #endif
  
  #ifndef boot_pfn_to_page
  static inline struct page *boot_pfn_to_page(unsigned long boot_pfn)
  {
  	return pfn_to_page(boot_pfn);
  }
  #endif
  
  #ifndef phys_to_boot_phys
  static inline unsigned long phys_to_boot_phys(phys_addr_t phys)
  {
  	return phys;
  }
  #endif
  
  #ifndef boot_phys_to_phys
  static inline phys_addr_t boot_phys_to_phys(unsigned long boot_phys)
  {
  	return boot_phys;
  }
  #endif
  
  static inline unsigned long virt_to_boot_phys(void *addr)
  {
  	return phys_to_boot_phys(__pa((unsigned long)addr));
  }
  
  static inline void *boot_phys_to_virt(unsigned long entry)
  {
  	return phys_to_virt(boot_phys_to_phys(entry));
  }
bba4ed011   Tom Lendacky   x86/mm, kexec: Al...
371
372
373
374
375
376
377
  #ifndef arch_kexec_post_alloc_pages
  static inline int arch_kexec_post_alloc_pages(void *vaddr, unsigned int pages, gfp_t gfp) { return 0; }
  #endif
  
  #ifndef arch_kexec_pre_free_pages
  static inline void arch_kexec_pre_free_pages(void *vaddr, unsigned int pages) { }
  #endif
2965faa5e   Dave Young   kexec: split kexe...
378
  #else /* !CONFIG_KEXEC_CORE */
6e274d144   Alexander Nyberg   [PATCH] kdump: Us...
379
380
  struct pt_regs;
  struct task_struct;
7bbee5ca3   Hidehiro Kawai   kexec: Fix race b...
381
  static inline void __crash_kexec(struct pt_regs *regs) { }
6e274d144   Alexander Nyberg   [PATCH] kdump: Us...
382
383
  static inline void crash_kexec(struct pt_regs *regs) { }
  static inline int kexec_should_crash(struct task_struct *p) { return 0; }
21db79e8b   Petr Tesarik   kexec: add a kexe...
384
  static inline int kexec_crash_loaded(void) { return 0; }
2b94ed245   Vitaly Kuznetsov   kexec: define kex...
385
  #define kexec_in_progress false
2965faa5e   Dave Young   kexec: split kexe...
386
  #endif /* CONFIG_KEXEC_CORE */
cf2df6396   Geoff Levand   kexec: add bit de...
387
388
  
  #endif /* !defined(__ASSEBMLY__) */
dc009d924   Eric W. Biederman   [PATCH] kexec: ad...
389
  #endif /* LINUX_KEXEC_H */