ARM: 7098/1: kdump: copy kernel relocation code at the kexec prepare stage
This copy really don't need to do at the very second before the kernel would crash. Signed-off-by: Lei Wen <leiwen@marvell.com> Acked-by: Simon Horman <horms@verge.net.au> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
@@ -32,6 +32,24 @@ static atomic_t waiting_for_crash_ipi;
|
|||||||
|
|
||||||
int machine_kexec_prepare(struct kimage *image)
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,31 +100,14 @@ void (*kexec_reinit)(void);
|
|||||||
|
|
||||||
void machine_kexec(struct kimage *image)
|
void machine_kexec(struct kimage *image)
|
||||||
{
|
{
|
||||||
unsigned long page_list;
|
|
||||||
unsigned long reboot_code_buffer_phys;
|
unsigned long reboot_code_buffer_phys;
|
||||||
void *reboot_code_buffer;
|
void *reboot_code_buffer;
|
||||||
|
|
||||||
|
|
||||||
page_list = image->head & PAGE_MASK;
|
|
||||||
|
|
||||||
/* we need both effective and real address here */
|
/* we need both effective and real address here */
|
||||||
reboot_code_buffer_phys =
|
reboot_code_buffer_phys =
|
||||||
page_to_pfn(image->control_code_page) << PAGE_SHIFT;
|
page_to_pfn(image->control_code_page) << PAGE_SHIFT;
|
||||||
reboot_code_buffer = page_address(image->control_code_page);
|
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");
|
printk(KERN_INFO "Bye!\n");
|
||||||
|
|
||||||
if (kexec_reinit)
|
if (kexec_reinit)
|
||||||
|
Reference in New Issue
Block a user