|
@@ -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)
|