1 #ifndef __XEN_KEXEC_H__
2 #define __XEN_KEXEC_H__
3
4 #ifdef CONFIG_KEXEC
5
6 #include <public/kexec.h>
7 #include <asm/percpu.h>
8 #include <xen/elfcore.h>
9 #include <xen/kimage.h>
10
11 typedef struct xen_kexec_reserve {
12 unsigned long size;
13 paddr_t start;
14 } xen_kexec_reserve_t;
15
16 extern xen_kexec_reserve_t kexec_crash_area;
17 extern paddr_t kexec_crash_area_limit;
18
19 extern bool_t kexecing;
20
21 void set_kexec_crash_area_size(u64 system_ram);
22
23 /* We have space for 4 images to support atomic update
24 * of images. This is important for CRASH images since
25 * a panic can happen at any time...
26 */
27
28 #define KEXEC_IMAGE_DEFAULT_BASE 0
29 #define KEXEC_IMAGE_CRASH_BASE 2
30 #define KEXEC_IMAGE_NR 4
31
32 enum low_crashinfo {
33 LOW_CRASHINFO_INVALID = 0,
34 LOW_CRASHINFO_NONE = 1,
35 LOW_CRASHINFO_MIN = 2,
36 LOW_CRASHINFO_ALL = 3
37 };
38
39 /* Low crashinfo mode. Start as INVALID so serveral codepaths can set up
40 * defaults without needing to know the state of the others. */
41 extern enum low_crashinfo low_crashinfo_mode;
42 extern unsigned int crashinfo_maxaddr_bits;
43 void kexec_early_calculations(void);
44
45 int machine_kexec_add_page(struct kexec_image *image, unsigned long vaddr,
46 unsigned long maddr);
47 int machine_kexec_load(struct kexec_image *image);
48 void machine_kexec_unload(struct kexec_image *image);
49 void machine_kexec_reserved(xen_kexec_reserve_t *reservation);
50 void machine_reboot_kexec(struct kexec_image *image);
51 void machine_kexec(struct kexec_image *image);
52 void kexec_crash(void);
53 void kexec_crash_save_cpu(void);
54 crash_xen_info_t *kexec_crash_save_info(void);
55 void machine_crash_shutdown(void);
56 int machine_kexec_get(xen_kexec_range_t *range);
57 int machine_kexec_get_xen(xen_kexec_range_t *range);
58
59 /* vmcoreinfo stuff */
60 #define VMCOREINFO_BYTES (4096)
61 #define VMCOREINFO_NOTE_NAME "VMCOREINFO_XEN"
62 void arch_crash_save_vmcoreinfo(void);
63 void vmcoreinfo_append_str(const char *fmt, ...)
64 __attribute__ ((format (printf, 1, 2)));
65 #define VMCOREINFO_PAGESIZE(value) \
66 vmcoreinfo_append_str("PAGESIZE=%ld\n", value)
67 #define VMCOREINFO_SYMBOL(name) \
68 vmcoreinfo_append_str("SYMBOL(%s)=%lx\n", #name, (unsigned long)&name)
69 #define VMCOREINFO_SYMBOL_ALIAS(alias, name) \
70 vmcoreinfo_append_str("SYMBOL(%s)=%lx\n", #alias, (unsigned long)&name)
71 #define VMCOREINFO_STRUCT_SIZE(name) \
72 vmcoreinfo_append_str("SIZE(%s)=%zu\n", #name, sizeof(struct name))
73 #define VMCOREINFO_OFFSET(name, field) \
74 vmcoreinfo_append_str("OFFSET(%s.%s)=%lu\n", #name, #field, \
75 (unsigned long)offsetof(struct name, field))
76 #define VMCOREINFO_OFFSET_SUB(name, sub, field) \
77 vmcoreinfo_append_str("OFFSET(%s.%s)=%lu\n", #name, #field, \
78 (unsigned long)offsetof(struct name, sub.field))
79
80 #else /* !CONFIG_KEXEC */
81
82 #define crashinfo_maxaddr_bits 0
83 #define kexecing 0
84
kexec_early_calculations(void)85 static inline void kexec_early_calculations(void) {}
kexec_crash(void)86 static inline void kexec_crash(void) {}
kexec_crash_save_cpu(void)87 static inline void kexec_crash_save_cpu(void) {}
set_kexec_crash_area_size(u64 system_ram)88 static inline void set_kexec_crash_area_size(u64 system_ram) {}
89
90 #endif
91
92 #endif /* __XEN_KEXEC_H__ */
93
94 /*
95 * Local variables:
96 * mode: C
97 * c-file-style: "BSD"
98 * c-basic-offset: 4
99 * tab-width: 4
100 * indent-tabs-mode: nil
101 * End:
102 */
103