diff options
Diffstat (limited to 'arch/sh')
-rw-r--r-- | arch/sh/include/asm/kexec.h | 8 | ||||
-rw-r--r-- | arch/sh/kernel/machine_kexec.c | 51 | ||||
-rw-r--r-- | arch/sh/kernel/setup.c | 43 |
3 files changed, 58 insertions, 44 deletions
diff --git a/arch/sh/include/asm/kexec.h b/arch/sh/include/asm/kexec.h index 765a5e1660f..ad6ef8a275e 100644 --- a/arch/sh/include/asm/kexec.h +++ b/arch/sh/include/asm/kexec.h | |||
@@ -26,6 +26,10 @@ | |||
26 | /* The native architecture */ | 26 | /* The native architecture */ |
27 | #define KEXEC_ARCH KEXEC_ARCH_SH | 27 | #define KEXEC_ARCH KEXEC_ARCH_SH |
28 | 28 | ||
29 | #ifdef CONFIG_KEXEC | ||
30 | /* arch/sh/kernel/machine_kexec.c */ | ||
31 | void reserve_crashkernel(void); | ||
32 | |||
29 | static inline void crash_setup_regs(struct pt_regs *newregs, | 33 | static inline void crash_setup_regs(struct pt_regs *newregs, |
30 | struct pt_regs *oldregs) | 34 | struct pt_regs *oldregs) |
31 | { | 35 | { |
@@ -59,4 +63,8 @@ static inline void crash_setup_regs(struct pt_regs *newregs, | |||
59 | newregs->pc = (unsigned long)current_text_addr(); | 63 | newregs->pc = (unsigned long)current_text_addr(); |
60 | } | 64 | } |
61 | } | 65 | } |
66 | #else | ||
67 | static inline void reserve_crashkernel(void) { } | ||
68 | #endif /* CONFIG_KEXEC */ | ||
69 | |||
62 | #endif /* __ASM_SH_KEXEC_H */ | 70 | #endif /* __ASM_SH_KEXEC_H */ |
diff --git a/arch/sh/kernel/machine_kexec.c b/arch/sh/kernel/machine_kexec.c index 7672141c841..f0f049caa6e 100644 --- a/arch/sh/kernel/machine_kexec.c +++ b/arch/sh/kernel/machine_kexec.c | |||
@@ -8,7 +8,6 @@ | |||
8 | * This source code is licensed under the GNU General Public License, | 8 | * This source code is licensed under the GNU General Public License, |
9 | * Version 2. See the file COPYING for more details. | 9 | * Version 2. See the file COPYING for more details. |
10 | */ | 10 | */ |
11 | |||
12 | #include <linux/mm.h> | 11 | #include <linux/mm.h> |
13 | #include <linux/kexec.h> | 12 | #include <linux/kexec.h> |
14 | #include <linux/delay.h> | 13 | #include <linux/delay.h> |
@@ -16,6 +15,7 @@ | |||
16 | #include <linux/numa.h> | 15 | #include <linux/numa.h> |
17 | #include <linux/ftrace.h> | 16 | #include <linux/ftrace.h> |
18 | #include <linux/suspend.h> | 17 | #include <linux/suspend.h> |
18 | #include <linux/lmb.h> | ||
19 | #include <asm/pgtable.h> | 19 | #include <asm/pgtable.h> |
20 | #include <asm/pgalloc.h> | 20 | #include <asm/pgalloc.h> |
21 | #include <asm/mmu_context.h> | 21 | #include <asm/mmu_context.h> |
@@ -148,3 +148,52 @@ void arch_crash_save_vmcoreinfo(void) | |||
148 | VMCOREINFO_LENGTH(node_data, MAX_NUMNODES); | 148 | VMCOREINFO_LENGTH(node_data, MAX_NUMNODES); |
149 | #endif | 149 | #endif |
150 | } | 150 | } |
151 | |||
152 | void __init reserve_crashkernel(void) | ||
153 | { | ||
154 | unsigned long long crash_size, crash_base; | ||
155 | int ret; | ||
156 | |||
157 | /* this is necessary because of lmb_phys_mem_size() */ | ||
158 | lmb_analyze(); | ||
159 | |||
160 | ret = parse_crashkernel(boot_command_line, lmb_phys_mem_size(), | ||
161 | &crash_size, &crash_base); | ||
162 | if (ret == 0 && crash_size > 0) { | ||
163 | crashk_res.start = crash_base; | ||
164 | crashk_res.end = crash_base + crash_size - 1; | ||
165 | } | ||
166 | |||
167 | if (crashk_res.end == crashk_res.start) | ||
168 | goto disable; | ||
169 | |||
170 | crash_size = PAGE_ALIGN(crashk_res.end - crashk_res.start + 1); | ||
171 | if (!crashk_res.start) { | ||
172 | crashk_res.start = lmb_alloc(crash_size, PAGE_SIZE); | ||
173 | if (!crashk_res.start) { | ||
174 | pr_err("crashkernel allocation failed\n"); | ||
175 | goto disable; | ||
176 | } | ||
177 | } else { | ||
178 | ret = lmb_reserve(crashk_res.start, crash_size); | ||
179 | if (unlikely(ret < 0)) { | ||
180 | pr_err("crashkernel reservation failed - " | ||
181 | "memory is in use\n"); | ||
182 | goto disable; | ||
183 | } | ||
184 | } | ||
185 | |||
186 | pr_info("Reserving %ldMB of memory at %ldMB " | ||
187 | "for crashkernel (System RAM: %ldMB)\n", | ||
188 | (unsigned long)(crash_size >> 20), | ||
189 | (unsigned long)(crashk_res.start >> 20), | ||
190 | (unsigned long)(lmb_phys_mem_size() >> 20)); | ||
191 | |||
192 | crashk_res.end = crashk_res.start + crash_size - 1; | ||
193 | insert_resource(&iomem_resource, &crashk_res); | ||
194 | |||
195 | return; | ||
196 | |||
197 | disable: | ||
198 | crashk_res.start = crashk_res.end = 0; | ||
199 | } | ||
diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c index 9c7f7811af7..d67a8a38690 100644 --- a/arch/sh/kernel/setup.c +++ b/arch/sh/kernel/setup.c | |||
@@ -145,49 +145,6 @@ static void __init register_bootmem_low_pages(void) | |||
145 | free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(pages)); | 145 | free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(pages)); |
146 | } | 146 | } |
147 | 147 | ||
148 | #ifdef CONFIG_KEXEC | ||
149 | static void __init reserve_crashkernel(void) | ||
150 | { | ||
151 | unsigned long long free_mem; | ||
152 | unsigned long long crash_size, crash_base; | ||
153 | void *vp; | ||
154 | int ret; | ||
155 | |||
156 | free_mem = ((unsigned long long)max_low_pfn - min_low_pfn) << PAGE_SHIFT; | ||
157 | |||
158 | ret = parse_crashkernel(boot_command_line, free_mem, | ||
159 | &crash_size, &crash_base); | ||
160 | if (ret == 0 && crash_size) { | ||
161 | if (crash_base <= 0) { | ||
162 | vp = alloc_bootmem_nopanic(crash_size); | ||
163 | if (!vp) { | ||
164 | printk(KERN_INFO "crashkernel allocation " | ||
165 | "failed\n"); | ||
166 | return; | ||
167 | } | ||
168 | crash_base = __pa(vp); | ||
169 | } else if (reserve_bootmem(crash_base, crash_size, | ||
170 | BOOTMEM_EXCLUSIVE) < 0) { | ||
171 | printk(KERN_INFO "crashkernel reservation failed - " | ||
172 | "memory is in use\n"); | ||
173 | return; | ||
174 | } | ||
175 | |||
176 | printk(KERN_INFO "Reserving %ldMB of memory at %ldMB " | ||
177 | "for crashkernel (System RAM: %ldMB)\n", | ||
178 | (unsigned long)(crash_size >> 20), | ||
179 | (unsigned long)(crash_base >> 20), | ||
180 | (unsigned long)(free_mem >> 20)); | ||
181 | crashk_res.start = crash_base; | ||
182 | crashk_res.end = crash_base + crash_size - 1; | ||
183 | insert_resource(&iomem_resource, &crashk_res); | ||
184 | } | ||
185 | } | ||
186 | #else | ||
187 | static inline void __init reserve_crashkernel(void) | ||
188 | {} | ||
189 | #endif | ||
190 | |||
191 | static void __init check_for_initrd(void) | 148 | static void __init check_for_initrd(void) |
192 | { | 149 | { |
193 | #ifdef CONFIG_BLK_DEV_INITRD | 150 | #ifdef CONFIG_BLK_DEV_INITRD |