Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
kexec.h
Go to the documentation of this file.
1
#ifndef LINUX_KEXEC_H
2
#define LINUX_KEXEC_H
3
4
#include <
uapi/linux/kexec.h
>
5
6
#ifdef CONFIG_KEXEC
7
#include <linux/list.h>
8
#include <linux/linkage.h>
9
#include <
linux/compat.h
>
10
#include <
linux/ioport.h
>
11
#include <linux/elfcore.h>
12
#include <linux/elf.h>
13
#include <asm/kexec.h>
14
15
/* Verify architecture specific macros are defined */
16
17
#ifndef KEXEC_SOURCE_MEMORY_LIMIT
18
#error KEXEC_SOURCE_MEMORY_LIMIT not defined
19
#endif
20
21
#ifndef KEXEC_DESTINATION_MEMORY_LIMIT
22
#error KEXEC_DESTINATION_MEMORY_LIMIT not defined
23
#endif
24
25
#ifndef KEXEC_CONTROL_MEMORY_LIMIT
26
#error KEXEC_CONTROL_MEMORY_LIMIT not defined
27
#endif
28
29
#ifndef KEXEC_CONTROL_PAGE_SIZE
30
#error KEXEC_CONTROL_PAGE_SIZE not defined
31
#endif
32
33
#ifndef KEXEC_ARCH
34
#error KEXEC_ARCH not defined
35
#endif
36
37
#ifndef KEXEC_CRASH_CONTROL_MEMORY_LIMIT
38
#define KEXEC_CRASH_CONTROL_MEMORY_LIMIT KEXEC_CONTROL_MEMORY_LIMIT
39
#endif
40
41
#ifndef KEXEC_CRASH_MEM_ALIGN
42
#define KEXEC_CRASH_MEM_ALIGN PAGE_SIZE
43
#endif
44
45
#define KEXEC_NOTE_HEAD_BYTES ALIGN(sizeof(struct elf_note), 4)
46
#define KEXEC_CORE_NOTE_NAME "CORE"
47
#define KEXEC_CORE_NOTE_NAME_BYTES ALIGN(sizeof(KEXEC_CORE_NOTE_NAME), 4)
48
#define KEXEC_CORE_NOTE_DESC_BYTES ALIGN(sizeof(struct elf_prstatus), 4)
49
/*
50
* The per-cpu notes area is a list of notes terminated by a "NULL"
51
* note header. For kdump, the code in vmcore.c runs in the context
52
* of the second kernel to combine them into one note.
53
*/
54
#ifndef KEXEC_NOTE_BYTES
55
#define KEXEC_NOTE_BYTES ( (KEXEC_NOTE_HEAD_BYTES * 2) + \
56
KEXEC_CORE_NOTE_NAME_BYTES + \
57
KEXEC_CORE_NOTE_DESC_BYTES )
58
#endif
59
60
/*
61
* This structure is used to hold the arguments that are used when loading
62
* kernel binaries.
63
*/
64
65
typedef
unsigned
long
kimage_entry_t;
66
#define IND_DESTINATION 0x1
67
#define IND_INDIRECTION 0x2
68
#define IND_DONE 0x4
69
#define IND_SOURCE 0x8
70
71
struct
kexec_segment
{
72
void
__user
*
buf
;
73
size_t
bufsz
;
74
unsigned
long
mem
;
75
size_t
memsz
;
76
};
77
78
#ifdef CONFIG_COMPAT
79
struct
compat_kexec_segment {
80
compat_uptr_t
buf
;
81
compat_size_t
bufsz;
82
compat_ulong_t
mem
;
/* User space sees this as a (void *) ... */
83
compat_size_t
memsz;
84
};
85
#endif
86
87
struct
kimage {
88
kimage_entry_t
head
;
89
kimage_entry_t *
entry
;
90
kimage_entry_t *last_entry;
91
92
unsigned
long
destination;
93
94
unsigned
long
start
;
95
struct
page
*control_code_page;
96
struct
page
*swap_page;
97
98
unsigned
long
nr_segments
;
99
struct
kexec_segment
segment
[
KEXEC_SEGMENT_MAX
];
100
101
struct
list_head
control_pages;
102
struct
list_head
dest_pages;
103
struct
list_head
unuseable_pages;
104
105
/* Address of next control page to allocate for crash kernels. */
106
unsigned
long
control_page;
107
108
/* Flags to indicate special processing */
109
unsigned
int
type
: 1;
110
#define KEXEC_TYPE_DEFAULT 0
111
#define KEXEC_TYPE_CRASH 1
112
unsigned
int
preserve_context : 1;
113
114
#ifdef ARCH_HAS_KIMAGE_ARCH
115
struct
kimage_arch
arch
;
116
#endif
117
};
118
119
120
121
/* kexec interface functions */
122
extern
void
machine_kexec
(
struct
kimage *
image
);
123
extern
int
machine_kexec_prepare
(
struct
kimage *
image
);
124
extern
void
machine_kexec_cleanup
(
struct
kimage *
image
);
125
extern
asmlinkage
long
sys_kexec_load
(
unsigned
long
entry
,
126
unsigned
long
nr_segments
,
127
struct
kexec_segment
__user *segments,
128
unsigned
long
flags
);
129
extern
int
kernel_kexec(
void
);
130
#ifdef CONFIG_COMPAT
131
extern
asmlinkage
long
compat_sys_kexec_load(
unsigned
long
entry
,
132
unsigned
long
nr_segments
,
133
struct
compat_kexec_segment __user *segments,
134
unsigned
long
flags
);
135
#endif
136
extern
struct
page
*
kimage_alloc_control_pages
(
struct
kimage *
image
,
137
unsigned
int
order
);
138
extern
void
crash_kexec
(
struct
pt_regs
*);
139
int
kexec_should_crash
(
struct
task_struct
*);
140
void
crash_save_cpu
(
struct
pt_regs
*
regs
,
int
cpu
);
141
void
crash_save_vmcoreinfo
(
void
);
142
void
crash_map_reserved_pages
(
void
);
143
void
crash_unmap_reserved_pages
(
void
);
144
void
arch_crash_save_vmcoreinfo
(
void
);
145
__printf
(1, 2)
146
void
vmcoreinfo_append_str
(
const
char
*
fmt
, ...);
147
unsigned
long
paddr_vmcoreinfo_note
(
void
);
148
149
#define VMCOREINFO_OSRELEASE(value) \
150
vmcoreinfo_append_str("OSRELEASE=%s\n", value)
151
#define VMCOREINFO_PAGESIZE(value) \
152
vmcoreinfo_append_str("PAGESIZE=%ld\n", value)
153
#define VMCOREINFO_SYMBOL(name) \
154
vmcoreinfo_append_str("SYMBOL(%s)=%lx\n", #name, (unsigned long)&name)
155
#define VMCOREINFO_SIZE(name) \
156
vmcoreinfo_append_str("SIZE(%s)=%lu\n", #name, \
157
(unsigned long)sizeof(name))
158
#define VMCOREINFO_STRUCT_SIZE(name) \
159
vmcoreinfo_append_str("SIZE(%s)=%lu\n", #name, \
160
(unsigned long)sizeof(struct name))
161
#define VMCOREINFO_OFFSET(name, field) \
162
vmcoreinfo_append_str("OFFSET(%s.%s)=%lu\n", #name, #field, \
163
(unsigned long)offsetof(struct name, field))
164
#define VMCOREINFO_LENGTH(name, value) \
165
vmcoreinfo_append_str("LENGTH(%s)=%lu\n", #name, (unsigned long)value)
166
#define VMCOREINFO_NUMBER(name) \
167
vmcoreinfo_append_str("NUMBER(%s)=%ld\n", #name, (long)name)
168
#define VMCOREINFO_CONFIG(name) \
169
vmcoreinfo_append_str("CONFIG_%s=y\n", #name)
170
171
extern
struct
kimage *
kexec_image
;
172
extern
struct
kimage *
kexec_crash_image
;
173
174
#ifndef kexec_flush_icache_page
175
#define kexec_flush_icache_page(page)
176
#endif
177
178
/* List of defined/legal kexec flags */
179
#ifndef CONFIG_KEXEC_JUMP
180
#define KEXEC_FLAGS KEXEC_ON_CRASH
181
#else
182
#define KEXEC_FLAGS (KEXEC_ON_CRASH | KEXEC_PRESERVE_CONTEXT)
183
#endif
184
185
#define VMCOREINFO_BYTES (4096)
186
#define VMCOREINFO_NOTE_NAME "VMCOREINFO"
187
#define VMCOREINFO_NOTE_NAME_BYTES ALIGN(sizeof(VMCOREINFO_NOTE_NAME), 4)
188
#define VMCOREINFO_NOTE_SIZE (KEXEC_NOTE_HEAD_BYTES*2 + VMCOREINFO_BYTES \
189
+ VMCOREINFO_NOTE_NAME_BYTES)
190
191
/* Location of a reserved region to hold the crash kernel.
192
*/
193
extern
struct
resource
crashk_res
;
194
typedef
u32
note_buf_t[
KEXEC_NOTE_BYTES
/4];
195
extern
note_buf_t
__percpu
*
crash_notes
;
196
extern
u32
vmcoreinfo_note
[VMCOREINFO_NOTE_SIZE/4];
197
extern
size_t
vmcoreinfo_size
;
198
extern
size_t
vmcoreinfo_max_size
;
199
200
int
__init
parse_crashkernel
(
char
*
cmdline
,
unsigned
long
long
system_ram,
201
unsigned
long
long
*crash_size,
unsigned
long
long
*crash_base);
202
int
crash_shrink_memory
(
unsigned
long
new_size);
203
size_t
crash_get_memory_size
(
void
);
204
void
crash_free_reserved_phys_range
(
unsigned
long
begin,
unsigned
long
end
);
205
206
#else
/* !CONFIG_KEXEC */
207
struct
pt_regs
;
208
struct
task_struct
;
209
static
inline
void
crash_kexec
(
struct
pt_regs
*
regs
) { }
210
static
inline
int
kexec_should_crash
(
struct
task_struct
*
p
) {
return
0; }
211
#endif
/* CONFIG_KEXEC */
212
#endif
/* LINUX_KEXEC_H */
Generated on Thu Jan 10 2013 12:55:13 for Linux Kernel by
1.8.2