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