diff options
Diffstat (limited to 'arch/arm/kernel/machine_kexec.c')
| -rw-r--r-- | arch/arm/kernel/machine_kexec.c | 24 | 
1 files changed, 17 insertions, 7 deletions
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c index 57221e349a7..8cf0996aa1a 100644 --- a/arch/arm/kernel/machine_kexec.c +++ b/arch/arm/kernel/machine_kexec.c @@ -14,11 +14,12 @@  #include <asm/pgalloc.h>  #include <asm/mmu_context.h>  #include <asm/cacheflush.h> +#include <asm/fncpy.h>  #include <asm/mach-types.h>  #include <asm/smp_plat.h>  #include <asm/system_misc.h> -extern const unsigned char relocate_new_kernel[]; +extern void relocate_new_kernel(void);  extern const unsigned int relocate_new_kernel_size;  extern unsigned long kexec_start_address; @@ -142,6 +143,8 @@ void machine_kexec(struct kimage *image)  {  	unsigned long page_list;  	unsigned long reboot_code_buffer_phys; +	unsigned long reboot_entry = (unsigned long)relocate_new_kernel; +	unsigned long reboot_entry_phys;  	void *reboot_code_buffer;  	/* @@ -168,16 +171,23 @@ void machine_kexec(struct kimage *image)  	/* copy our kernel relocation code to the control code page */ -	memcpy(reboot_code_buffer, -	       relocate_new_kernel, relocate_new_kernel_size); +	reboot_entry = fncpy(reboot_code_buffer, +			     reboot_entry, +			     relocate_new_kernel_size); +	reboot_entry_phys = (unsigned long)reboot_entry + +		(reboot_code_buffer_phys - (unsigned long)reboot_code_buffer); - -	flush_icache_range((unsigned long) reboot_code_buffer, -			   (unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE);  	printk(KERN_INFO "Bye!\n");  	if (kexec_reinit)  		kexec_reinit(); -	soft_restart(reboot_code_buffer_phys); +	soft_restart(reboot_entry_phys); +} + +void arch_crash_save_vmcoreinfo(void) +{ +#ifdef CONFIG_ARM_LPAE +	VMCOREINFO_CONFIG(ARM_LPAE); +#endif  }  | 
