Commit 4138323e authored by Russell King's avatar Russell King

ARM: use virt_to_idmap() for soft_restart()

Code run via soft_restart() is run with the MMU disabled, so we need to
pass the identity map physical address rather than the address obtained
from virt_to_phys().  Therefore, replace virt_to_phys() with
virt_to_idmap() for all callers of soft_restart().
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 28410293
...@@ -62,7 +62,7 @@ static int notrace arch_save_image(unsigned long unused) ...@@ -62,7 +62,7 @@ static int notrace arch_save_image(unsigned long unused)
ret = swsusp_save(); ret = swsusp_save();
if (ret == 0) if (ret == 0)
_soft_restart(virt_to_phys(cpu_resume), false); _soft_restart(virt_to_idmap(cpu_resume), false);
return ret; return ret;
} }
...@@ -87,7 +87,7 @@ static void notrace arch_restore_image(void *unused) ...@@ -87,7 +87,7 @@ static void notrace arch_restore_image(void *unused)
for (pbe = restore_pblist; pbe; pbe = pbe->next) for (pbe = restore_pblist; pbe; pbe = pbe->next)
copy_page(pbe->orig_address, pbe->address); copy_page(pbe->orig_address, pbe->address);
_soft_restart(virt_to_phys(cpu_resume), false); _soft_restart(virt_to_idmap(cpu_resume), false);
} }
static u64 resume_stack[PAGE_SIZE/2/sizeof(u64)] __nosavedata; static u64 resume_stack[PAGE_SIZE/2/sizeof(u64)] __nosavedata;
......
...@@ -143,10 +143,8 @@ void (*kexec_reinit)(void); ...@@ -143,10 +143,8 @@ void (*kexec_reinit)(void);
void machine_kexec(struct kimage *image) void machine_kexec(struct kimage *image)
{ {
unsigned long page_list; unsigned long page_list, reboot_entry_phys;
unsigned long reboot_code_buffer_phys; void (*reboot_entry)(void);
unsigned long reboot_entry = (unsigned long)relocate_new_kernel;
unsigned long reboot_entry_phys;
void *reboot_code_buffer; void *reboot_code_buffer;
/* /*
...@@ -159,9 +157,6 @@ void machine_kexec(struct kimage *image) ...@@ -159,9 +157,6 @@ void machine_kexec(struct kimage *image)
page_list = image->head & PAGE_MASK; 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); reboot_code_buffer = page_address(image->control_code_page);
/* Prepare parameters for reboot_code_buffer*/ /* Prepare parameters for reboot_code_buffer*/
...@@ -174,10 +169,11 @@ void machine_kexec(struct kimage *image) ...@@ -174,10 +169,11 @@ void machine_kexec(struct kimage *image)
/* copy our kernel relocation code to the control code page */ /* copy our kernel relocation code to the control code page */
reboot_entry = fncpy(reboot_code_buffer, reboot_entry = fncpy(reboot_code_buffer,
reboot_entry, &relocate_new_kernel,
relocate_new_kernel_size); relocate_new_kernel_size);
reboot_entry_phys = (unsigned long)reboot_entry +
(reboot_code_buffer_phys - (unsigned long)reboot_code_buffer); /* get the identity mapping physical address for the reboot code */
reboot_entry_phys = virt_to_idmap(reboot_entry);
pr_info("Bye!\n"); pr_info("Bye!\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment