@@ -30,14 +30,6 @@
* flat identity mapping.
*/
ENTRY(__cpu_soft_restart)
- /* Clear sctlr_el1 flags. */
- mrs x12, sctlr_el1
- ldr x13, =SCTLR_ELx_FLAGS
- bic x12, x12, x13
- pre_disable_mmu_workaround
- msr sctlr_el1, x12
- isb
-
cbz x0, 1f // el2_switch?
mov x0, #HVC_SOFT_RESTART
hvc #0 // no return
@@ -36,18 +36,6 @@ ENTRY(arm64_relocate_new_kernel)
mov x14, xzr /* x14 = entry ptr */
mov x13, xzr /* x13 = copy dest */
- /* Clear the sctlr_el2 flags. */
- mrs x0, CurrentEL
- cmp x0, #CurrentEL_EL2
- b.ne 1f
- mrs x0, sctlr_el2
- ldr x1, =SCTLR_ELx_FLAGS
- bic x0, x0, x1
- pre_disable_mmu_workaround
- msr sctlr_el2, x0
- isb
-1:
-
/* Check if the new image needs relocation. */
tbnz x16, IND_DONE_BIT, .Ldone
@@ -63,10 +51,10 @@ ENTRY(arm64_relocate_new_kernel)
add x20, x0, #PAGE_SIZE
sub x1, x15, #1
bic x0, x0, x1
-2: dc ivac, x0
+1: dc ivac, x0
add x0, x0, x15
cmp x0, x20
- b.lo 2b
+ b.lo 1b
dsb sy
mov x20, x13
@@ -104,6 +92,26 @@ ENTRY(arm64_relocate_new_kernel)
dsb nsh
isb
+ /* Clear sctlr_el1 flags. */
+ mrs x12, sctlr_el1
+ ldr x13, =SCTLR_ELx_FLAGS
+ bic x12, x12, x13
+ pre_disable_mmu_workaround
+ msr sctlr_el1, x12
+ isb
+
+ /* Clear the sctlr_el2 flags. */
+ mrs x0, CurrentEL
+ cmp x0, #CurrentEL_EL2
+ b.ne 2f
+ mrs x0, sctlr_el2
+ ldr x1, =SCTLR_ELx_FLAGS
+ bic x0, x0, x1
+ pre_disable_mmu_workaround
+ msr sctlr_el2, x0
+ isb
+2:
+
/* Start new image. */
mov x0, x18
mov x1, xzr
It is inefficient to do kernel relocation with MMU disabled. This is because if MMU is disabled, dcache must also be disabled. Now, that we have identity page table we can disable MMU after relocation is completed. Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com> --- arch/arm64/kernel/cpu-reset.S | 8 ------- arch/arm64/kernel/relocate_kernel.S | 36 ++++++++++++++++++----------- 2 files changed, 22 insertions(+), 22 deletions(-)