Root/
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 <linux/elfcore.h> |
11 | #include <linux/elf.h> |
12 | #include <asm/kexec.h> |
13 | |
14 | /* Verify architecture specific macros are defined */ |
15 | |
16 | #ifndef KEXEC_SOURCE_MEMORY_LIMIT |
17 | #error KEXEC_SOURCE_MEMORY_LIMIT not defined |
18 | #endif |
19 | |
20 | #ifndef KEXEC_DESTINATION_MEMORY_LIMIT |
21 | #error KEXEC_DESTINATION_MEMORY_LIMIT not defined |
22 | #endif |
23 | |
24 | #ifndef KEXEC_CONTROL_MEMORY_LIMIT |
25 | #error KEXEC_CONTROL_MEMORY_LIMIT not defined |
26 | #endif |
27 | |
28 | #ifndef KEXEC_CONTROL_PAGE_SIZE |
29 | #error KEXEC_CONTROL_PAGE_SIZE not defined |
30 | #endif |
31 | |
32 | #ifndef KEXEC_ARCH |
33 | #error KEXEC_ARCH not defined |
34 | #endif |
35 | |
36 | #define KEXEC_NOTE_HEAD_BYTES ALIGN(sizeof(struct elf_note), 4) |
37 | #define KEXEC_CORE_NOTE_NAME "CORE" |
38 | #define KEXEC_CORE_NOTE_NAME_BYTES ALIGN(sizeof(KEXEC_CORE_NOTE_NAME), 4) |
39 | #define KEXEC_CORE_NOTE_DESC_BYTES ALIGN(sizeof(struct elf_prstatus), 4) |
40 | /* |
41 | * The per-cpu notes area is a list of notes terminated by a "NULL" |
42 | * note header. For kdump, the code in vmcore.c runs in the context |
43 | * of the second kernel to combine them into one note. |
44 | */ |
45 | #define KEXEC_NOTE_BYTES ( (KEXEC_NOTE_HEAD_BYTES * 2) + \ |
46 | KEXEC_CORE_NOTE_NAME_BYTES + \ |
47 | KEXEC_CORE_NOTE_DESC_BYTES ) |
48 | |
49 | /* |
50 | * This structure is used to hold the arguments that are used when loading |
51 | * kernel binaries. |
52 | */ |
53 | |
54 | typedef unsigned long kimage_entry_t; |
55 | #define IND_DESTINATION 0x1 |
56 | #define IND_INDIRECTION 0x2 |
57 | #define IND_DONE 0x4 |
58 | #define IND_SOURCE 0x8 |
59 | |
60 | #define KEXEC_SEGMENT_MAX 16 |
61 | struct kexec_segment { |
62 | void __user *buf; |
63 | size_t bufsz; |
64 | unsigned long mem; /* User space sees this as a (void *) ... */ |
65 | size_t memsz; |
66 | }; |
67 | |
68 | #ifdef CONFIG_COMPAT |
69 | struct compat_kexec_segment { |
70 | compat_uptr_t buf; |
71 | compat_size_t bufsz; |
72 | compat_ulong_t mem; /* User space sees this as a (void *) ... */ |
73 | compat_size_t memsz; |
74 | }; |
75 | #endif |
76 | |
77 | struct kimage { |
78 | kimage_entry_t head; |
79 | kimage_entry_t *entry; |
80 | kimage_entry_t *last_entry; |
81 | |
82 | unsigned long destination; |
83 | |
84 | unsigned long start; |
85 | struct page *control_code_page; |
86 | struct page *swap_page; |
87 | |
88 | unsigned long nr_segments; |
89 | struct kexec_segment segment[KEXEC_SEGMENT_MAX]; |
90 | |
91 | struct list_head control_pages; |
92 | struct list_head dest_pages; |
93 | struct list_head unuseable_pages; |
94 | |
95 | /* Address of next control page to allocate for crash kernels. */ |
96 | unsigned long control_page; |
97 | |
98 | /* Flags to indicate special processing */ |
99 | unsigned int type : 1; |
100 | #define KEXEC_TYPE_DEFAULT 0 |
101 | #define KEXEC_TYPE_CRASH 1 |
102 | unsigned int preserve_context : 1; |
103 | |
104 | #ifdef ARCH_HAS_KIMAGE_ARCH |
105 | struct kimage_arch arch; |
106 | #endif |
107 | }; |
108 | |
109 | |
110 | |
111 | /* kexec interface functions */ |
112 | extern void machine_kexec(struct kimage *image); |
113 | extern int machine_kexec_prepare(struct kimage *image); |
114 | extern void machine_kexec_cleanup(struct kimage *image); |
115 | extern asmlinkage long sys_kexec_load(unsigned long entry, |
116 | unsigned long nr_segments, |
117 | struct kexec_segment __user *segments, |
118 | unsigned long flags); |
119 | extern int kernel_kexec(void); |
120 | #ifdef CONFIG_COMPAT |
121 | extern asmlinkage long compat_sys_kexec_load(unsigned long entry, |
122 | unsigned long nr_segments, |
123 | struct compat_kexec_segment __user *segments, |
124 | unsigned long flags); |
125 | #endif |
126 | extern struct page *kimage_alloc_control_pages(struct kimage *image, |
127 | unsigned int order); |
128 | extern void crash_kexec(struct pt_regs *); |
129 | int kexec_should_crash(struct task_struct *); |
130 | void crash_save_cpu(struct pt_regs *regs, int cpu); |
131 | void crash_save_vmcoreinfo(void); |
132 | void arch_crash_save_vmcoreinfo(void); |
133 | void vmcoreinfo_append_str(const char *fmt, ...) |
134 | __attribute__ ((format (printf, 1, 2))); |
135 | unsigned long paddr_vmcoreinfo_note(void); |
136 | |
137 | #define VMCOREINFO_OSRELEASE(value) \ |
138 | vmcoreinfo_append_str("OSRELEASE=%s\n", value) |
139 | #define VMCOREINFO_PAGESIZE(value) \ |
140 | vmcoreinfo_append_str("PAGESIZE=%ld\n", value) |
141 | #define VMCOREINFO_SYMBOL(name) \ |
142 | vmcoreinfo_append_str("SYMBOL(%s)=%lx\n", #name, (unsigned long)&name) |
143 | #define VMCOREINFO_SIZE(name) \ |
144 | vmcoreinfo_append_str("SIZE(%s)=%lu\n", #name, \ |
145 | (unsigned long)sizeof(name)) |
146 | #define VMCOREINFO_STRUCT_SIZE(name) \ |
147 | vmcoreinfo_append_str("SIZE(%s)=%lu\n", #name, \ |
148 | (unsigned long)sizeof(struct name)) |
149 | #define VMCOREINFO_OFFSET(name, field) \ |
150 | vmcoreinfo_append_str("OFFSET(%s.%s)=%lu\n", #name, #field, \ |
151 | (unsigned long)offsetof(struct name, field)) |
152 | #define VMCOREINFO_LENGTH(name, value) \ |
153 | vmcoreinfo_append_str("LENGTH(%s)=%lu\n", #name, (unsigned long)value) |
154 | #define VMCOREINFO_NUMBER(name) \ |
155 | vmcoreinfo_append_str("NUMBER(%s)=%ld\n", #name, (long)name) |
156 | #define VMCOREINFO_CONFIG(name) \ |
157 | vmcoreinfo_append_str("CONFIG_%s=y\n", #name) |
158 | |
159 | extern struct kimage *kexec_image; |
160 | extern struct kimage *kexec_crash_image; |
161 | |
162 | #ifndef kexec_flush_icache_page |
163 | #define kexec_flush_icache_page(page) |
164 | #endif |
165 | |
166 | #define KEXEC_ON_CRASH 0x00000001 |
167 | #define KEXEC_PRESERVE_CONTEXT 0x00000002 |
168 | #define KEXEC_ARCH_MASK 0xffff0000 |
169 | |
170 | /* These values match the ELF architecture values. |
171 | * Unless there is a good reason that should continue to be the case. |
172 | */ |
173 | #define KEXEC_ARCH_DEFAULT ( 0 << 16) |
174 | #define KEXEC_ARCH_386 ( 3 << 16) |
175 | #define KEXEC_ARCH_X86_64 (62 << 16) |
176 | #define KEXEC_ARCH_PPC (20 << 16) |
177 | #define KEXEC_ARCH_PPC64 (21 << 16) |
178 | #define KEXEC_ARCH_IA_64 (50 << 16) |
179 | #define KEXEC_ARCH_ARM (40 << 16) |
180 | #define KEXEC_ARCH_S390 (22 << 16) |
181 | #define KEXEC_ARCH_SH (42 << 16) |
182 | #define KEXEC_ARCH_MIPS_LE (10 << 16) |
183 | #define KEXEC_ARCH_MIPS ( 8 << 16) |
184 | |
185 | /* List of defined/legal kexec flags */ |
186 | #ifndef CONFIG_KEXEC_JUMP |
187 | #define KEXEC_FLAGS KEXEC_ON_CRASH |
188 | #else |
189 | #define KEXEC_FLAGS (KEXEC_ON_CRASH | KEXEC_PRESERVE_CONTEXT) |
190 | #endif |
191 | |
192 | #define VMCOREINFO_BYTES (4096) |
193 | #define VMCOREINFO_NOTE_NAME "VMCOREINFO" |
194 | #define VMCOREINFO_NOTE_NAME_BYTES ALIGN(sizeof(VMCOREINFO_NOTE_NAME), 4) |
195 | #define VMCOREINFO_NOTE_SIZE (KEXEC_NOTE_HEAD_BYTES*2 + VMCOREINFO_BYTES \ |
196 | + VMCOREINFO_NOTE_NAME_BYTES) |
197 | |
198 | /* Location of a reserved region to hold the crash kernel. |
199 | */ |
200 | extern struct resource crashk_res; |
201 | typedef u32 note_buf_t[KEXEC_NOTE_BYTES/4]; |
202 | extern note_buf_t __percpu *crash_notes; |
203 | extern u32 vmcoreinfo_note[VMCOREINFO_NOTE_SIZE/4]; |
204 | extern size_t vmcoreinfo_size; |
205 | extern size_t vmcoreinfo_max_size; |
206 | |
207 | int __init parse_crashkernel(char *cmdline, unsigned long long system_ram, |
208 | unsigned long long *crash_size, unsigned long long *crash_base); |
209 | int crash_shrink_memory(unsigned long new_size); |
210 | size_t crash_get_memory_size(void); |
211 | void crash_free_reserved_phys_range(unsigned long begin, unsigned long end); |
212 | |
213 | #else /* !CONFIG_KEXEC */ |
214 | struct pt_regs; |
215 | struct task_struct; |
216 | static inline void crash_kexec(struct pt_regs *regs) { } |
217 | static inline int kexec_should_crash(struct task_struct *p) { return 0; } |
218 | #endif /* CONFIG_KEXEC */ |
219 | #endif /* LINUX_KEXEC_H */ |
220 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9