diff options
Diffstat (limited to 'arch/arm/kernel/machine_kexec.c')
| -rw-r--r-- | arch/arm/kernel/machine_kexec.c | 35 | 
1 files changed, 17 insertions, 18 deletions
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c index c1b4463dcc8..e59bbd496c3 100644 --- a/arch/arm/kernel/machine_kexec.c +++ b/arch/arm/kernel/machine_kexec.c @@ -32,24 +32,6 @@ static atomic_t waiting_for_crash_ipi;  int machine_kexec_prepare(struct kimage *image)  { -	unsigned long page_list; -	void *reboot_code_buffer; -	page_list = image->head & PAGE_MASK; - -	reboot_code_buffer = page_address(image->control_code_page); - -	/* Prepare parameters for reboot_code_buffer*/ -	kexec_start_address = image->start; -	kexec_indirection_page = page_list; -	kexec_mach_type = machine_arch_type; -	kexec_boot_atags = image->start - KEXEC_ARM_ZIMAGE_OFFSET + KEXEC_ARM_ATAGS_OFFSET; - -	/* copy our kernel relocation code to the control code page */ -	memcpy(reboot_code_buffer, -	       relocate_new_kernel, relocate_new_kernel_size); - -	flush_icache_range((unsigned long) reboot_code_buffer, -			   (unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE);  	return 0;  } @@ -100,14 +82,31 @@ void (*kexec_reinit)(void);  void machine_kexec(struct kimage *image)  { +	unsigned long page_list;  	unsigned long reboot_code_buffer_phys;  	void *reboot_code_buffer; + +	page_list = image->head & PAGE_MASK; +  	/* we need both effective and real address here */  	reboot_code_buffer_phys =  	    page_to_pfn(image->control_code_page) << PAGE_SHIFT;  	reboot_code_buffer = page_address(image->control_code_page); +	/* Prepare parameters for reboot_code_buffer*/ +	kexec_start_address = image->start; +	kexec_indirection_page = page_list; +	kexec_mach_type = machine_arch_type; +	kexec_boot_atags = image->start - KEXEC_ARM_ZIMAGE_OFFSET + KEXEC_ARM_ATAGS_OFFSET; + +	/* copy our kernel relocation code to the control code page */ +	memcpy(reboot_code_buffer, +	       relocate_new_kernel, relocate_new_kernel_size); + + +	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)  |