arm64: Fix the soft_restart routine
authorGeoff Levand <geoff@infradead.org>
Tue, 17 Dec 2013 00:19:29 +0000 (00:19 +0000)
committerMark Brown <broonie@linaro.org>
Wed, 21 May 2014 17:41:19 +0000 (18:41 +0100)
Change the soft_restart() routine to call cpu_reset() at its identity mapped
physical address.

The cpu_reset() routine must be called at its identity mapped physical address
so that when the MMU is turned off the instruction pointer will be at the correct
location in physical memory.

Signed-off-by: Geoff Levand <geoff@infradead.org> for Huawei, Linaro
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
(cherry picked from commit 09024aa61e1bc994404683e2e5b363484a15dd12)
Signed-off-by: Mark Brown <broonie@linaro.org>
arch/arm64/kernel/process.c

index 02a41bba165d8c673a1e8738952f02f956103114..75af46648f2671e90348c9d40eb438bf09b45afd 100644 (file)
@@ -71,8 +71,17 @@ static void setup_restart(void)
 
 void soft_restart(unsigned long addr)
 {
+       typedef void (*phys_reset_t)(unsigned long);
+       phys_reset_t phys_reset;
+
        setup_restart();
-       cpu_reset(addr);
+
+       /* Switch to the identity mapping */
+       phys_reset = (phys_reset_t)virt_to_phys(cpu_reset);
+       phys_reset(addr);
+
+       /* Should never get here */
+       BUG();
 }
 
 /*